Utiliser Docker Compose pour définir et orchestrer plusieurs conteneurs avec un fichier docker-compose.yml.
Docker installé et maîtrisé (voir fiche 7). Connaître les bases des conteneurs (images, volumes, réseaux).
Docker Compose permet de définir et gérer des applications multi-conteneurs dans un seul fichier YAML (docker-compose.yml). Au lieu de lancer plusieurs commandes docker run, une seule commande docker compose up démarre tous les services définis.
| Sans Compose | Avec Compose |
|---|---|
| docker run -d --name db ... | docker compose up -d |
| docker run -d --name app ... | (démarre tous les services) |
| docker run -d --name nginx ... | (dans l'ordre et avec les dépendances) |
| 3 commandes à mémoriser + options | 1 fichier YAML versionnable |
# Structure générale
services:
nom-service:
image: image:tag # Image Docker à utiliser
build: . # Ou construire depuis un Dockerfile
container_name: nom # Nom du conteneur
ports:
- "port_hote:port_conteneur"
environment:
- VARIABLE=valeur
env_file:
- .env # Variables depuis un fichier
volumes:
- /hote:/conteneur
- nom-volume:/chemin
networks:
- nom-reseau
depends_on:
- autre-service # Démarrer après ce service
restart: unless-stopped # Politique de redémarrage
volumes:
nom-volume:
networks:
nom-reseau:
# docker-compose.yml
services:
db:
image: mariadb:11
container_name: mariadb
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: appdb
MYSQL_USER: appuser
MYSQL_PASSWORD: apppass
volumes:
- db-data:/var/lib/mysql
networks:
- app-network
app:
image: php:8.2-apache
container_name: webapp
restart: unless-stopped
ports:
- "8080:80"
volumes:
- ./src:/var/www/html
depends_on:
- db
networks:
- app-network
volumes:
db-data:
networks:
app-network:
driver: bridge
# docker-compose.yml — WordPress complet
services:
db:
image: mariadb:11
restart: unless-stopped
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
volumes:
- wp-db:/var/lib/mysql
wordpress:
image: wordpress:latest
restart: unless-stopped
ports:
- "80:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}
WORDPRESS_DB_NAME: wordpress
volumes:
- wp-content:/var/www/html
depends_on:
- db
volumes:
wp-db:
wp-content:
# Fichier .env (même répertoire que docker-compose.yml)
DB_PASSWORD=MotDePasseSecurise!
DB_ROOT_PASSWORD=RootSecurise!
| Commande | Action |
|---|---|
| docker compose up -d | Démarrer tous les services en arrière-plan |
| docker compose up -d --build | Rebuilder les images et démarrer |
| docker compose down | Arrêter et supprimer les conteneurs |
| docker compose down -v | Arrêter + supprimer volumes (attention : perd les données) |
| docker compose ps | Lister les services et leur état |
| docker compose logs | Voir les logs de tous les services |
| docker compose logs -f app | Suivre les logs du service app |
| docker compose restart app | Redémarrer un service spécifique |
| docker compose exec app bash | Ouvrir un shell dans le service app |
| docker compose pull | Mettre à jour les images |
| docker compose config | Valider et afficher la config finale |
# Démarrage complet d'une application
mkdir monapp && cd monapp
nano docker-compose.yml # créer le fichier
nano .env # créer les variables
docker compose config # valider la syntaxe
docker compose up -d # démarrer
docker compose ps # vérifier l'état
docker compose logs -f # voir les logs
| Bonne pratique | Explication |
|---|---|
| Utiliser .env | Ne jamais mettre les mots de passe directement dans docker-compose.yml |
| Ajouter .env au .gitignore | Ne pas committer les secrets dans Git |
| Nommer les volumes | Les volumes nommés sont plus faciles à gérer que les bind mounts |
| Utiliser depends_on | Garantir l'ordre de démarrage des services |
| Tagger les images | Eviter :latest en production — utiliser une version précise (ex: nginx:1.25) |
| restart: unless-stopped | Assure la reprise automatique après un reboot du serveur |
✅ Réponse : Définit l'ordre de démarrage des services
✅ Réponse : docker compose up -d
✅ Réponse : Arrête les conteneurs et supprime les volumes nommés
✅ Réponse : Pour éviter de mettre les secrets directement dans docker-compose.yml
✅ Réponse : Par leur nom de service (ex: db, app) sur le même réseau Compose