dockerdocker-composecontainers
MDstable
Docker Compose — Référence pratique
Définir et orchestrer des stacks multi-conteneurs avec Docker Compose
snippetbeginner 2025-05-10 3 min read
dockerdocker-composecontainersdevopsorchestration
Commandes essentielles
bash
Variables
{{SERVICE}}
# Démarrer la stackdocker compose up -d# Reconstruire les images et redémarrerdocker compose up -d --build# Arrêter et supprimer les conteneursdocker compose down# Avec suppression des volumesdocker compose down -v# Logsdocker compose logs -fdocker compose logs -f {{SERVICE}}# État des servicesdocker compose ps# Exécuter une commande dans un servicedocker compose exec {{SERVICE}} bashdocker compose exec {{SERVICE}} sh# Redémarrer un service spécifiquedocker compose restart {{SERVICE}}# Rebuild un seul servicedocker compose up -d --build {{SERVICE}}# Scalingdocker compose up -d --scale {{SERVICE}}3
Structure docker-compose.yml
yaml
# docker-compose.ymlversion: '3.9'services:# Applicationapp:build:context: .dockerfile: Dockerfileimage: myapp:latestcontainer_name: myapprestart: unless-stoppedports:- "3000:3000"environment:- NODE_ENV=production- DATABASE_URL=postgresql://user:pass@db:5432/mydbenv_file:- .envdepends_on:db:condition: service_healthyvolumes:- ./uploads:/app/uploadsnetworks:- frontend- backendlabels:- "traefik.enable=true"# Base de donnéesdb:image: postgres:16-alpinecontainer_name: myapp-dbrestart: unless-stoppedenvironment:POSTGRES_USER: ${DB_USER}POSTGRES_PASSWORD: ${DB_PASSWORD}POSTGRES_DB: ${DB_NAME}volumes:- postgres_data:/var/lib/postgresql/data- ./init.sql:/docker-entrypoint-initdb.d/init.sql:ronetworks:- backendhealthcheck:test: ["CMD-SHELL", "pg_isready -U ${DB_USER} -d ${DB_NAME}"]interval: 10stimeout: 5sretries: 5# Cacheredis:image: redis:7-alpinecontainer_name: myapp-redisrestart: unless-stoppedcommand: redis-server --requirepass ${REDIS_PASSWORD}volumes:- redis_data:/datanetworks:- backend# Reverse proxynginx:image: nginx:alpinecontainer_name: myapp-nginxrestart: unless-stoppedports:- "80:80"- "443:443"volumes:- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro- ./certs:/etc/nginx/certs:rodepends_on:- appnetworks:- frontendvolumes:postgres_data:driver: localredis_data:driver: localnetworks:frontend:driver: bridgebackend:driver: bridgeinternal: true # pas d'accès internet direct
Patterns courants
Variables d'environnement
bash
# .env (jamais commité en git)DB_USERmyappDB_PASSWORDsuper_secret_passwordDB_NAMEmyapp_dbREDIS_PASSWORDredis_secret# Référencer dans composeenvironmentDB_PASSWORD${DB_PASSWORD}# ouenvironmentDB_PASSWORD ${DB_PASSWORD-default_value}
Override par environnement
yaml
# docker-compose.override.yml (dev — auto-chargé)services:app:volumes:- .:/app # hot reload en devenvironment:- DEBUG=truecommand: npm run dev# docker-compose.prod.yml# docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
Profiles (services optionnels)
yaml
services:app:# Toujours démarréadminer:image: adminerprofiles: ["debug"] # seulement avec --profile debug# Démarrer avec un profildocker compose --profile debug up -d
Healthchecks
yaml
healthcheck:test: ["CMD", "curl", "-f", "http://localhost:3000/health"]interval: 30stimeout: 10sretries: 3start_period: 40s
Ressources et limites
yaml
services:app:deploy:resources:limits:cpus: '1.0'memory: 512Mreservations:cpus: '0.25'memory: 128M
Debug et troubleshooting
bash
Variables
{{SERVICE}}
# Inspecter un conteneurdocker compose exec {{SERVICE}} envdocker compose exec {{SERVICE}} cat /etc/hosts# Voir les événementsdocker compose events# Stats de ressourcesdocker stats# Réseau — inspecterdocker network inspect myapp_backend# Volumes — inspecterdocker volume inspect myapp_postgres_data# Logs avec timestampdocker compose logs -f --timestamps {{SERVICE}}# Entrer dans un conteneur arrêtédocker run -it --entrypoint sh image_name
💡 Tip —
Utiliser restart: unless-stopped plutôt que always — cela permet d'arrêter manuellement un conteneur pour debug sans qu'il redémarre automatiquement. En prod, utiliser des secrets Docker (docker secret) plutôt que des variables d'environnement pour les données sensibles.
OPS·BRAIN v1.03 notes · DevOpslocal