Sommaire
Utiliser Docker Compose pour définir et orchestrer plusieurs conteneurs avec un fichier docker-compose.yml.
🎯 Objectifs de la fiche
- Principe de Docker Compose — Fichier docker-compose.yml, services, réseaux
- Structure du fichier compose — services, volumes, networks, environnement
- Commandes Docker Compose — up, down, ps, logs, exec
- Exemples pratiques — App web + base de données, WordPress
- Bonnes pratiques — Variables d'environnement, .env, healthcheck
Prérequis
Docker installé et maîtrisé (voir fiche 7). Connaître les bases des conteneurs (images, volumes, réseaux).
1. Principe de Docker Compose
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 |
2. Structure du fichier docker-compose.yml
# 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:
3. Exemple concret — App web + MariaDB
# 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
4. Exemple WordPress + MariaDB
# 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!
5. Commandes Docker Compose essentielles
| 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
6. Bonnes pratiques
| 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 |
- ☐ docker-compose.yml créé avec au moins 2 services
- ☐ docker compose up -d fonctionnel
- ☐ docker compose ps affiche les services en running
- ☐ Communication entre services vérifiée
- ☐ Volume persistant configuré
- ☐ Fichier .env utilisé pour les secrets
- ☐ docker compose down puis up pour tester la persistance
Que fait la directive depends_on dans Docker Compose ?
✅ Réponse : Définit l'ordre de démarrage des services
Quelle commande démarre tous les services en arrière-plan ?
✅ Réponse : docker compose up -d
Que fait docker compose down -v ?
✅ Réponse : Arrête les conteneurs et supprime les volumes nommés
Pourquoi utiliser un fichier .env avec Docker Compose ?
✅ Réponse : Pour éviter de mettre les secrets directement dans docker-compose.yml
Comment deux services Docker Compose communiquent-ils entre eux ?
✅ Réponse : Par leur nom de service (ex: db, app) sur le même réseau Compose