3 : Orchestration Locale avec Docker Compose
3.1. Du CLI au YAML : L’Infrastructure as Code (IaC)
Jusqu’à présent, pour lancer une base de données et une application, nous devions taper deux longues commandes docker run, créer un réseau manuel, et espérer ne pas faire de faute de frappe.
Docker Compose est un outil qui permet de définir et lancer des applications multi-conteneurs. On décrit l’état souhaité dans un fichier docker-compose.yml (format YAML).
Comparaison Directe
Avant (CLI) :
docker network create mon-net
docker run -d --name ma-db --network mon-net -e POSTGRES_PASSWORD=secret postgres
docker run -d -p 8080:80 --network mon-net -e DB_HOST=ma-db my-app
Après (Compose) :
services:
database:
image: postgres
environment:
POSTGRES_PASSWORD: secret
# Le réseau est créé automatiquement !
webapp:
image: my-app
ports:
- "8080:80"
environment:
DB_HOST: database # Magie : on utilise le nom du service comme nom d'hôte
Note Modernité : Depuis Docker Compose V2, la commande est
docker compose(avec espace) et non plusdocker-compose(avec tiret)
3.2. La Magie du Réseau (DNS Interne)
C’est le concept le plus important du jour. Dans un fichier Compose, tous les services sont sur le même réseau par défaut.
Comment l’application web trouve-t-elle la base de données ? Pas besoin d’IP ! Docker intègre un serveur DNS interne.
-
Si le service s’appelle
databasedans le YAML. -
L’application peut faire un ping sur
databaseou se connecter àjdbc:postgresql://database:5432. -
Docker résout automatiquement
database->172.x.x.x.
@startuml
!theme sunlust
skinparam componentStyle rectangle
package "Réseau Docker (Bridge par défaut)" {
[Service: webapp] as Web
[Service: database] as DB
note bottom of Web : IP: 172.20.0.3\nCode: connect("database")
note bottom of DB : IP: 172.20.0.2\nNom DNS: "database"
Web -> DB : Résolution DNS "database"
}
[Navigateur Hôte] -> Web : Port 8080 (localhost)
@enduml
3.3. Gestion des Volumes et Persistance
Dans Compose, la syntaxe pour les volumes est très lisible.
services:
db:
image: mysql
volumes:
-db_data:/var/lib/mysql # Volume nommé (Recommandé pour la DB)
web:
image: nginx
volumes:
- ./html:/usr/share/nginx/html # Bind Mount (Recommandé pour le code/config)
# Déclaration des volumes nommés en bas de fichier
volumes:
db_data:
3.4. Commandes Essentielles (Cheatsheet)
| Commande | Action | Analogie |
|---|---|---|
docker compose up -d |
Crée réseaux, volumes et lance les conteneurs en arrière-plan. | “Allumer la maison” |
docker compose down |
Arrête et supprime conteneurs et réseaux. | “Raser la maison” |
docker compose logs -f |
Affiche les logs de tous les services agrégés. | “Lire tous les journaux intimes” |
docker compose ps |
État des services de la stack. | “L’appel des élèves” |
docker compose restart |
Redémarre les services. | “Reboot” |
3.5. Activité Pratique : “The Broken Stack”
C’est l’heure de mettre les mains dans le cambouis avec un exercice de troubleshooting.
Contexte :
Un stagiaire a essayé de conteneuriser une application WordPress avec MySQL mais il a abandonné. “Rien ne marche”, dit-il.
Le fichier fourni (docker-compose.yml) contient des erreurs volontaires :
# ATTENTION : CE FICHIER CONTIENT DES ERREURS POUR L'EXERCICE
version: '3'
services:
wordpress:
image: wordpress:latest
ports:
- "80:80"
depends_on∶
- db_server
environment:
WORDPRESS_DB_HOST: localhost
WORDPRESS_DB_PASSWORD: root
db_server:
image: mysql:5.7
enviromnent:
MYSQL_ROOT_PASSWORD: root
volumes:
./db_data:/var/lib/mysql