Docker Compose,
czyli podstawy YAML'a

Docker Compose w kilku prostych krokach

Docker <span class='purple'>Compose</span>, <br/>czyli podstawy <span class='purple'>YAML'a</span>

Wprowadzenie do Docker Compose

Docker Compose to narzędzie, które umożliwia definiowanie i uruchamianie aplikacji wielokontenerowych za pomocą pliku YAML. W skrócie mówiąc, za pomocą jednego pliku jesteśmy w stanie uruchomić całe niezbędne środowisko do obsługi naszej aplikacji. W dzisiejszym przykładzie przejdziemy przez proces uruchamiania najbardziej popularnego CMS'a na świecie jakim jest Wordpres.

Zapewne zadajesz sobie pytanie dlaczego musimy użyć Docker Compose, a nie tylko podstawowej komendy Docker?

Odpowiedź na to pytanie jest prostsza niż Ci się wydaje. W celu urchomienia jakiejkolwiek aplikacji Wordpress konieczne jest posiadanie zarówno Panelu CMS Wordpres jak i bazy danych MySql. W przypadku podstawowej komendy Docker konieczne byłoby osobne uruchomienie panelu CMS oraz bazy MySql. Dzięki Docker Compose za pomocą jednej komendy będziemy w stanie w szybki sposób uruchomić całą aplikację Wordpress, niezależnie od systemu Hosta.

1. Co to jest Docker Compose?

Docker Compose to narzędzie, które pozwala na uruchamianie aplikacji składających się z wielu kontenerów Docker. Umożliwia definiowanie usług, sieci i wolumenów w pliku YAML, co upraszcza zarządzanie i uruchamianie skomplikowanych aplikacji. Dzięki Docker Compose możemy w łatwy sposób zdefiniować, uruchomić i zarządzać środowiskami testowymi i produkcyjnymi.

Docker Compose jest podstawowym narzędziem o charakterze zarówno produkcyjnym jak i testowym, jednakże nie jest tak zaawansowane jak np. Docker Swarm lub Kubernetes. Mimowszystko, jego znajomość jest konieczna w celu dalszego kompleksowego poznawania środowisk kontenerowych.

2. Co to jest YAML?

YAML jest formatem plików tekstowych, który jest łatwy do pisania oraz czytania. Jest często używany do konfiguracji aplikacji, ze względu na swoją prostotę. Pliki YAML składają się z kluczy i wartości, które są zorganizowane w strukturę hierarchiczną. Możesz postrzegać go jako pliki typu JSON, tylko takie na sterydach.

W zależności od programu interpretacyjnego struktura pliku YAML może się różnić, jednakże ogólne założenia pozostają zawsze takie same. Cała różnica bedzie opierać się jedynie na wykorzystaniu innych poleceń.

Co znaczy, że YAML jest Indent Sensitive?

YAML podobnie jak np. Python jest bardzo wyczulony na wszelkiego rodzaju znaki białe (np. spacja, tab). Niepoprawne stosowanie spacji oraz tabulatorów sprawi, że plik nie będzie mógł zostać poprawnie odczytany. Zwróć uwagę na strukturę wcięć w poniższym przykładzie.

Przykładowy plik YAML - Docker Compose

version: '3.8'services: app:  image: my_app_image  ports:   - "8080:80"  environment:   - APP_ENV=production

Docker Compose - Przykład

Zanim rozpoczniesz...

Niniejszy tutorial zaprezentuje Ci podstawowy przykład konfiguracji pliku docker-compose.yaml, w którym to skonfigurujemy Wordpress wraz z bazą danych MySql. Pamiętaj że musisz posiadać zainstalowany i uruchomiony Docker Engine.

Kontenery możesz uruchomić zarówno na swojej maszynie lokalnej, maszynie wirtualnej lub na VPS. Jeśli zdecydujesz się na ostatnią opcję(tzn. VPS) konieczne będzie zastosowanie tunelowania SSH w celu uzyskania dostępu do kontenera przez przeglądarkę internetową. Tunelowanie w takim wypadku będzie konieczne z uwagi na fakt, że nie bedziemy jeszcze na tym etapie podpinać domeny pod nasz kontener.

