Docker - compose czyli czas ułatwić sobie życie

Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 820 razy

Z pewnością zauważyć można było, że to całe ręczne wpisywanie poleceń, ta cała konfiguracja w jednej linii to nie jest takie przyjazne i przejrzyste rozwiązanie. Gdyby istniał jakiś sprytny (żeby nie powiedzieć przebiegły) sposób na zapisanie tej całej konfiguracji! I w rzeczy samej takie rozwiązanie istnieje, albowiem okazuje się, że odpowiedzią na te wszystkie problemy jest docker-compose.

W celu skorzystania z tego jakże zacnego narzędzia konieczne jest stworzenie pliku konfiguracyjnego .yaml lub jak kto woli .yml. Dla przykładu, który już wałkujemy od jakiegoś czasu można użyć następującego pliku .yaml:

version: "3.8" services: mongodb: image: mongo environment: MONGO_INITDB_ROOT_USERNAME: AzureDiamond MONGO_INITDB_ROOT_PASSWORD: hunter2 volumes: - mongo-wishes:/data/db nodewishes: build: ./ ports: - 8889:8888 environment: USER: AzureDiamond PASSWORD: hunter2 volumes: - ./:/app depends_on: - mongodb volumes: mongo-wishes:

Pierwsza ważna i podstawowa informacja na temat formatowania w plikach .yaml jest taka, że wcięcia w postaci dwóch spacji określają strukturę zagnieżdżenia (podobnie jak Python-ie).

Pierwsza linijka jest wymagana i określa wersję używanego formatu pliku. O tym można a nawet i trzeba poczytać na stronie docs.docker.com/compose/compose-file/compose-versioning/.

Wpis services to sekcja, gdzie opisuje się konfigurację kontenerów. Pierwszy kontener to baza danych, która korzysta z obrazu mongo. Są tutaj zmienne środowiskowe opisane w sekcji environment. Są również opcje związane z volume-nami. I tu ważna uwaga, nazwane volume-ny wymagają dodatkowego wpisu na końcu, który pozwala na komunikację z nimi przez inne kontenery.

Można by rzec, że to już wszystko jeżeli chodzi o kontener bazy danych. Ale, no właśnie, ale gdzie jest konfiguracja sieci network? Czy żeśmy nie zapomnieli czasem o niej? No i co z opcją --rm i -d? Jeżeli chodzi o pierwszy problem z siecią to spokojna twoja rozczochrana! Nie musisz się tym kłopotać, albowiem docker-compose zajmie się tym i utworzy samodzielnie taką sieć i podepnie ją pod wszystkie utworzone za pośrednictwem pliku konfiguracyjnego kontenery. Z kolei jeżeli chodzi o opcję --rm to również docker-compose rozwiąże ten problem za ciebie. Ostatnia opcja -d musi być użyta niestety przy starcie (o czym opowiem po przebrnięciu przez opis ostatniego kontenera z pliku konfiguracyjnego yaml.

No cóż, pozostał już tylko kontener z sekcji nodewishes, który wymaga zbudowania obrazu z pliku dockerfile. W tym przypadku plik ów leży w tym samym folderze co plik yaml więc opcja build: ./ wskazuje na lokalizację tegoż pliku. W przypadku tego kontenera chcę również ustawić porty korzystając z opcji ports. Zmienne nie muszę chyba już opisywać, zaś w sekcji konfiguracji volume-nu użyte zostało bindowanie w celu przeładowania gdy kod projektu ulegnie zmianie. Ostatnia bardzo ważna opcja to depends-on. Opisuje ona zależność kontenera od istnienia innych kontenerów.

Dobra, koniec gadania o konfiguracji czas uruchomić ten projekt i zobaczyć, jak to działa! Tak oto uruchamia się wszystko na raz:

docker-compose up -d
Creating network "serwer-docker_default" with the default driver
Building nodewishes
[+] Building 8.9s (12/12) FINISHED
 => [internal] load build definition from Dockerfile                                                                                                                                                      0.0s 
 => => transferring dockerfile: 32B                                                                                                                                                                       0.0s 
 => [internal] load .dockerignore                                                                                                                                                                         0.0s 
 => => transferring context: 34B                                                                                                                                                                          0.0s 
 => [internal] load metadata for docker.io/library/node:14                                                                                                                                                0.0s 
 => [1/7] FROM docker.io/library/node:14                                                                                                                                                                  0.0s 
 => [internal] load build context                                                                                                                                                                         0.0s 
 => => transferring context: 1.39kB                                                                                                                                                                       0.0s 
 => CACHED [2/7] RUN apt-get update --fix-missing                                                                                                                                                         0.0s 
 => CACHED [3/7] RUN apt-get install mc -y                                                                                                                                                                0.0s 
 => CACHED [4/7] RUN apt-get install nano -y                                                                                                                                                              0.0s 
 => CACHED [5/7] WORKDIR /app                                                                                                                                                                             0.0s 
 => [6/7] COPY / ./                                                                                                                                                                                       0.0s 
 => [7/7] RUN npm install                                                                                                                                                                                 8.5s 
 => exporting to image                                                                                                                                                                                    0.3s 
 => => exporting layers                                                                                                                                                                                   0.3s 
 => => writing image sha256:dd67f024bb559d3b5ba03999def6821d2511a26cba6ec87145562fbe37a9a7fc                                                                                                              0.0s 
 => => naming to docker.io/library/serwer-docker_nodewishes                                                                                                                                               0.0s 

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
Creating serwer-docker_mongodb_1 ... done
Creating serwer-docker_nodewishes_1 ... done

Sprawdźmy jeszcze, czy aby na pewno działa:

Docker - mongodb  sprawdzanie, czy działa za pomocą Postmana
Rys. 1
Docker - MongoDb sprawdzanie, czy działa za pomocą Postman-a

No dobra, wygląda na to, że działa. Ale jak zakończyć żywot tego tworu! Odpowiedź jest prostsza aniżeli odebranie dzieciakowi lizaka. Tak się bowiem składa, że wystarczy użyć polecenie:

docker-compose down
Stopping serwer-docker_nodewishes_1 ... done
Stopping serwer-docker_mongodb_1    ... done
Removing serwer-docker_nodewishes_1 ... done
Removing serwer-docker_mongodb_1    ... done
Removing network serwer-docker_default
Propozycje książek