3.1 Plik compose.yaml
Plik compose.yaml
(lub jedna z następujących opcji: docker-compose.yaml
, docker-compose.yml
, compose.yml
) — to podstawowy plik konfiguracji używany przez Docker Compose do definiowania i zarządzania aplikacjami wielokontenerowymi. Określa, które kontenery (usługi) powinny być uruchomione, jak się komunikują między sobą i jakie zasoby są im potrzebne.
Dla jednolitości w tym wykładzie będziemy używać wariantu compose.yaml
, ponieważ jest on zalecany dla nowszych wersji Docker Compose.
Struktura pliku compose.yaml
Plik compose.yaml
składa się z kilku sekcji, z których każda opisuje różne aspekty konfiguracji aplikacji. Główne sekcje obejmują:
- version: wskazuje wersję pliku Compose (na przykład
'3.9'
). - services: opisuje kontenery (usługi), ich ustawienia i zależności.
- volumes: definiuje wolumeny do przechowywania danych między kontenerami a hostem.
- networks: konfiguruje sieci, przez które usługi komunikują się między sobą.
3.2 Podstawowe dyrektywy
1. version
Dyrektywa version określa wersję składni Docker Compose używaną w pliku compose.yaml
. Na moment pisania tego artykułu najbardziej aktualna jest wersja 3, w szczególności jej aktualizacje, takie jak 3.8 i 3.9.
version: '3.9'
2. services
Sekcja services definiuje kontenery, które Compose powinien utworzyć i uruchomić. Każdy serwis to osobny kontener z określoną konfiguracją.
Przykład:
services:
web:
image: nginx:latest
ports:
- "80:80"
db:
image: mongo:latest
volumes:
- mongo-data:/data/db
W tym przykładzie zdefiniowano dwa serwisy: web
i db
. Serwis web
korzysta z obrazu nginx:latest
i otwiera port 80. Serwis db
korzysta z obrazu mongo:latest
i podłącza wolumen do przechowywania danych.
3. volumes
Sekcja volumes służy do definiowania wolumenów, które można podłączyć do kontenerów w celu przechowywania danych. Jest to przydatne do zachowania danych podczas ponownego uruchamiania kontenerów.
Przykład:
volumes:
mongo-data:
4. networks
Sekcja networks pozwala zdefiniować niestandardowe sieci, w których będą działać kontenery. Zapewnia to izolację i konfigurację połączeń sieciowych. Jeśli sieci nie są określone, Docker Compose utworzy domyślną sieć, a wszystkie serwisy zostaną do niej podłączone.
Przykład:
networks:
front-end:
back-end:
3.3 Dyrektywy do konfiguracji usług
Podstawowe dyrektywy do konfiguracji usług:
1. image
Dyrektywa image wskazuje obraz, który będzie używany do stworzenia kontenera.
Przykład:
services:
web:
image: nginx:latest
2. build
Dyrektywa build jest używana do wskazania ścieżki do Dockerfile, który ma być użyty do stworzenia obrazu.
Przykład:
services:
app:
build: ./app
3. ports
Dyrektywa ports określa porty, które mają być otwarte i przekierowane z maszyny hosta na kontener.
Przykład:
services:
web:
image: nginx:latest
ports:
- "80:80"
4. volumes
Dyrektywa volumes montuje woluminy w kontenerach, co pozwala na zachowanie danych pomiędzy restartami kontenerów.
Przykład:
services:
db:
image: mongo:latest
volumes:
- mongo-data:/data/db
5. environment
Dyrektywa environment ustala zmienne środowiskowe dla kontenera.
Przykład:
services:
app:
image: myapp:latest
environment:
- NODE_ENV=production
- API_KEY=1234567890
6. depends_on
Dyrektywa depends_on wskazuje, że dana usługa zależy od innych usług i powinna być uruchamiana po nich.
Ważne!
Przy uruchamianiu usługi nie ma 100% gwarancji, że wszystkie niezbędne do jej działania usługi są w pełni gotowe. Zostaną uruchomione — tak, ale dalsza funkcjonalność nie jest gwarantowana. Ten problem rozwiązuje się za pomocą health-check, ale o tym później.
Przykład:
services:
web:
image: nginx:latest
depends_on:
- db
db:
image: mongo:latest
7. command
Dyrektywa command pozwala nadpisać komendę, która zostanie wykonana przy uruchomieniu kontenera.
Przykład:
services:
app:
image: myapp:latest
command: python app.py
8. networks
Dyrektywa networks podłącza usługę do jednej lub kilku sieci.
Przykład:
services:
web:
image: nginx:latest
networks:
- front-end
db:
image: mongo:latest
networks:
- back-end
3.4 Pełny przykład
Przykład pełnego pliku compose.yaml
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- app
networks:
- front-end
app:
build: ./app
volumes:
- ./app:/usr/src/app
environment:
- NODE_ENV=production
networks:
- front-end
- back-end
db:
image: mongo:latest
volumes:
- mongo-data:/data/db
networks:
- back-end
volumes:
mongo-data:
networks:
front-end:
back-end:
W tym przykładzie:
- Zdefiniowane są trzy service'y:
web
,app
idb
. -
web
używa obrazu Nginx, montuje plik konfiguracyjny i zależy od service'uapp
. -
app
budowany jest z lokalnego Dockerfile, montuje kod źródłowy aplikacji i używa zmiennych środowiskowych. -
db
używa obrazu MongoDB i montuje volume do przechowywania danych. - Utworzono dwa volume'y i dwie sieci dla izolacji i zarządzania interakcjami service'ów.
Uwaga: jeden volume to mongo-data
, a drugi to zamontowany katalog z host-machine (np. ./app
).
GO TO FULL VERSION