Docker Compose : déployer une application multi-conteneurs en 15 minutes
Temps de lecture : 12 min | Niveau : Débutant–Intermédiaire | Mis à jour : Février 2026
docker-compose.yml. Au lieu d'exécuter manuellement chaque conteneur, vous décrivez votre architecture dans un fichier YAML et lancez tout avec docker compose up. À l'issue de ce guide, vous saurez déployer une stack complète WordPress + MySQL sur votre machine.
Vous savez lancer un conteneur Docker avec docker run. Mais dans un projet réel, une application ne tourne jamais seule : elle a besoin d'une base de données, parfois d'un cache, d'un reverse proxy ou d'un service de file d'attente. Lancer et configurer chaque conteneur individuellement devient vite fastidieux et source d'erreurs.
C'est exactement le problème que résout Docker Compose. En un seul fichier, vous décrivez l'ensemble de votre infrastructure. Une seule commande la lance. Une seule commande l'arrête. C'est pour cette raison que Docker Compose est devenu un outil incontournable dans le workflow de tout développeur et de toute équipe DevOps.
docker run). Si ce n'est pas encore le cas, commencez par notre tutoriel Docker : lancer son premier conteneur.
Sommaire
- Docker Compose, c'est quoi ?
- Avec vs sans Docker Compose
- Anatomie d'un fichier docker-compose.yml
- Exercice : déployer WordPress + MySQL
- Les commandes essentielles
- Volumes et persistance des données
- Réseaux et communication entre services
- Variables d'environnement et fichier .env
- Bonnes pratiques
- Pour aller plus loin
Docker Compose, c'est quoi ?
Docker Compose est un outil qui permet de définir et d'exécuter des applications Docker composées de plusieurs conteneurs. Toute la configuration de vos services, réseaux et volumes est centralisée dans un seul fichier : docker-compose.yml.
L'analogie la plus parlante : imaginez un chef d'orchestre. Chaque musicien (conteneur) joue sa partition, mais c'est le chef (Compose) qui coordonne l'ensemble : qui démarre quand, qui communique avec qui, et où sont stockées les partitions (données).
Concrètement, Docker Compose vous permet de :
- Décrire votre stack complète dans un fichier versionnable (Git)
- Lancer tous vos conteneurs en une seule commande :
docker compose up - Arrêter tout proprement avec
docker compose down - Reproduire le même environnement partout : dev, test, production
- Partager votre configuration avec n'importe quel membre de l'équipe
docker compose (avec un espace), et non plus docker-compose (avec un tiret). Les deux fonctionnent souvent, mais préférez la nouvelle syntaxe.
Avec vs sans Docker Compose
Pour comprendre l'intérêt de Compose, comparons deux approches pour déployer la même application : un blog WordPress avec sa base de données MySQL.
Sans Docker Compose : commandes manuelles
Vous devez exécuter chaque conteneur séparément, dans le bon ordre, en vous souvenant de toutes les options :
# 1. Créer un réseau pour que les conteneurs communiquent
docker network create wp-network
# 2. Lancer MySQL avec toutes les variables
docker run -d \
--name mysql-db \
--network wp-network \
-e MYSQL_ROOT_PASSWORD=monmotdepasse \
-e MYSQL_DATABASE=wordpress \
-e MYSQL_USER=wpuser \
-e MYSQL_PASSWORD=wppass \
-v mysql-data:/var/lib/mysql \
mysql:8.0
# 3. Lancer WordPress en le reliant à MySQL
docker run -d \
--name wordpress-app \
--network wp-network \
-e WORDPRESS_DB_HOST=mysql-db \
-e WORDPRESS_DB_USER=wpuser \
-e WORDPRESS_DB_PASSWORD=wppass \
-e WORDPRESS_DB_NAME=wordpress \
-p 8080:80 \
-v wp-content:/var/www/html \
wordpress:latest
Problèmes : commandes longues, ordre de lancement important, configuration dispersée, difficile à partager.
Avec Docker Compose : un seul fichier
La même chose en un fichier docker-compose.yml :
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: monmotdepasse
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: wppass
volumes:
- mysql-data:/var/lib/mysql
wordpress:
image: wordpress:latest
depends_on:
- mysql
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: wppass
WORDPRESS_DB_NAME: wordpress
volumes:
- wp-content:/var/www/html
volumes:
mysql-data:
wp-content:
Puis une seule commande :
docker compose up -d
| Critère | Sans Compose | Avec Compose |
|---|---|---|
| Nombre de commandes | 3+ commandes longues | 1 seule commande |
| Configuration | Dispersée, mémorisée | Centralisée, versionnée |
| Partage | Copier-coller de commandes | Partager un fichier YAML |
| Reproductibilité | Faible (erreurs humaines) | Parfaite (fichier identique) |
| Réseau | Création manuelle | Automatique |
| Ordre de démarrage | À gérer soi-même | depends_on |
Anatomie d'un fichier docker-compose.yml
Un fichier Compose repose sur 3 concepts fondamentaux :
Services
Chaque service = un conteneur. Vous définissez l'image, les ports, les variables d'environnement, etc.
Volumes
Espaces de stockage persistants. Les données survivent à l'arrêt et à la suppression des conteneurs.
Réseaux
Canaux de communication entre services. Compose en crée un par défaut.
Voici la structure type d'un fichier docker-compose.yml annoté :
# Pas besoin de "version:" depuis Compose V2
services:
# Service 1 : votre application web
web:
image: nginx:latest # Image à utiliser
ports:
- "8080:80" # Port hôte:port conteneur
volumes:
- ./html:/usr/share/nginx/html # Bind mount (dev)
depends_on:
- db # Lance db avant web
restart: unless-stopped # Redémarre sauf arrêt manuel
# Service 2 : base de données
db:
image: mysql:8.0
environment: # Variables d'environnement
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: app
volumes:
- db-data:/var/lib/mysql # Volume nommé (persistant)
# Déclaration des volumes nommés
volumes:
db-data:
version: en haut du fichier n'est plus obligatoire. Si vous la voyez dans des tutoriels plus anciens (version: "3.8"), sachez qu'elle est ignorée par les versions récentes de Docker.
Exercice pratique : déployer WordPress + MySQL
Passons à la pratique. En 5 étapes, vous allez déployer un blog WordPress complet avec sa base de données.
-
Créer un dossier de projet
mkdir mon-wordpress && cd mon-wordpress -
Créer le fichier docker-compose.yml
Créez un fichier
docker-compose.ymlavec le contenu suivant :services: db: image: mysql:8.0 restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: rootpassword MYSQL_DATABASE: wordpress MYSQL_USER: wpuser MYSQL_PASSWORD: wppassword volumes: - db-data:/var/lib/mysql wordpress: image: wordpress:latest restart: unless-stopped depends_on: - db ports: - "8080:80" environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_USER: wpuser WORDPRESS_DB_PASSWORD: wppassword WORDPRESS_DB_NAME: wordpress volumes: - wp-data:/var/www/html volumes: db-data: wp-data: -
Lancer la stack
docker compose up -dLe flag
-dlance les conteneurs en arrière-plan. La première exécution télécharge les images (environ 1 minute). -
Vérifier que tout fonctionne
docker compose psVous devriez voir 2 conteneurs avec le statut "Up".
-
Ouvrir WordPress dans le navigateur
Rendez-vous sur http://localhost:8080. L'assistant d'installation WordPress s'affiche. Votre stack fonctionne.
Pour tout arrêter et nettoyer :
# Arrêter les conteneurs (conserve les données)
docker compose down
# Arrêter ET supprimer les volumes (perte des données)
docker compose down -v
Les commandes essentielles
| Commande | Description |
|---|---|
docker compose up -d |
Créer et démarrer tous les services en arrière-plan |
docker compose down |
Arrêter et supprimer les conteneurs (volumes conservés) |
docker compose down -v |
Arrêter, supprimer conteneurs ET volumes |
docker compose ps |
Lister les services et leur statut |
docker compose logs |
Afficher les logs de tous les services |
docker compose logs -f wordpress |
Suivre les logs d'un service en temps réel |
docker compose exec db bash |
Ouvrir un terminal dans un conteneur en cours d'exécution |
docker compose stop |
Arrêter les services sans les supprimer |
docker compose start |
Redémarrer les services arrêtés |
docker compose restart |
Redémarrer tous les services |
docker compose config |
Valider et afficher la configuration finale |
docker compose build |
Reconstruire les images (si vous utilisez un Dockerfile) |
Volumes et persistance des données
Sans volume, les données d'un conteneur disparaissent lorsqu'il est supprimé. En production, c'est inacceptable pour une base de données ou des fichiers uploadés. Docker Compose gère deux types de volumes :
| Type | Syntaxe | Usage |
|---|---|---|
| Volume nommé | db-data:/var/lib/mysql |
Production : données gérées par Docker, persistantes |
| Bind mount | ./src:/app |
Développement : synchronisation code local ↔ conteneur |
Les volumes nommés sont déclarés dans la section volumes: en bas du fichier. Ils survivent à docker compose down (sauf avec le flag -v). Les bind mounts lient un dossier de votre machine au conteneur, ce qui est idéal en développement pour voir vos modifications en temps réel.
Réseaux et communication entre services
Docker Compose crée automatiquement un réseau interne pour votre stack. Chaque service est accessible par les autres via son nom de service comme nom d'hôte.
Dans notre exemple WordPress, le service wordpress se connecte à MySQL en utilisant simplement db comme adresse. Pas besoin d'adresse IP, pas besoin de configuration réseau manuelle :
WORDPRESS_DB_HOST: db # "db" = le nom du service MySQL
Ce DNS interne est l'un des atouts majeurs de Docker Compose : chaque service peut contacter les autres par leur nom, de manière transparente et fiable.
ports: sont accessibles depuis l'extérieur. MySQL n'est donc pas accessible depuis votre navigateur, uniquement depuis WordPress.
Variables d'environnement et fichier .env
Mettre des mots de passe en clair dans docker-compose.yml est une mauvaise pratique, surtout si le fichier est versionné sur Git. La solution : utiliser un fichier .env.
Créez un fichier .env à côté de votre docker-compose.yml :
# .env
MYSQL_ROOT_PASSWORD=monmotdepasse_securise
MYSQL_DATABASE=wordpress
MYSQL_USER=wpuser
MYSQL_PASSWORD=wppassword_securise
Puis référencez ces variables dans votre docker-compose.yml :
services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
.env à votre fichier .gitignore pour ne jamais commiter vos secrets. Partagez plutôt un fichier .env.example avec des valeurs fictives.
Bonnes pratiques Docker Compose
-
Toujours utiliser
restart: unless-stopped— Vos services redémarrent automatiquement après un crash ou un reboot serveur, sauf si vous les arrêtez manuellement. -
Utiliser
depends_on— Définit l'ordre de démarrage des services. WordPress dépend de MySQL ? Compose lance MySQL en premier. -
Nommer vos volumes — Un volume nommé (
db-data) est plus facile à identifier et gérer qu'un volume anonyme. -
Séparer les environnements — Utilisez un fichier
docker-compose.override.ymlpour les spécificités de développement (bind mounts, ports de debug). - Utiliser des images officielles — Privilégiez les images avec le badge "Official" sur Docker Hub. Elles sont maintenues et auditées.
-
Valider avant de lancer —
docker compose configvérifie la syntaxe de votre fichier et affiche la configuration résolue. -
Externaliser les secrets — Ne jamais commiter de mots de passe. Utilisez un fichier
.envajouté au.gitignore.
Pour aller plus loin
Vous maîtrisez les fondamentaux de Docker Compose. Les sujets suivants vous permettront de passer au niveau supérieur :
- Dockerfile + Compose : construire vos propres images directement dans le fichier Compose avec
build: - Multi-environnement : utiliser des overrides pour adapter la config dev / staging / production
- Healthchecks : vérifier qu'un service est réellement opérationnel avant de démarrer ceux qui en dépendent
- Scaling : lancer plusieurs instances d'un service avec
docker compose up --scale web=3 - Docker Swarm / Kubernetes : passer à l'orchestration multi-serveurs pour la production à grande échelle
La formation Docker de Lenidit couvre Docker Compose en détail, ainsi que les Dockerfiles, volumes, réseaux, Swarm et les bonnes pratiques de mise en production.
Contenu : 3h de vidéo, 12 modules pratiques, accès illimité 24/7.
Tarif : 19€/mois pour l'accès à l'ensemble du catalogue. Attestation incluse.
Découvrir la formation Docker
Parcours Docker complet
- Découvrir Docker : comprendre la conteneurisation
- Tutoriel : lancer son premier conteneur
- Docker Compose : déployer une application multi-conteneurs (vous êtes ici)
- Formation Docker complète (3h de vidéo)
