Docker Compose
Maîtriser une équipe de conteneurs comme un chef d’orchestre !
Notions théoriques
Docker offre 3 méthodes pour créer des conteneurs :
- utiliser une image existante,
- ou construire votre propre image avec un Dockerfile,
- ou utiliser Docker Compose pour des applications complexes.

Docker Compose permet de diriger plusieurs conteneurs comme une équipe, avec un seul fichier.
Ce fichier, appelé docker-compose.yml, est écrit en YAML (un format simple, comme une liste claire).
Dedans, tu dis qui fait quoi, comment ils se parlent, et où ils stockent leurs données.
Voici les bases :
- Services : Ce sont tes conteneurs.
Par exemple, un service pour ton appli Web, un autre pour ta base de données.
- Réseaux : Ils connectent tes services pour qu’ils puissent discuter.
Docker Compose crée un réseau automatiquement, par défaut.
- Volumes : C’est comme une boîte où tes conteneurs stockent des données pour ne pas les perdre s’ils s’arrêtent.
- Ports : Ils ouvrent des portes entre ton ordi et les conteneurs, pour que tu puisses voir ton site Web, par exemple.
Pour tout lancer, tu tapes docker-compose up et tes services démarrent ensemble !
Pour tout arrêter et nettoyer, docker-compose down fait le job.
Tu peux même ajouter des options, comme dire qui démarre en premier avec depends_on, ou mettre des mots de passe avec environment.
En résumé, Docker Compose, c’est un chef d’orchestre pour une symphonie de conteneurs !
Exemple pratique
On va créer un petit duo : un site Web et une base de données.
Voici un fichier docker-compose.yml simple :
version: '3'
services:
web:
image: nginx:latest
ports:
- "8080:80"
database:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: secret
Que se passe-t-il ?
version: '3': C’est la version du fichier, comme un numéro de mise à jour.web: On utilise l’imagenginx(un serveur Web) et on connecte le port 8080 de ton ordi au port 80 du conteneur.database: On prendmysql:5.7et on met un mot de passe root (secret).
Pour voir ça en action, sauvegarde ce fichier, ouvre un terminal dans le même dossier, et tape docker-compose up.
Tu verras les 2 conteneurs se lancer.
Va sur http://localhost:8080, et tu devrais voir la page par défaut de Nginx.
Pour tout arrêter, fais CTRL + C ou docker-compose down.
Test de mémorisation/compréhension
TP pour réfléchir et résoudre des problèmes
Création d'une application multi-conteneurs avec Docker Compose
Ce TP vous guide dans la mise en place d'une application utilisant Docker Compose pour orchestrer 2 services :
- une application Python
- et une base de données MySQL.
Vous allez créer :
- un environnement reproductible,
- écrire du code pour connecter ces services,
- et tester leur interaction.
1) Préparer l'environnement du projet
Objectif : Mettre en place la structure initiale du projet et s'assurer que l'environnement est prêt pour les étapes suivantes.
-
Créer un dossier dédié au projet :
- Ouvre un terminal adapté à ton système d'exploitation :
- Sur Windows : utilise PowerShell ou, si tu préfères un environnement Linux, installe WSL (Windows Subsystem for Linux) et utilise un terminal Ubuntu.
- Sur Linux ou macOS : utilise le terminal par défaut.
- Exécute la commande suivante pour créer un dossier nommé
projet-docker-compose:mkdir projet-docker-compose - Déplace-toi dans ce dossier avec :
cd projet-docker-compose
- Ce dossier servira de racine pour tous les fichiers du projet.
- Ouvre un terminal adapté à ton système d'exploitation :
-
Vérifier l'installation de Docker et Docker Compose :
- Assure-toi que Docker est installé et en marche. Vérifie avec :
Tu devrais voir une sortie commedocker --version
Docker version 20.10.17, build 100c701. - Vérifie aussi Docker Compose :
Une réponse commedocker-compose --version
docker-compose version 1.29.2, build 5becea4cconfirme qu’il est prêt. - Si l’un des deux n’est pas installé, consulte la documentation officielle de Docker pour ton système.
- Assure-toi que Docker est installé et en marche. Vérifie avec :
-
Comprendre l’organisation :
- À ce stade, le dossier
projet-docker-composeest vide. Il accueillera bientôt un fichierdocker-compose.ymlpour définir les services, un script Python pour l’application, et éventuellement d’autres fichiers de configuration.
- À ce stade, le dossier
📌 Une solution
2) Deux services avec Docker Compose
Objectif : Créer un fichier docker-compose.yml qui définit 2 services interconnectés :
- une application Python (
web) - et une base de données MySQL (
db).
-
Créer le fichier
docker-compose.yml:- Dans le dossier
projet-docker-compose, crée un fichier nommédocker-compose.yml. Utilise une commande ou ton éditeur de texte préféré :- Sur Windows (PowerShell) :
echo "" > docker-compose.yml - Sur Linux/macOS :
touch docker-compose.yml
- Sur Windows (PowerShell) :
- Ouvre ce fichier avec un éditeur comme VS Code, Vim ou Notepad++.
- Dans le dossier
-
Définir la structure de base :
- Commence par spécifier la version de la syntaxe Docker Compose. La version
'3'est stable et largement compatible :version: '3' - Ajoute une section
servicespour lister les conteneurs :services:
- Commence par spécifier la version de la syntaxe Docker Compose. La version
-
Configurer le service
web:- Sous
services, définis un service nomméwebpour l’application Python :- Utilise l’image officielle
python:3.9pour avoir un environnement Python prêt à l’emploi. - Monte le dossier local dans le conteneur avec
volumespour synchroniser le code. - Défini un répertoire de travail avec
working_dir. - Spécifie une commande par défaut avec
command. - Ajoute une dépendance avec
depends_onpour attendre le servicedb.
- Utilise l’image officielle
- Voici un exemple :
web:image: python:3.9volumes:- .:/appworking_dir: /appcommand: python app.pydepends_on:- db
- Sous
-
Configurer le service
db:- Ajoute un service nommé
dbpour la base de données MySQL :- Utilise l’image
mysql:5.7, une version stable et bien documentée. - Configure des variables d’environnement pour initialiser la base :
MYSQL_ROOT_PASSWORD: mot de passe root.MYSQL_DATABASE: nom de la base par défaut.
- Utilise l’image
- Exemple :
db:image: mysql:5.7environment:MYSQL_ROOT_PASSWORD: monpassMYSQL_DATABASE: test_db
- Ajoute un service nommé
-
Vérifier la syntaxe :
- Assure-toi que l’indentation est correcte (2 espaces en YAML, pas de tabulations). Une erreur ici peut empêcher Docker Compose de fonctionner.
📌 Une solution
3) Développer l’application Python
Objectif : Écrire un script Python qui se connecte à la base de données MySQL et gère les délais de démarrage du conteneur db.
-
Créer le fichier
app.py:- Dans le dossier
projet-docker-compose, crée un fichier nomméapp.py:- Sur Windows (PowerShell) :
echo "" > app.py - Sur Linux/macOS :
touch app.py
- Sur Windows (PowerShell) :
- Ouvre ce fichier dans ton éditeur.
- Dans le dossier
-
Installer les dépendances nécessaires :
- Le script utilisera
mysql-connector-pythonpour se connecter à MySQL. Pour l’installer dans le conteneur, tu ajouteras une commande plus tard. Pour l’instant, concentre-toi sur le code.
- Le script utilisera
-
Écrire le script Python :
- Importe les modules nécessaires :
mysql.connectorpour la connexion ettimepour gérer les délais. - Crée une boucle qui tente de se connecter à la base de données :
- Utilise
host="db"(le nom du service dansdocker-compose.yml). - Spécifie
user="root",password="monpass", etdatabase="test_db"(conformes au servicedb).
- Utilise
- Gère les erreurs avec un
try/exceptet attends 2 secondes entre chaque tentative si la connexion échoue.
- Importe les modules nécessaires :
-
Tester localement (optionnel) :
- Si tu veux tester le code hors Docker, installe
mysql-connector-pythonlocalement avec :pip install mysql-connector-python - Adapte le
hostà une instance MySQL locale si nécessaire.
- Si tu veux tester le code hors Docker, installe
📌 Une solution
4) Lancer et tester les services
Objectif : Démarrer les conteneurs, installer les dépendances Python dans le conteneur web, et vérifier que tout fonctionne.
-
Lancer Docker Compose :
- Dans le dossier
projet-docker-compose, exécute :docker-compose up - Cette commande télécharge les images (
python:3.9etmysql:5.7), construit les conteneurs, et affiche leurs logs en temps réel.
- Dans le dossier
-
Installer
mysql-connector-pythondans le conteneurweb:- Le conteneur
webéchouera au démarrage carapp.pynécessitemysql-connector-python. - Ouvre un second terminal, trouve l’ID du conteneur
webavec :docker ps - Accède au conteneur avec :
docker exec -it <ID_du_conteneur_web> bash
- Installe la dépendance :
pip install mysql-connector-python
- Quitte le conteneur avec
exit, puis redémarre les services :docker-compose down && docker-compose up
- Le conteneur
-
Analyser les logs :
- Observe les logs dans le terminal où
docker-compose upest actif :- Le service
dbaffiche des messages indiquant son démarrage. - Le service
webmontre les tentatives de connexion, suivies du message de succès une fois quedbest prêt.
- Le service
- Observe les logs dans le terminal où
-
Arrêter les services :
- Quand tu as terminé, arrête les conteneurs avec
Ctrl+Cdans le terminal, ou dans un autre terminal :docker-compose down - Pour supprimer aussi les volumes persistants, ajoute
--volumes:docker-compose down --volumes
- Quand tu as terminé, arrête les conteneurs avec