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
Les variables d’environnement avec .env
# .env (à côté de docker-compose.yml, ne pas commiter)
POSTGRES_PASSWORD=mon_mot_de_passe_securise
POSTGRES_DB=myapp_prod
REDIS_PASSWORD=autre_secret
# docker-compose.yml — référencer les variables
services:
db:
image: postgres:16-alpine
environment:
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
Intégrer les migrations de base de données
# Lancer les migrations Prisma après démarrage
docker compose up -d
docker compose exec app npx prisma migrate deploy
docker compose exec app npx prisma db seed
# Ou dans un script de démarrage (entrypoint.sh)
#!/bin/sh
npx prisma migrate deploy
exec node server.js
Offres développeur fullstack et back-end
Des postes pour développeurs qui savent déployer leurs projets — Docker Compose est la compétence de base en entreprise.
À lire aussi : Docker pour développeurs — Déploiement sur VPS — DevOps pour débutant