Jak dokonać tunelowania SSH?

Tunelowanie poprzez SSH pozwala nam na przekierowanie ruchu z naszego lokalnego portu na docelowy port na naszym serwerze VPS. W celu dokonania takiej czynności wykonaj następującą komendę:

Składnia:
ssh -N -p 22 {user}@{vps_ip} -L {local_port}:{vps_internal_ip}:{vps_internal_port}

Dla przykładu:
ssh -N -p 22 noob@123.123.12.12 -L 8080:127.0.0.1:8080

Powyższa komenda spróbuje dokonać łączenia za pomocą SSH do użytkownika 'noob' pod adresem '123.123.12.12' a nastepnie dokona przekierowania ruchu z Twojego lokalnego portu 8080 na wewnętrzny adres Twojego VPS 127.0.0.1:8080.

Tym sposobem bedziesz w stanie ze swojej lokalnej przeglądarki internetowej połączyć sie z Twoim kontenerem.
Jeśli powyższe informacje na ten moment są dla Ciebie zbyt skomplikowane, uruchom Docker Compose na swoim lokalnym komputerze.

1.Jak uruchomić Wordpress z MySQL za pomocą Docker Compose?

W pierwszej kolejności przejdź do katalogu docelowego w którym zamierzasz utwożyć plik docker-compose.yaml.

Utwórz plik w docelowym katalogu

touch docker-compose.yaml

Uzupełnij plik w następujący sposób

version: '3.8'services: wordpress:  image: wordpress:latest  ports:   - "8080:80"  environment:   WORDPRESS_DB_HOST: db   WORDPRESS_DB_USER: wordpress   WORDPRESS_DB_PASSWORD: wordpress   WORDPRESS_DB_NAME: wordpress  volumes:   - wordpress_data:/var/www/html db:  image: mysql:5.7  environment:   MYSQL_ROOT_PASSWORD: rootpassword   MYSQL_DATABASE: wordpress   MYSQL_USER: wordpress   MYSQL_PASSWORD: wordpress  volumes:   - db_data:/var/lib/mysqlvolumes: wordpress_data: db_data:

2. Wyjaśnienie pliku docker-compose.yaml dla Wordpress + MySQL

Przepisująć zawartość powyższego pliku pewnie łapałeś się za głowę i pytałeś siebie samego "o co tu chodzi?". Na pierwszy rzut oka struktura powyższego pliku docker-compose.yaml może wydawać się zawiła i niezrozumiała, jednakże już zachwilę wyjasnimy kod linijka po linijce.

Sekcja "version"
Określa wersję składni z której korzystać będzie Docker Compose. W tym przypadku używamy wersji '3.8'. Zawsze używaj najnowszej wersji, chyba że dany projekt wymaga użycia starszej. Na ten moment możliwe jest również pominięcie tej informacji w pliku co będzie skutować autoamtycznie wykorzystaniem najnowszej wersji Docker Compose.

Sekcja "services"
Definiuje dwa serwisy (kontenery): "wordpress" oraz "db" (możesz użyć dowolnych nazw, byleby były one unikalne)


  1. Kontener Wordpress
    • "image" - Używamy oficjalnej najnowszej wersji obrazu WordPress
    • "ports" - Przekierowujemy port 8080 hosta na port 80 kontenera
    • "environment" - Definiujemy zmienne środowiskowe dla kontenera WordPress
    • "volumes" - Tworzymy wolument "wordpress_data" do przechowywanie danych WordPress
  2. Kontener DB
    • "image" - Używamy oficjalnego obrazu MySQL w wersji 5.7
    • "environment" - Definiujemy zmienne środowiskowe dla kontenera hostującego bazę MySQL
    • "volumes" - Tworzymy wolument "db_data" do przechowywanie danych MySQL

