Karta ściągawki Docker Compose — najprzydatniejsze polecenia z przykładami
P.S. docker-compose różni się od docker compose...
Oto notatka z Docker Compose z opisami przykładów, aby szybko opanować pliki i polecenia Compose.
Ten przewodnik jest częścią Narzędzia deweloperskie: Kompletny przewodnik po współczesnych workflow programistycznych.
Wymagania wstępne
Docker Engine musi być zainstalowany, zanim zaczniesz używać Compose. Na systemie Ubuntu, postępuj zgodnie z instrukcją Instalacja Dokera na Ubuntu, aby wybrać odpowiednią metodę instalacji i skonfigurować wtyczkę docker compose.

Referencja do pliku Compose: docker-compose.yml
Struktura główna:
version: '3' # Compose file format version
services:
web:
image: nginx:latest
ports:
- "8080:80" # Host port 8080:Container port 80
db:
image: postgres
environment: # Environment variables
POSTGRES_PASSWORD: example
volumes:
- db_data:/var/lib/postgresql/data
networks: # Custom network
appnet:
driver: bridge
volumes: # Named volume
db_data:
- services: Każdy kontener w aplikacji wielokontenerowej. W powyższym przykładzie mamy dwie usługi:
webidb. W celu wykonania pojedynczych operacji na kontenerach, zobacz Notatkę z Dokera. - networks & volumes: Definiują izolowane sieci i trwałe przechowywanie danych - tutaj mamy sieć
appneti wolumendb_data.
Przykłady
Pojedyncza usługa z mapowaniem portów
services:
app:
build: .
ports:
- "8000:80" # Host port 8000:Container port 80
Eksponuje aplikację na porcie 8000 hosta i buduje ją na podstawie pliku Dockerfile w bieżącym katalogu.
Wielu serwisów z wspólnym wolumenem i niestandardową siecią
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- type: bind
source: ./app
target: /app
networks:
- mynet
db:
image: postgres
volumes:
- db_data:/var/lib/postgresql/data
networks:
- mynet
networks:
mynet:
volumes:
db_data:
Web i DB w tej samej sieci; DB używa trwałego nazwanego wolumenu - db_data.
Używanie kontekstu budowania i ścieżki do pliku Dockerfile
Możesz zbudować obraz Dokera na żądanie z pliku Dockerfile podanego w pliku docker-compose.yml.
services:
app:
build:
context: .
dockerfile: docker/MyDockerfile
Udostępnianie danych między usługami
services:
web:
image: nginx
volumes:
- shared_data:/usr/share/nginx/html
worker:
image: myworker
volumes:
- shared_data:/usr/src/app/data
volumes:
shared_data:
Obie usługi uzyskują dostęp do tego samego wolumenu (dla plików statycznych lub wymiany danych) - shared_data.
Zaawansowane opcje pliku Compose
- environment: Ustawia zmienne środowiskowe dla kontenerów.
- depends_on: Kontroluje kolejność uruchamiania usług.
- deploy.replicas: Skaluje usługę w trybie Swarm.
Przykład:
services:
web:
image: nginx
deploy:
replicas: 3
depends_on:
- db
Uruchamia 3 instancje web; kontroluje tylko kolejność uruchamiania (nie gotowości).
Niezbędne polecenia Docker Compose
| Polecenie | Opis | Przykład użycia |
|---|---|---|
docker-compose up |
Tworzy i uruchamia kontenery | docker-compose up |
docker-compose up -d |
Uruchamia w tle | docker-compose up -d |
docker-compose exec |
Wykonuje polecenie w uruchomionym kontenerze | docker-compose exec web bash |
docker-compose build |
Buduje/przebudowuje obrazy | docker-compose build |
docker-compose down |
Zatrzymuje i usuwa kontenery, sieci, wolumeny i obrazy | docker-compose down |
docker-compose logs -f |
Wyświetla i śledzi logi | docker-compose logs -f |
docker-compose ps |
Wyświetla listę uruchomionych kontenerów | docker-compose ps |
docker-compose run |
Wykonuje jednorazowe polecenia (pomija polecenie z pliku Compose) | docker-compose run web python manage.py migrate |
docker-compose stop |
Zatrzymuje uruchomione kontenery (można wznowić przez start) |
docker-compose stop |
docker-compose restart |
Restartuje usługi | docker-compose restart web |
docker-compose pull |
Pobiera obrazy usług | docker-compose pull |
docker-compose rm |
Usuwa zatrzymane kontenery usług | docker-compose rm web |
docker-compose config |
Waliduje i wyświetla plik Compose | docker-compose config |
docker-compose up --scale web=3 |
Uruchamia wiele instancji usługi | docker-compose up --scale web=3 |
Częste wzorce Compose
-
Bazy danych z trwałymi danymi
services: mysql: image: mysql environment: MYSQL_ROOT_PASSWORD: password volumes: - mysql_data:/var/lib/mysql volumes: mysql_data:Dane DB są przechowywane w wolumenie
mysql_datai przetrwają ponowne uruchomienie kontenera. -
Bind montowanie kodu w celu rozwoju
services: app: build: . volumes: - .:/appEdytuj kod na żywo na hoście, zmiany są automatycznie odbite w kontenerze.
Przydatne flagi
-d: Tryb odłączony (uruchamianie w tle).--build: Wymusza przebudowanie obrazów przed uruchomieniem.--force-recreate: Odtwarza kontenery nawet jeśli nie zostały zmienione.--remove-orphans: Usuwa kontenery niezdefiniowane w pliku Compose.
Definiowanie i dostosowywanie usług
Możesz zdefiniować i dostosować usługi, sieci i wolumeny w Docker Compose, wykorzystując plik docker-compose.yml, który centralizuje wszystkie potrzeby konfiguracji i orkiestracji Twojej aplikacji.
- Usługi są zdefiniowane pod kluczem
services. - Każda usługa reprezentuje konfigurację kontenera, w której można ustawić:
- Image: Wybierz obraz z Docker Hub lub innego rejestru.
- Ports: Zmapuj porty kontenera na porty hosta.
- Environment variables: Przekaż wartości konfiguracyjne.
- Volumes: Zachowuj dane lub udostępniaj pliki/katalogi hostowi lub innym usługom.
- Networks: Kontroluj, do których sieci usługa może uzyskać dostęp.
Przykład:
services:
web:
image: nginx:latest
ports:
- "8080:80" # Host port 8080:Container port 80
environment:
- NGINX_HOST=localhost
volumes:
- web_data:/usr/share/nginx/html
networks:
- frontend
db:
image: postgres:13
environment:
POSTGRES_USER: admin
POSTGRES_PASSWORD: secret
volumes:
- db_data:/var/lib/postgresql/data
networks:
- backend
- Tutaj usługa
webużywa obrazu nginx, ustawia zmienną środowiskową, podłącza wolumen, otwiera port 80 jako 8080 na hoście i łączy się z sieciąfrontend. Usługadbrobi coś podobnego dla PostgreSQL.
Dostosowywanie sieci
- Sieci kontrolują, które usługi mogą ze sobą komunikować. Compose tworzy domyślną sieć, ale możesz zdefiniować więcej, specyfikować niestandardowych sterowników, ustawiać opcje i określać, która usługa dołącza do której sieci, aby uzyskać precyzyjną izolację.
- Zdefiniuj sieci na najwyższym poziomie pod kluczem
networksi wyszczególnij, do których sieci usługa powinna się podłączyć, używając kluczanetworksna poziomie usługi.
Przykład:
networks:
frontend:
driver: bridge
backend:
driver: bridge
driver_opts:
com.docker.network.bridge.host_binding_ipv4: "127.0.0.1"
- Podłącz sieci do usług:
services:
app:
networks:
- frontend
- backend
db:
networks:
- backend
- Ta konfiguracja pozwala usłudze
appuzyskać dostęp do użytkowników w sieciachfrontendibackend, podczas gdydbjest dostępny tylko wewnątrzbackend.
Dostosowywanie wolumenów
- Wolumeny są zdefiniowane pod kluczowym poziomem najwyższym
volumes. Podłączaj je do kontenerów, używając kluczavolumespod daną usługą. - Wolumeny mogą być nazwane, używać niestandardowych sterowników i być udostępniane między wieloma usługami w celu utrwalania i współdzielenia danych.
Przykład:
volumes:
web_data: # Named volume for web content
db_data: # Named volume for database
services:
web:
volumes:
- web_data:/usr/share/nginx/html
db:
volumes:
- db_data:/var/lib/postgresql/data
- W tym przykładzie
web_datajest utrwalane i dostępne dla każdego kontenera, który je zamontuje.db_datazapewnia, że dane bazy danych nie zostaną utracone przy odtworzeniu kontenera. - Możesz zdefiniować bind-mounty z niestandardowymi opcjami sterownika dla zaawansowanych przypadków:
volumes:
db_data:
driver: local
driver_opts:
type: none
device: /data/db_data
o: bind
- Ta konfiguracja ustawia bind-montowanie ze ścieżki hosta
/data/db_datado kontenera.
Podsumowanie dobrych praktyk:
- Używaj nazwy usługi jako nazwy hosta DNS do komunikacji międzyusługowej.
- Podłączaj usługi do wielu sieci w razie potrzeby, aby kontrolować dostęp.
- Używaj nazwanych wolumenów do trwałego przechowywania danych i współdzielenia danych.
- Definiuj wszystko przy użyciu YAML, umożliwiając kontrolę wersji i łatwe skrypty wdrożeniowe.
- W celu zarządzania i wizualizacji kontenerów, rozważ Instalację Portainera na Linuxie.
Wiele plików compose
Aby zorganizować złożone konfiguracje wielu serwisów w Docker Compose, możesz użyć wielu plików compose i plików nadpisywania (override), umożliwiając modularne, specyficzne dla środowiska i skalowalne konfiguracje. Oto jak to działa:
- Struktura pliku bazowego i nadpisywania
- Utwórz plik bazowy (
compose.yamllubdocker-compose.yml) zawierający wszystkie wspólne, domyślne definicje usług. - Dodaj pliki nadpisywania specyficzne dla środowiska (np.
docker-compose.override.yml,docker-compose.dev.yml,docker-compose.prod.yml).
Przykładowa struktura plików:
/project-directory
|-- docker-compose.yml # Base configuration
|-- docker-compose.override.yml # Local/dev overrides (applied automatically)
|-- docker-compose.prod.yml # Production overrides
|-- docker-compose.test.yml # Test overrides (if needed)
Konfiguracja bazowa definiuje kluczowe usługi, podczas gdy każdy plik nadpisywania dostosowuje ustawienia dla konkretnego środowiska lub przypadku.
- Jak działają nadpisywania plików
- Łączenie: Gdy wykonujesz
docker compose up, Docker Compose łączy plik bazowy z jakimikolwiek nadpisaniami w kolejności; kolejne pliki nadpisują, rozszerzają lub dodają ustawienia z poprzednich plików. - Nadpisywanie pól: Jeśli usługa lub pole są zdefiniowane w wielu plikach, używana jest wartość z pliku określonego jako ostatni. Nowe pola są dodawane.
Przykład łączenia:
docker-compose.yml:services: web: image: myapp ports: - "8000:80"docker-compose.override.yml:services: web: environment: - DEBUG=true- Wynik: Usługa
webużywa zarówno bazowego obrazu i portu, jak i nadpisanej zmiennej środowiskowejDEBUG.
- Użycie poleceń dla wielu plików
- Domyślne zachowanie: Jeśli istnieje, Docker Compose automatycznie ładuje
docker-compose.override.ymlwraz zdocker-compose.ymlprzy wykonywaniu dowolnego polecenia. - Ręczne specyfikowanie plików: Używaj flag
-f, aby kontrolować, które pliki są łączone i w jakiej kolejności:docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d- To ignoruje domyślne nadpisanie i używa ustawień specyficznych dla produkcji.
- Praktyczne strategie organizacji
- Separacja środowisk: Używaj jednego pliku nadpisania na środowisko: dev, test, prod itp.
- Mikrousługi i zespoły: Podziel konfigurację na osobne pliki dla różnych usług lub zespołów i łącz je w razie potrzeby.
- Przełączniki funkcji: Dodatkowe pliki mogą wprowadzać lub usuwać opcjonalne usługi lub konfiguracje na czasowe potrzeby (np.
compose.debug.ymldla dodatkowego logowania).
- Korzyści
- Przejrzystość: Zachowuje poszczególne pliki małe i skupione na temacie.
- Skalowalność: Łatwo dodawaj nowe usługi, środowiska lub ustawienia.
- Łatwość utrzymania: Zmieniaj lub przeglądaj tylko związane sekcje dla danego wdrożenia.
- Przykład: Przełączanie środowisk
Rozwój:
docker compose -f docker-compose.yml -f docker-compose.dev.yml up
Produkcja:
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
Każde środowisko otrzymuje tylko konfigurowanie niezbędne dla niego, ze wspólną konfiguracją w pliku bazowym.
Organizowanie złożonych konfiguracji Compose za pomocą wielu plików - i wykorzystywanie systemu nadpisywania/łączenia - zapewnia modularność, specyficzne dla środowiska dostosowanie i łatwą skalowalność dla dużych, wielusługowych aplikacji Docker.
Dla wdrożenia produkcyjnego na pojedynczym hoście Linux — uruchamianie przy starcie, czyste wyłączenie, aktualizacje i rotacja logów — zobacz Uruchamianie Docker Compose jako usługi Linux z systemd. Dla porównania z Podman Quadlet, zobacz Podman Quadlet vs Docker Compose dla usług Linux.