Orchestrer avec Docker Compose
docker run fonctionne pour un seul conteneur. Dès que l'on a plusieurs services (web + base de données + cache), Docker Compose simplifie la gestion de l'ensemble.
Le fichier compose.yml
# compose.yml (anciennement docker-compose.yml)
services:
web:
build: . # construire l'image depuis le Dockerfile local
ports:
- "8000:8000"
environment:
- DATABASE_URL=postgresql://user:pass@db/myapp
- REDIS_URL=redis://cache:6379
depends_on:
db:
condition: service_healthy
networks:
- app-net
db:
image: postgres:16
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: myapp
volumes:
- postgres-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user -d myapp"]
interval: 5s
timeout: 5s
retries: 5
networks:
- app-net
cache:
image: redis:7-alpine
networks:
- app-net
volumes:
postgres-data:
networks:
app-net:
driver: bridge
Commandes essentielles
# Démarrer tous les services (rebuild si nécessaire)
docker compose up -d
# Forcer le rebuild des images
docker compose up -d --build
# Voir les logs de tous les services
docker compose logs -f
# Voir les logs d'un service spécifique
docker compose logs -f web
# Voir l'état des services
docker compose ps
# Arrêter les services (conteneurs conservés)
docker compose stop
# Arrêter et supprimer les conteneurs
docker compose down
# Arrêter, supprimer conteneurs ET volumes
docker compose down -v # ⚠️ supprime les données !
# Exécuter une commande dans un service
docker compose exec web bash
docker compose exec db psql -U user -d myapp
graph LR
U[Utilisateur
:8000]
W[web
FastAPI/Django]
D[db
PostgreSQL :5432]
C[cache
Redis :6379]
U -->|HTTP| W
W -->|SQL| D
W -->|cache| C
Variables d'environnement avec .env
# Fichier .env (ne pas commiter !)
POSTGRES_PASSWORD=supersecret
POSTGRES_USER=myapp
APP_SECRET_KEY=changeme
# compose.yml référence les variables
environment:
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
Cas concret : stack WordPress complète
services:
wordpress:
image: wordpress:latest
ports:
- "80:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wp
WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}
WORDPRESS_DB_NAME: wordpress
volumes:
- wp-content:/var/www/html/wp-content
depends_on:
- db
db:
image: mysql:8.0
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wp
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
volumes:
- db-data:/var/lib/mysql
volumes:
wp-content:
db-data:
# Lancer WordPress en 30 secondes
echo "DB_PASSWORD=secret123
DB_ROOT_PASSWORD=root123" > .env
docker compose up -d
Erreurs fréquentes
- depends_on sans healthcheck :
depends_on: dbattend que le conteneur db démarre, pas que PostgreSQL soit prêt à accepter des connexions. Utilisercondition: service_healthyavec un healthcheck. - Commiter .env : le fichier
.envcontient des secrets. Toujours l'ajouter à.gitignore. docker compose down -ven production : ce flag supprime les volumes → perte des données de base de données.
À retenir
compose.yml→ déclare services, volumes, réseaux en YAML.docker compose up -d→ démarrer.docker compose down→ arrêter.depends_on+healthcheck→ attendre que le service soit vraiment prêt..env→ secrets hors du compose.yml, dans.gitignore.