Chapitre 2 · Leçon 1
API + base de données + Redis en un seul fichier
Docker Compose permet de définir et lancer plusieurs conteneurs en un seul fichier docker-compose.yml. Il gère automatiquement les réseaux, les volumes et les dépendances entre services.
docker-compose.yml
1version: '3.9'
2
3services:
4 # ─── Base de données ──────────────────────────────────
5 postgres:
6 image: postgres:16-alpine
7 container_name: usher_db
8 restart: unless-stopped
9 environment:
10 POSTGRES_DB: usher_platform
11 POSTGRES_USER: usher
12 POSTGRES_PASSWORD: ${DB_PASSWORD}
13 volumes:
14 - postgres_data:/var/lib/postgresql/data
15 - ./scripts/init.sql:/docker-entrypoint-initdb.d/init.sql:ro
16 networks:
17 - backend
18 healthcheck:
19 test: ["CMD-SHELL", "pg_isready -U usher -d usher_platform"]
20 interval: 10s
21 timeout: 5s
22 retries: 5
23
24 # ─── Cache Redis ──────────────────────────────────────
25 redis:
26 image: redis:7-alpine
27 container_name: usher_redis
28 restart: unless-stopped
29 command: redis-server --requirepass ${REDIS_PASSWORD} --appendonly yes
30 volumes:
31 - redis_data:/data
32 networks:
33 - backend
34 healthcheck:
35 test: ["CMD", "redis-cli", "ping"]
36 interval: 10s
37
38 # ─── API Backend ──────────────────────────────────────
39 api:
40 build:
41 context: .
42 dockerfile: Dockerfile
43 target: runner # stage multi-stage
44 container_name: usher_api
45 restart: unless-stopped
46 env_file: .env.production
47 environment:
48 DATABASE_URL: postgresql://usher:${DB_PASSWORD}@postgres:5432/usher_platform
49 REDIS_URL: redis://:${REDIS_PASSWORD}@redis:6379
50 NODE_ENV: production
51 ports:
52 - "3000:3000"
53 depends_on:
54 postgres:
55 condition: service_healthy
56 redis:
57 condition: service_healthy
58 networks:
59 - backend
60 - frontend
61
62 # ─── Nginx Reverse Proxy ──────────────────────────────
63 nginx:
64 image: nginx:alpine
65 container_name: usher_nginx
66 restart: unless-stopped
67 ports:
68 - "80:80"
69 - "443:443"
70 volumes:
71 - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
72 - /etc/letsencrypt:/etc/letsencrypt:ro
73 depends_on:
74 - api
75 networks:
76 - frontend
77
78volumes:
79 postgres_data:
80 redis_data:
81
82networks:
83 backend: # réseau interne (db, redis, api)
84 internal: true
85 frontend: # réseau exposé (nginx ↔ api)snippet.bash
1# Démarrer tous les services
2docker compose up -d
3
4# Voir les logs de tous les services
5docker compose logs -f
6
7# Voir les logs d'un seul service
8docker compose logs -f api
9
10# Arrêter sans supprimer les données
11docker compose stop
12
13# Arrêter et supprimer les conteneurs
14docker compose down
15
16# Arrêter, supprimer conteneurs + volumes (reset complet)
17docker compose down -v
18
19# Rebuild une image après modification du code
20docker compose up -d --build api
21
22# Exécuter une commande dans un conteneur
23docker compose exec api sh
24docker compose exec api pnpm prisma migrate deploy
25docker compose exec postgres psql -U usher -d usher_platformDocker garantit que l'application tourne exactement de la même façon en développement, en staging et en production. Docker Compose simplifie l'orchestration locale. Pour la prod, un VPS avec Docker Compose ou un service comme Railway/Render suffit pour la plupart des projets.