Docker Compose permet de définir et exécuter des applications multi-conteneurs avec un seul fichier YAML.
Structure du fichier
Un fichier docker-compose.yml comprend quatre sections principales :
# docker-compose.yml
services: # Container definitions
web:
image: nginx:alpine
api:
build: ./api
volumes: # Persistent storage
db-data:
networks: # Custom networks
frontend:
backend:Configuration des services
Image vs Build
services:
# Use a pre-built image
db:
image: postgres:16
# Build from Dockerfile
api:
build: ./api
# Build with custom options
web:
build:
context: ./frontend
dockerfile: Dockerfile.prod
args:
NODE_ENV: productionMapping de ports
services:
web:
ports:
- "80:80" # host:container
- "443:443"
- "3000:3000" # Expose to localhost
- "127.0.0.1:8080:80" # Bind to specific interfaceVariables d'environnement
services:
api:
# Inline environment variables
environment:
- NODE_ENV=production
- DB_HOST=db
- DB_PORT=5432
# From external file
env_file:
- .env
- .env.productionPolitiques de redémarrage
services:
web:
restart: "no" # Default: never restart
api:
restart: always # Always restart
db:
restart: unless-stopped # Restart unless manually stopped
worker:
restart: on-failure # Restart only on failure
# restart: on-failure:5 # Max 5 retriesHealth Checks
services:
db:
image: postgres:16
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
start_period: 30sVolumes
services:
db:
volumes:
# Bind mount (host path : container path)
- ./data:/var/lib/postgresql/data
# Named volume
- db-data:/var/lib/postgresql/data
# Read-only mount
- ./config:/etc/app/config:ro
volumes:
db-data: # Named volume declaration
driver: localRéseaux
services:
web:
networks:
- frontend
api:
networks:
- frontend
- backend
db:
networks:
- backend
networks:
frontend:
driver: bridge
backend:
driver: bridge
internal: true # No external accessExemples de stacks
Node.js + MongoDB + Redis
services:
app:
build: .
ports:
- "3000:3000"
environment:
- MONGO_URL=mongodb://mongo:27017/myapp
- REDIS_URL=redis://redis:6379
depends_on:
- mongo
- redis
mongo:
image: mongo:7
volumes:
- mongo-data:/data/db
restart: unless-stopped
redis:
image: redis:7-alpine
restart: unless-stopped
volumes:
mongo-data:Django + PostgreSQL
services:
web:
build: .
command: gunicorn myapp.wsgi:application --bind 0.0.0.0:8000
ports:
- "8000:8000"
environment:
- DATABASE_URL=postgres://postgres:secret@db:5432/myapp
depends_on:
db:
condition: service_healthy
volumes:
- static:/app/static
db:
image: postgres:16
environment:
POSTGRES_DB: myapp
POSTGRES_PASSWORD: secret
volumes:
- pg-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready"]
interval: 5s
timeout: 5s
retries: 5
volumes:
pg-data:
static:WordPress + MySQL + phpMyAdmin
services:
wordpress:
image: wordpress:latest
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wp_user
WORDPRESS_DB_PASSWORD: wp_pass
WORDPRESS_DB_NAME: wordpress
volumes:
- wp-content:/var/www/html
depends_on:
- db
db:
image: mysql:8
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wp_user
MYSQL_PASSWORD: wp_pass
MYSQL_ROOT_PASSWORD: root_secret
volumes:
- db-data:/var/lib/mysql
phpmyadmin:
image: phpmyadmin:latest
ports:
- "8081:80"
environment:
PMA_HOST: db
volumes:
wp-content:
db-data:Commandes CLI essentielles
| Commande | Description |
|---|---|
| docker compose up -d | Start services in background |
| docker compose down | Stop and remove containers |
| docker compose down -v | Stop and remove containers + volumes |
| docker compose logs -f | Follow service logs |
| docker compose logs api | Logs for specific service |
| docker compose ps | List running containers |
| docker compose exec api sh | Shell into running container |
| docker compose build | Build/rebuild images |
| docker compose pull | Pull latest images |
| docker compose restart api | Restart specific service |
| docker compose config | Validate and view config |
| docker compose top | Show running processes |
Fichiers d'environnement (.env)
Docker Compose lit automatiquement un fichier .env :
# .env file
POSTGRES_VERSION=16
POSTGRES_PASSWORD=my_secret_pass
APP_PORT=3000
# docker-compose.yml
services:
db:
image: postgres:${POSTGRES_VERSION}
environment:
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
app:
ports:
- "${APP_PORT}:3000"Erreurs courantes
| Erreur | Solution |
|---|---|
| Tag `latest` en production | Utiliser des tags de version spécifiques |
| Secrets dans docker-compose.yml | Utiliser des fichiers .env ou Docker secrets |
| Pas de volumes nommés | Les volumes nommés persistent après down |
| Politique de redémarrage manquante | Ajouter `restart: unless-stopped` |
| Pas de limites de ressources | Utiliser `deploy.resources.limits` |
FAQ
Différence entre docker-compose et docker compose ?
docker-compose (avec tiret) est l'ancien outil Python. docker compose (espace) est le nouveau plugin Go (V2).
Comment persister les données ?
Utilisez des volumes nommés.
Comment les conteneurs communiquent ?
Ils partagent un réseau par défaut et utilisent les noms de service.
Peut-on l'utiliser en production ?
Oui, mais pour les grands déploiements, considérez Kubernetes.