Docker Compose to super narzędzie, jeśli nasze konfiguracje kontenerów zaczynają się rozrastać.
Jeśli chcemy aby nasz kontener był uruchomiony w danej sieci, był podpięty pod wolumeny to całe polecenie zaczyna się rozrastać. Najgorsze jest to, że trzeba takie komendy gdzie trzymać…
I tutaj z pomocą przychodzi Docker Compose jako sposób na przechowywanie całej tej konfiguracji.
Konfiguracja
Konfiguracja jest przechowywana w plikach yaml (lub skróconej wersji yml). Przykładowo docker-compose.yaml lub docker-compose.yml.
Określanie wersji składni
Na początku należy zdefiniować wersję składni, której będziemy używać przy definicji. Dostępne wersje można sprawdzić tutaj:
version: '3.8'
Definiujemy kontenery (serwisy)
Aby rozpocząć definicję kontenera (serwisu) należy wpisać nazwę serwisu w sekcji services:
version: '3.8'
services:
backend:
...
frontend:
...
Obraz dla kontenera
Aby zdefiniować obraz dla kontenera można skorzystać z trzech opcji:
-wprowadzić nazwę obrazu (opcja image):
version: '3.8'
services:
backend:
image: node
-wprowadzić ścieżkę do pliku Dockerfile (opcja build):
version: '3.8'
services:
backend:
build: ./backend/Dockerfile
-szersza konfiguracja (rozszerzona opcja build):
version: '3.8'
services:
backend:
build:
dockerfile: Dockerfile
context: ./backend/
args:
NETWORK_NAME: network_name
dockerfile to ścieżka do pliku, context to kontekst wykonania pliku Dockerfile (warto tutaj zaznaczyć, że czasami nie jest to ten sam katalog, w którym znajduje się plik Dockerfile). Opcja args to odpowiednik opcji ARG w Dockerfile. Pełna specyfikacja sekcji build.
Definicja wolumenów
Wolumeny definiujemy w sekcji volumes (na tym samym poziomie wcięcia co services):
version: '3.8'
services:
backend:
...
volumes:
db_volume:
Dzięki czemu możemy ich później użyć w sekcji build:
version: '3.8'
services:
backend:
build:
...
volumes:
db_volume:/data-db/
volumes:
db_volume:
Możliwe jest też podpięcie lokalnego katalogu (bind mounts):
version: '3.8'
services:
backend:
build:
...
volumes:
/some/local/path:/some/container/path/
Zmienne środowiskowe
Zmienne środowiskowe można przekazać bezpośrednio:
version: '3.8'
services:
backend:
build:
...
environment:
- LOGIN=LOGIN
- PASSWORD=PASSWORD
Lub też za pomocą wskazania na plik:
version: '3.8'
services:
backend:
build:
...
env_file:
- ./backend/.env
Wskazanie „otwartych” portów
Docker Compose wspiera także możliwość „otwarcia” portów (pierwszy port to host a drugi to port kontenera):
version: '3.8'
services:
backend:
build:
...
ports:
- 3456:80
Zależności pomiędzy serwisami
Możliwe jest także zdefiniowanie zależności od innych kontenerów – czyli wymuszenie kolejności poprzez użycie depends_on:
version: '3.8'
services:
db:
...
backend:
depends_on:db
Dzięki temu mamy pewność, że serwis backend zostanie uruchomiony dopiero po uruchomieniu serwisu db.
Kwestia sieci
Dostęp do Internetu
Kontenery powstające za pomocą narzędzie Docker Compose, tak samo jak kontenery podnoszone za pomocą docker run, mają domyślnie dostęp do zasobów Internetowych.
Porozumiewanie pomiędzy kontenerami
Dzięki Docker Compose nie jest konieczne tworzenie specjalnej sieci aby kontenery mogły się ze sobą komunikować. Docker Compose tworzy automatycznie sieć pomiędzy kontenerami wchodzącymi w skład definicji Docker Compose (oczywiście możliwe jest przypisanie kontenerów do dodatkowych sieci ręcznie).
Aby odwołać się do jakiegoś kontenera, należy użyć nazwy serwisu lub też nazwy kontenera.
Dostęp do komputera hosta
Dostęp do komputera hosta odbywa się na identycznych zasadach jak przy docker run – należy użyć specjalnej nazwy – host.docker.internal.
Uruchomienie
Aby uruchomić zdefiniowane serwisy należy użyć komendy:
docker compose up
* warto tutaj wspomnieć, że aby komenda zadziałała to plik z konfiguracją musi mieć nazwę docker-compose.yml lub docker-compose.yaml. Docker domyślnie szuka takich właśnie plików w aktualnym katalogu.
Aby zatrzymać serwisy:
docker compose down
Aby móc w jednym oknie terminala uruchomić serwisy i móc później je zatrzymać można użyć opcji -d (detached mode):
docker compose up -d
docker compose down