Sommaire
Module V7 – Docker Compose
Objectifs : maîtriser l’orchestration de conteneurs avec Docker Compose, définir des services en YAML, gérer réseaux et volumes, déployer une application multi‑conteneurs.
📖 Introduction
Docker Compose est un outil permettant de définir et de lancer des applications multi‑conteneurs Docker. Grâce à un fichier docker-compose.yml, vous pouvez décrire l’ensemble des services (conteneurs), leurs images, leurs ports, leurs variables d’environnement, leurs volumes et leurs dépendances. Un simple docker compose up déploie toute l’application de manière reproductible.
version n’est plus obligatoire. Vous pouvez commencer directement par services: ou utiliser --- (début d’un document YAML). Les exemples ci‑dessous utilisent la syntaxe moderne, sans la ligne version.
À l'issue de ce module, vous serez capable de :
- Comprendre la structure d’un fichier
docker-compose.ymlmoderne. - Définir des services, des réseaux et des volumes.
- Utiliser les commandes essentielles de Docker Compose.
- Déployer une application LAMP / WordPress en quelques minutes.
🔍 Qu'est-ce que Docker Compose ?
Docker Compose est un outil d’orchestration simple qui permet de gérer des applications composées de plusieurs conteneurs.
- Déclaratif : on décrit l’état souhaité dans un fichier YAML.
- Reproductible : le même fichier fonctionne sur n’importe quel hôte Docker.
- Unifié : on gère l’ensemble des services en une seule commande.
📐 Structure du fichier docker-compose.yml
version est optionnelle. Si vous utilisez une version récente de Docker Compose (≥ 2.0), vous pouvez omettre la ligne version: et commencer directement par services: ou par ---.
| Section | Rôle | Exemples |
|---|---|---|
| Services | Définition des conteneurs (nom, image, ports, variables...). | web: image: nginx:latest |
| Networks | Réseaux personnalisés pour isoler les services. | app-network |
| Volumes | Volumes nommés pour persister les données. | db-data |
🛠️ Syntaxe YAML – rappel
- Indentation : 2 espaces (pas de tabulations).
- Listes : préfixées par un
-. - Clés/valeurs : séparées par
:suivi d’un espace. - Début de fichier :
---est facultatif mais recommandé pour les puristes YAML.
🧪 Exemple complet – Stack WordPress
docker-compose.yml (syntaxe moderne, sans version)
services:
db:
image: mysql:8.0
container_name: wordpress_db
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: wppass
volumes:
- db-data:/var/lib/mysql
networks:
- wp-network
wordpress:
image: wordpress:latest
container_name: wordpress_app
restart: always
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: wppass
WORDPRESS_DB_NAME: wordpress
volumes:
- wp-data:/var/www/html
networks:
- wp-network
depends_on:
- db
volumes:
db-data:
wp-data:
networks:
wp-network:
- db : service MySQL, avec variables d’environnement et volume pour persister les données.
- wordpress : service WordPress, exposé sur le port 8080 de l’hôte.
- depends_on : assure que la base de données démarre avant WordPress.
- volumes nommés :
db-dataetwp-datapersistent entre les redémarrages. - réseau : les deux services communiquent via
wp-network. - Absence de
version: syntaxe compatible avec les versions récentes de Docker Compose.
📋 Commandes essentielles
| Commande | Description |
|---|---|
docker compose up -d | Lance tous les services en arrière‑plan. |
docker compose down | Arrête et supprime les conteneurs, réseaux (et volumes si -v). |
docker compose logs -f | Affiche les logs en temps réel. |
docker compose ps | Liste les conteneurs du projet. |
docker compose exec <service> bash | Ouvre un shell dans un conteneur. |
docker compose restart | Redémarre tous les services. |
📂 Gestion des volumes et réseaux
- Volumes nommés : persistance indépendante du cycle de vie des conteneurs.
- Bind mounts : montage de répertoires locaux (
./html:/var/www/html). - Réseau par défaut : Compose crée un réseau
<nom_projet>_default. - Réseaux personnalisés : permettent de segmenter les services (frontend vs backend).
🧪 Mise en pratique
1. Créer un projet Docker Compose
mkdir ~/mon-projet-compose cd ~/mon-projet-compose nano docker-compose.yml
Collez l’exemple ci‑dessus, puis lancez :
docker compose up -d
Accédez à http://localhost:8080 pour voir WordPress.
2. Ajouter un service phpMyAdmin
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: wordpress_phpmyadmin
restart: always
ports:
- "8081:80"
environment:
PMA_HOST: db
PMA_PORT: 3306
networks:
- wp-network
PMA_HOST: db: se connecte à la base via le servicedb.PMA_PORT: 3306: port par défaut de MySQL.- Le réseau
wp-networkest partagé avec la base et WordPress.
📝 Exercices d'application
Exercice 1 – Analyse de fichier Compose
Dans l’exemple WordPress, quel est le rôle du champ depends_on ?
depends_on définit l’ordre de démarrage des services. Ici, WordPress ne démarre que si la base db est déjà lancée.
Exercice 2 – Ajout de service
Comment ajouter un service Redis à une stack existante ?
redis:
image: redis:alpine
container_name: app_redis
restart: always
networks:
- wp-network
🎯 Quiz d'auto‑évaluation
1. Le fichier docker-compose.yml utilise la syntaxe YAML.
2. La commande docker compose up -d lance les conteneurs en arrière‑plan.
3. La section volumes permet de définir des volumes nommés.
4. La directive ports: - "8080:80" expose le port 80 du conteneur sur le port 8080 de l’hôte.
5. La commande docker compose down supprime les conteneurs, les réseaux, mais pas les volumes par défaut.
6. La ligne version: est obligatoire dans tous les fichiers docker-compose.yml.
📚 Ressources
- Documentation officielle Docker Compose
- Awesome Compose – Exemples de stacks
- Spécification du fichier Compose (sans version)