Używamy cookies, żeby zwiększyć Twoje doświadczenia na stronie
CodeWorlds

Docker Compose — Sieć Dróg Imperium

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.

Czym jest Docker Compose?

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 komunikacyjne

Pełna konfiguracja Docker Compose

1version: '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: bridge

Kluczowe elementy konfiguracji

Services — Usługi

Każ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 — Kolejność uruchamiania

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 start

Volumes — Trwałe dane

Bez 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ście

Networks — Komunikacja

Kontenery 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!

Komendy 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 api

Docker Compose to drogi łączące nasze obozy w jedno potężne Imperium. Jedną komendą stawiamy całą infrastrukturę!

Przejdź do CodeWorlds