Une application réelle n’est pas un seul service : il y a l’API, la base de données, le cache Redis, le service de mails. Docker Compose orchestre plusieurs containers qui fonctionnent ensemble. C’est l’outil qui transforme Docker en environnement de développement complet — et qui simplifie le déploiement sur un VPS.
Le problème que Docker Compose résout
Sans Docker Compose, démarrer un environnement de développement complet demande de lancer manuellement plusieurs docker run avec les bons ports, les bonnes variables d’environnement, les bons réseaux. Docker Compose décrit tout dans un fichier YAML et démarre tout avec une commande.
Un docker-compose.yml complet
# docker-compose.yml — Stack Next.js + PostgreSQL + Redis
version: '3.9'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgresql://postgres:password@db:5432/myapp
- REDIS_URL=redis://cache:6379
- NODE_ENV=development
volumes:
- .:/app # montage du code source pour le hot reload
- /app/node_modules # exclure node_modules du montage
depends_on:
db:
condition: service_healthy # attendre que la DB soit prête
cache:
condition: service_started
restart: unless-stopped
db:
image: postgres:16-alpine
environment:
POSTGRES_DB: myapp
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
volumes:
- postgres_data:/var/lib/postgresql/data # persistance des données
ports:
- "5432:5432" # exposer pour accès depuis un client DB local (TablePlus, DBeaver)
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 5s
retries: 5
cache:
image: redis:7-alpine
ports:
- "6379:6379"
command: redis-server --appendonly yes
volumes:
- redis_data:/data
volumes:
postgres_data:
redis_data:
Les commandes essentielles
# Démarrer tous les services (en background)
docker compose up -d
# Voir les logs de tous les services
docker compose logs -f
# Voir les logs d'un service spécifique
docker compose logs -f app
# Arrêter les services (containers restent, volumes conservés)
docker compose stop
# Arrêter ET supprimer les containers
docker compose down
# Supprimer aussi les volumes (⚠️ supprime les données DB)
docker compose down -v
# Rebuild l'image après modification du Dockerfile
docker compose up -d --build
# Exécuter une commande dans un service
docker compose exec app sh
docker compose exec db psql -U postgres myapp
# Voir l'état des services
docker compose ps
Séparer dev et production
# docker-compose.yml — base commune
# docker-compose.override.yml — surcharge automatique en dev
# docker-compose.prod.yml — config production
# docker-compose.override.yml (dev)
services:
app:
volumes:
- .:/app # hot reload — inutile en prod
environment:
- NODE_ENV=development
command: npm run dev # serveur de dev, pas de build
# docker-compose.prod.yml
services:
app:
image: mon-registry/mon-app:latest # image pré-buildée
environment:
- NODE_ENV=production
restart: always
# En développement (override appliqué automatiquement)
docker compose up -d
# En production
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d