Pojedynczy kontener to jak pojedynczy obóz legionowy. Ale prawdziwe Imperium potrzebuje sieci dróg łączących wiele obozów — API, bazę danych, cache, reverse proxy. Docker Compose to narzędzie, które pozwala zdefiniować i uruchomić wiele kontenerów jednocześnie.
Docker Compose używa pliku
docker-compose.yml w formacie YAML do definiowania usług (services), sieci (networks) i wolumenów (volumes). Jedną komendą uruchamiasz całą infrastrukturę.1# Podstawowa struktura docker-compose.yml
2version: '3.8'
3
4services:
5 api:
6 # Nasza aplikacja NestJS
7 mongodb:
8 # Baza danych MongoDB
9 redis:
10 # Cache Redis
11
12volumes:
13 # Trwałe dane
14
15networks:
16 # Sieci komunikacyjne1version: '3.8'
2
3services:
4 # ===========================================
5 # Serwis API — Główna Forteca (Praetorium)
6 # ===========================================
7 api:
8 build:
9 context: .
10 dockerfile: Dockerfile
11 target: production
12 container_name: roman-imperium-api
13 ports:
14 - '4000:4000'
15 environment:
16 - NODE_ENV=production
17 - DATABASE=mongodb://mongodb:27017/roman-imperium
18 - REDIS_HOST=redis
19 - REDIS_PORT=6379
20 - PORT=4000
21 depends_on:
22 mongodb:
23 condition: service_healthy
24 redis:
25 condition: service_started
26 networks:
27 - imperium-network
28 restart: unless-stopped
29 healthcheck:
30 test: ['CMD', 'curl', '-f', 'http://localhost:4000/health']
31 interval: 30s
32 timeout: 10s
33 retries: 3
34 start_period: 40s
35
36 # ===========================================
37 # MongoDB — Archiwum Imperium
38 # ===========================================
39 mongodb:
40 image: mongo:7.0
41 container_name: roman-imperium-db
42 ports:
43 - '27017:27017'
44 environment:
45 - MONGO_INITDB_ROOT_USERNAME=imperator
46 - MONGO_INITDB_ROOT_PASSWORD=roma_aeterna_2024
47 - MONGO_INITDB_DATABASE=roman-imperium
48 volumes:
49 - mongodb-data:/data/db
50 networks:
51 - imperium-network
52 restart: unless-stopped
53 healthcheck:
54 test: echo 'db.runCommand("ping").ok' | mongosh --quiet
55 interval: 10s
56 timeout: 5s
57 retries: 5
58
59 # ===========================================
60 # Redis — Szybki Goniec (Cursus Velox)
61 # ===========================================
62 redis:
63 image: redis:7-alpine
64 container_name: roman-imperium-cache
65 ports:
66 - '6379:6379'
67 command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru
68 volumes:
69 - redis-data:/data
70 networks:
71 - imperium-network
72 restart: unless-stopped
73
74# ===========================================
75# Wolumeny — Magazyny Imperium
76# ===========================================
77volumes:
78 mongodb-data:
79 driver: local
80 redis-data:
81 driver: local
82
83# ===========================================
84# Sieci — Drogi Imperium
85# ===========================================
86networks:
87 imperium-network:
88 driver: bridgeKażdy serwis to osobny kontener. Najważniejsze pola:
1const serviceFields = {
2 build: 'Budowanie z Dockerfile (lub image dla gotowych obrazów)',
3 ports: 'Mapowanie portów host:kontener',
4 environment: 'Zmienne środowiskowe',
5 depends_on: 'Zależności między serwisami',
6 volumes: 'Montowanie wolumenów',
7 networks: 'Przypisanie do sieci',
8 restart: 'Polityka restartu (always, unless-stopped, on-failure)',
9 healthcheck: 'Sprawdzanie zdrowia serwisu',
10};depends_on definiuje, że serwis API powinien czekać na MongoDB i Redis:1depends_on:
2 mongodb:
3 condition: service_healthy # Czekaj na health check
4 redis:
5 condition: service_started # Czekaj na startBez wolumenów dane znikają po zatrzymaniu kontenera. Wolumeny to jak podziemne magazyny — przetrwają nawet zniszczenie obozu:
1volumes:
2 mongodb-data:
3 driver: local # Dane przechowywane na hościeKontenery w tej samej sieci mogą się komunikować po nazwie serwisu:
1// W kontenerze 'api' możemy połączyć się z MongoDB tak:
2const mongoUrl = 'mongodb://mongodb:27017/roman-imperium';
3// 'mongodb' to nazwa serwisu w docker-compose!1# Uruchom wszystkie serwisy
2docker compose up -d
3
4# Zbuduj i uruchom
5docker compose up --build -d
6
7# Zatrzymaj wszystko
8docker compose down
9
10# Zatrzymaj i usuń wolumeny (UWAGA: kasuje dane!)
11docker compose down -v
12
13# Wyświetl logi
14docker compose logs -f api
15
16# Sprawdź status
17docker compose ps
18
19# Restartuj jeden serwis
20docker compose restart apiDocker Compose to drogi łączące nasze obozy w jedno potężne Imperium. Jedną komendą stawiamy całą infrastrukturę!