Objectifs
- Comprendre la nécessité d’orchestrer plusieurs conteneurs pour une application complète.
- Écrire un fichier
docker-compose.ymlsimple pour définir plusieurs services. - Lancer et arrêter une application multi-conteneurs avec
docker compose upetdocker compose down. - Comprendre comment les services communiquent entre eux grâce au réseau automatique de Compose.
Pourquoi Docker Compose ?
Une application réelle est rarement un seul conteneur. Elle est souvent composée de plusieurs services qui doivent fonctionner et communiquer ensemble : un serveur web, une base de données, un cache, etc.
Lancer et configurer chaque conteneur manuellement avec de longues commandes docker run devient vite complexe et sujet à erreurs.
Docker Compose est l’outil qui résout ce problème. Il vous permet de définir et de gérer tous les services de votre application dans un seul fichier de configuration au format YAML.
Le fichier docker-compose.yml
C’est le fichier central qui décrit votre application. Il définit les services, leurs images, les ports, les volumes, les réseaux, etc.
Exemple : Un site web avec une base de données
Imaginons une application web simple (par exemple, un WordPress) qui a besoin d’une base de données (PostgreSQL).
Fichier docker-compose.yml :
# version: '3.8' # La version est maintenant souvent optionnelle
services:
# Le premier service : notre application web
web:
# On pourrait construire notre propre image avec 'build: .'
# Ici, on utilise une image WordPress existante pour l'exemple
image: wordpress:latest
ports:
# On mappe le port 8080 de notre machine sur le port 80 du conteneur
- "8080:80"
environment:
# On passe des variables d'environnement pour configurer la connexion à la base de données
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: mon_mot_de_passe_secret
WORDPRESS_DB_NAME: wordpress
# Ce service dépend du service 'db' et ne démarrera qu'après lui
depends_on:
- db
# Le deuxième service : la base de données
db:
image: postgres:15-alpine
environment:
POSTGRES_DB: wordpress
POSTGRES_USER: wordpress
POSTGRES_PASSWORD: mon_mot_de_passe_secret
volumes:
# On monte un volume pour que les données de la DB persistent
# même si le conteneur est supprimé.
- db_data:/var/lib/postgresql/data
# Définition des volumes nommés
volumes:
db_data:
Le réseau automatique
Un des grands avantages de Docker Compose est qu’il crée automatiquement un réseau privé pour votre application. Tous les services définis dans le même fichier peuvent communiquer entre eux en utilisant simplement leur nom de service comme nom d’hôte.
Dans l’exemple ci-dessus, le service web peut se connecter à la base de données à l’adresse db:5432.
Commandes essentielles
docker compose up: Crée (si nécessaire) et démarre tous les services définis dans ledocker-compose.yml.- Ajoutez
-dpour lancer en mode détaché (en arrière-plan).
- Ajoutez
docker compose down: Arrête et supprime les conteneurs, les réseaux et (optionnellement) les volumes créés parup. C’est le moyen propre de tout nettoyer.docker compose ps: Liste les conteneurs de votre application.docker compose logs <nom_service>: Affiche les logs d’un service spécifique.- Ajoutez
-fpour suivre les logs en temps réel.
- Ajoutez
docker compose exec <nom_service> <commande>: Exécute une commande à l’intérieur d’un conteneur en cours d’exécution.docker compose exec db psql -U wordpress
Bonnes pratiques
- Utilisez Docker Compose pour tous vos environnements de développement locaux. C’est le moyen le plus simple de s’assurer que tous les développeurs travaillent avec la même pile de services.
- Séparez la configuration de l’application. Utilisez des variables d’environnement et un fichier
.envpour ne pas écrire de secrets (mots de passe, clés d’API) en dur dans votredocker-compose.yml. - Utilisez des volumes nommés pour la persistance des données.
Exercices
-
Créez votre premier
docker-compose.yml:- Créez un nouveau dossier.
- À l’intérieur, créez un fichier
docker-compose.yml. - Définissez un seul service nommé
webserver, basé sur l’imagenginxdemos/hello:latest, et mappez le port8888de votre machine sur le port80du conteneur.
-
Lancez et inspectez l’application :
- Dans le terminal, à la racine de votre dossier, lancez
docker compose up -d. - Vérifiez que le conteneur tourne avec
docker compose ps. - Ouvrez votre navigateur à l’adresse
http://localhost:8888. Vous devriez voir une page de test Nginx.
- Dans le terminal, à la racine de votre dossier, lancez
-
Nettoyez :
- Affichez les logs de votre service
webserver. - Arrêtez et supprimez tout avec
docker compose down. - Vérifiez avec
docker ps -aqu’il n’y a plus de conteneurs.
- Affichez les logs de votre service