Sekcja "volumes"
Definiuje wolumeny używane przez oba nasze kontenery/serwisy.

Dlaczego używamy Volumenów?

Jeśli dokładnie przeczytałeś poprzednią lekcję z serii kursu "Kurs DevOps dla Juniorów" to na pewno utkiwł Ci w pamięci fakt, że kontenery Dockera z natury są niczym protokół HTTP, czyli "stateless".

Co to oznacza w praktyce?

Oznacza to, że dany kontener będzie przechowywał w sobie dane informacje tak długo póki nie zostanie usunięty lub upgradeowany do wyższej wersji obrazu. W przypadku wykorzystania technologii Wordpress z bazą MySQL jest to sytuacja nie do zaakceptowania!

Poprzez utworzenie Volumenów pozwalamy naszym kontenerom Docker na zapisywanie danych na systemie hosta, a nie w pamięci RAM. Dzięki temu zabiegowi Twoje dane nie zostaną utracone po ponownym deploymencie obrazu.

Gdybyś zapomniał dokonać tego zabiegu, wszelkie konfiguracje dokonane w Wordpresie, takie jak tworzenie stron, aktualizacje, itp. byłyby nietrwałe.

Nie podawaj wrażliwych danych w plikach Compose !

W powyższym przykładzie wrażliwe informacje takie jak dane logowania do MySQL zostały zapisane bezpośrednio w pliku docker-compose.yaml w celu klaryfikacji przykładu.

Podejście takie jest NIEAKCEPTOWALNE, w środowisku produkcyjnym wykorzystaj np. Docker Secrets.

3. Jak uruchomić/zatrzymać kontenery za pomocą Docker Compose?

W celu uruchomienia/zatrzymania kontenerów konieczne jest przejscie w terminalu do folderu w którym składowany jest nasz plik docker-compose.yaml.

W celu uruchomienia kontenerów z pliku docker-compose.yaml wykonaj komendę (deatached mode)

docker compose up -d

Upewnij się, ze Twoje kontenery funkcjonują poprawnie

docker ps

Jeśli wszystko przebiegło pomyślnie powinieneś być w stanie uruchomić panel administracyjny Wordpress ze swojej przeglądarki internetowej. W tym celu przejdz pod adres http://localhost:8080.

W celu zatrzymania kontenerów z pliku docker-compose.yaml wykonaj komendę (deatached mode)

docker compose down

Docker Compose - Przykład

Dobra robota !

Gratulacje, udało Ci się uruchomić swój pierwszy pełnowartościowy klaster kontenerów Docker. Jak widzisz, na powyższym przykładzie nie jest to wcale takie trudne jakby się mogło wydawać. W tym momencie wystarczy tylko przenieść powyższy plik docker-compose.yaml na inny serwer lub maszynę aby móc cieszyć się nową instancją aplikacji Wordpress ze skonfigurowaną bazą MySQL. Nie ma konieczności samodzielnego pobierania plików Wordpress, tudzież samodzielnego konfigurowania bazy danych MySQL. Wszystko jest robione w "locie" przez Docker Compose.

Pomimo faktu, iż w tym momencie możesz czuć się dumny/dumna, z faktu, że udało Ci się samodzielnie uruchomić swój pierwszy system nie możesz osiąść na laurach. Wordpress jest najpopularniejszym systemem CMS na świecie co niesie ze sobą zarówno plusy jak i minusy. Wystawienie kontenera w świat w takim stanie w jakim się on teraz znajduje może okazać się zaproszeniem hakera na nasz serwer, z uwagi na niezliczoną ilość złośliwych crawlerów poszukujących niezabezpieczonych instancji Wordpress. W kolejnych lekcjach dogłębniej przyjżym się temu problemowi i zanim wystawimy naszą aplikację w świat wykrozystamy podstawowy WAF (Web Application Firewall), jakim jest Modsecurity.