Docker Compose en pratique
Au-delà des bases, Docker Compose offre des fonctionnalités pour les environnements de développement et de production.
Overrides et environnements multiples
# Fichiers par défaut chargés automatiquement
compose.yml # configuration de base
compose.override.yml # surcharges développement (chargé automatiquement)
# Fichiers explicites pour d'autres environnements
docker compose -f compose.yml -f compose.prod.yml up -d
# compose.yml (base commune)
services:
web:
image: mon-app:${APP_VERSION:-latest}
environment:
- LOG_LEVEL=info
# compose.override.yml (développement, chargé automatiquement)
services:
web:
build: . # construire localement en dev
volumes:
- .:/app # bind mount pour hot reload
environment:
- LOG_LEVEL=debug
ports:
- "8000:8000"
# compose.prod.yml (production)
services:
web:
restart: always
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
Scaling et ressources
# Lancer plusieurs instances d'un service (sans ports fixes)
docker compose up -d --scale worker=3
# Voir l'état avec les replicas
docker compose ps
Inspecter et déboguer
# Voir la config effective (variables résolues)
docker compose config
# Valider le fichier compose.yml
docker compose config --quiet && echo "OK" || echo "Erreur"
# Voir les images utilisées
docker compose images
# Voir l'utilisation des ressources
docker stats $(docker compose ps -q)
Cas concret : environnement de développement complet
# compose.yml pour une app Node.js + PostgreSQL + Redis + maildev
services:
app:
build: .
volumes:
- .:/app
- /app/node_modules # exclure node_modules du bind mount
ports:
- "3000:3000"
environment:
DATABASE_URL: postgresql://dev:dev@db/devdb
REDIS_URL: redis://redis:6379
SMTP_HOST: maildev
SMTP_PORT: 1025
depends_on:
db:
condition: service_healthy
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: dev
POSTGRES_PASSWORD: dev
POSTGRES_DB: devdb
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD", "pg_isready", "-U", "dev"]
interval: 3s
retries: 10
redis:
image: redis:7-alpine
maildev:
image: maildev/maildev
ports:
- "1080:1080" # Interface web pour voir les emails
volumes:
pgdata:
docker compose up -d
# App : http://localhost:3000
# Emails interceptés : http://localhost:1080
# Pas d'email réel envoyé en développement
Erreurs fréquentes
- node_modules dans le bind mount : monter
.:/appécrase lenode_modulesinstallé dans l'image avec celui (vide) du dossier local. Solution : ajouter un volume anonyme sur/app/node_modules. - docker compose config affiche des erreurs de variable : vérifier que toutes les variables
${VAR}ont une valeur dans.envou une valeur par défaut${VAR:-defaut}. - Ordre de démarrage des services : sans
depends_on+ healthcheck, l'application peut démarrer avant que la base de données soit prête.
À retenir
compose.override.yml→ surcharges développement automatiques.-f compose.yml -f compose.prod.yml→ config production explicite.docker compose config→ vérifier la config effective avant de lancer.- Volumes anonymes (
- /app/node_modules) → protéger les dossiers gérés par l'image.