Docker Compose : définition, fichier compose.yaml et exemple
L'outil qui décrit une application de plusieurs conteneurs dans un seul fichier et la lance en une commande : services, réseaux, volumes, variables, profils, exemple complet et comparaison avec Kubernetes.
Par Équipe Blent· Mis à jour le · 14 min de lecture· Niveau débutant
Docker Compose en bref
- Type
- Outil de définition d'applications multi-conteneurs
- Éditeur
- Docker Inc.
- Origine
- Fig (Orchard), racheté par Docker en 2014
- Fichier
- compose.yaml (ou docker-compose.yml)
- Commande
- docker compose (v2, plugin de la CLI)
- Format
- Compose Specification, standard ouvert
- Périmètre
- Un seul hôte Docker
Définition : Docker Compose
Docker Compose est un outil qui permet de définir et de lancer une application composée de plusieurs conteneurs à partir d'un seul fichier déclaratif, généralement nommé compose.yaml. Ce fichier décrit les services (une API, une base de données, un cache), les réseaux qui les relient, les volumes qui conservent leurs données et leurs variables d'environnement. La commande docker compose up crée alors l'ensemble, dans le bon ordre, sur une machine équipée de Docker. Intégré à la CLI Docker depuis la version 2, Compose est l'outil de référence pour les environnements de développement, les tests d'intégration et les déploiements simples sur un seul serveur.
En une phrase : Docker Compose décrit dans un fichier YAML tous les conteneurs d'une application et les lance ensemble avec une seule commande.
Dans cette définition
Qu'est-ce que Docker Compose ?
Docker Compose répond à un problème très concret. Une application réelle est rarement un seul conteneur : il faut une API, une base de données, un cache, parfois un worker et un reverse proxy. Les lancer un par un avec Docker, en n'oubliant ni le réseau, ni les volumes, ni les variables, devient vite fastidieux et source d'erreurs.
Compose remplace cette suite de commandes par un fichier déclaratif. Vous décrivez l'état voulu de l'application, Compose se charge de créer les ressources dans le bon ordre et de les supprimer proprement. L'outil est né sous le nom de Fig, développé par la start-up Orchard, rachetée par Docker en 2014. Fig est rapidement devenu Docker Compose. La première version, écrite en Python, s'installait séparément sous le nom docker-compose. La version 2, réécrite en Go, est intégrée à la CLI Docker et s'invoque avec docker compose ; depuis 2023, elle est la seule maintenue. Le format du fichier est désormais un standard ouvert, la Compose Specification.
Compose occupe une place précise : il orchestre plusieurs conteneurs, mais sur une seule machine. C'est l'outil idéal pour le développement, les tests et les déploiements simples. Pour répartir des conteneurs sur un cluster, assurer la haute disponibilité et l'autoscaling, on passe à Kubernetes.
À retenir : Docker construit et lance un conteneur, Docker Compose lance une application de plusieurs conteneurs sur une machine, Kubernetes orchestre des conteneurs sur un cluster.
Anatomie d'un fichier compose.yaml
Un fichier Compose s'organise autour de quelques sections de premier niveau.
services: le cœur du fichier. Chaque service correspond à un conteneur (ou à plusieurs répliques) avec sonimageou sonbuild, sesports, sacommand, sesvolumes, sonhealthchecket sa politiquerestart.networks: par défaut, Compose crée un réseau unique pour le projet, sur lequel chaque service est joignable par son nom. Déclarer plusieurs réseaux permet d'isoler des groupes de services, par exemple un réseau public pour le reverse proxy et un réseau interne pour la base.volumes: les volumes nommés conservent les données au-delà de la vie des conteneurs. Un montage de répertoire (./src:/app/src) sert plutôt en développement, pour voir le code modifié sans reconstruire l'image.- Variables d'environnement :
environmentles déclare directement,env_fileles charge depuis un fichier, et les références${VARIABLE}sont remplacées à partir du shell ou d'un fichier.env. profiles: rendent un service optionnel, activé seulement à la demande.secretsetconfigs: montent des fichiers sensibles ou de configuration dans les conteneurs, sans les intégrer aux images.
Plusieurs fichiers peuvent se combiner : compose.override.yaml est fusionné automatiquement, et l'option -f permet d'empiler par exemple un compose.prod.yaml au-dessus du fichier de base.
Exemple : une API avec PostgreSQL et Redis
Cette stack lance une API construite à partir du Dockerfile du projet, une base PostgreSQL dont les données sont conservées dans un volume, un cache Redis et, à la demande, une interface d'administration de la base.
services:
api:
build: .
ports:
- "8000:8000"
environment:
DATABASE_URL: postgresql://app:${POSTGRES_PASSWORD}@db:5432/app
REDIS_URL: redis://cache:6379/0
depends_on:
db:
condition: service_healthy
cache:
condition: service_started
restart: unless-stopped
db:
image: postgres:17
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: app
volumes:
- pgdata:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U app -d app"]
interval: 5s
timeout: 3s
retries: 10
cache:
image: redis:7-alpine
command: ["redis-server", "--appendonly", "yes"]
volumes:
- redisdata:/data
adminer:
image: adminer
ports:
- "8080:8080"
profiles: ["debug"]
volumes:
pgdata:
redisdata:
Plusieurs points méritent l'attention. L'API joint la base à l'adresse db et le cache à l'adresse cache : ce sont les noms des services. Seuls l'API et Adminer publient un port sur l'hôte ; la base et le cache restent accessibles uniquement depuis le réseau du projet. Grâce au healthcheck et à condition: service_healthy, l'API ne démarre que lorsque PostgreSQL accepte réellement les connexions. Enfin, le mot de passe n'est pas écrit dans le fichier : il vient d'un fichier .env, exclu du dépôt Git.
# Le mot de passe est lu depuis .env, à ne jamais versionner
echo "POSTGRES_PASSWORD=change-moi" > .env
# Construire l'image de l'API et lancer la stack en arrière-plan
docker compose up -d --build
# Suivre l'état et les journaux
docker compose ps
docker compose logs -f api
# Ouvrir un client SQL dans le conteneur de la base
docker compose exec db psql -U app -d app
# Lancer aussi les services du profil debug (Adminer)
docker compose --profile debug up -d
# Tout arrêter en conservant les volumes
docker compose down
# Ou tout supprimer, volumes et données compris
docker compose down -v
En développement, docker compose watch peut en plus synchroniser les fichiers modifiés ou reconstruire un service automatiquement à chaque changement. Pour aller plus loin sur la syntaxe, consultez notre article Docker Compose : tout savoir.
À quoi sert Docker Compose ?
Compose excelle partout où une application de quelques services doit être lancée vite, à l'identique, sur une seule machine.
Environnement de développement
Lancer l'application et toutes ses dépendances (base, cache, file de messages) en une commande, pour chaque développeur.
Tests d'intégration
Monter dans un pipeline CI un environnement complet et éphémère, puis le détruire après les tests.
Démonstrations et formations
Distribuer une stack complète, prête à démarrer, dans un dépôt Git.
Petits déploiements
Héberger une application interne ou un outil auto-hébergé sur un serveur unique.
Essayer un logiciel
Tester une stack d'observabilité, un outil de BI ou une base vectorielle à partir du fichier fourni par l'éditeur.
Prototypes de microservices
Valider le découpage et les échanges entre services avant de passer à un orchestrateur.
Quels sont les avantages de Docker Compose ?
Compose transforme une liste de commandes docker run fragiles en un fichier versionné, lisible et partagé par toute l'équipe.
- Toute l'application décrite dans un seul fichier YAML, versionné avec le code.
- Une seule commande pour démarrer, reconstruire ou arrêter l'ensemble.
- Un réseau et une résolution DNS par nom de service créés automatiquement.
- Gestion de l'ordre de démarrage et des healthchecks entre services.
- Profils, fichiers de surcharge et interpolation de variables pour adapter un même fichier à plusieurs contextes.
- Prise en main rapide, sans cluster ni infrastructure supplémentaire.
Quelles sont les limites de Docker Compose ?
Compose a été pensé pour une machine. Ses limites apparaissent dès que la production exige résilience et mise à l'échelle.
- Un seul hôte : pas de répartition des conteneurs sur plusieurs serveurs.
- Pas de haute disponibilité : si la machine tombe, toute l'application tombe.
- Mise à l'échelle manuelle et limitée, sans autoscaling.
- Mises à jour sans interruption difficiles à obtenir sans outillage complémentaire.
- Gestion des secrets rudimentaire comparée à un orchestrateur ou à un coffre-fort dédié.
Docker Compose vs Kubernetes : quelles différences ?
Les deux outils décrivent des applications multi-conteneurs de façon déclarative, mais ils ne jouent pas dans la même catégorie.
| Critère | Docker Compose | Kubernetes |
|---|---|---|
| Périmètre | Une seule machine | Un cluster de plusieurs nœuds |
| Description | Un fichier compose.yaml | Plusieurs manifestes (Deployment, Service, Ingress…) |
| Haute disponibilité | Non : la machine est un point unique de défaillance | Oui : redémarrage et replanification automatiques |
| Mise à l'échelle | Manuelle, sur la même machine | Manuelle ou automatique, sur tout le cluster |
| Mises à jour | Recréation des conteneurs | Rolling updates, retour arrière intégré |
| Réseau | Réseau du projet et DNS par nom de service | Services, Ingress, politiques réseau |
| Courbe d'apprentissage | Quelques heures | Plusieurs semaines |
| Idéal pour | Développement, tests, petits déploiements | Production à grande échelle, plateformes partagées |
Beaucoup d'équipes utilisent les deux : Compose sur le poste du développeur et dans les tests d'intégration du pipeline CI/CD, Kubernetes en production. Les images, elles, restent identiques. Pour faire vos premiers pas sur un cluster, suivez notre tutoriel Kubernetes.
Quand utiliser Docker Compose ?
Le critère déterminant est le nombre de machines et le niveau de disponibilité attendu.
Compose suffit
- L'application compte quelques services sur une seule machine.
- Vous voulez un environnement de développement reproductible.
- Un pipeline CI doit lancer des tests d'intégration complets.
- Une courte interruption lors des mises à jour est acceptable.
Passez à un orchestrateur
- L'application doit survivre à la panne d'un serveur.
- La charge varie et exige une mise à l'échelle automatique.
- Des dizaines de services sont gérés par plusieurs équipes.
- Les déploiements doivent être progressifs et sans interruption.
Outils associés à Docker Compose
Compose s'insère entre Docker, qu'il pilote, et les orchestrateurs, vers lesquels on migre quand l'application grandit.
- Moteur
Docker
Construit les images et exécute les conteneurs décrits dans le fichier Compose.
- Poste de travail
Docker Desktop
Fournit Docker Engine et Compose prêts à l'emploi sur macOS, Windows et Linux.
- Alternative
Podman
Moteur sans démon qui sait aussi exécuter des fichiers Compose.
- Orchestration
Docker Swarm
Mode cluster intégré à Docker, qui déploie des fichiers Compose sur plusieurs nœuds.
- Migration
Kompose
Convertit un fichier Compose en manifestes Kubernetes, comme point de départ d'une migration.
- Orchestration
Kubernetes
L'orchestrateur de référence quand l'application dépasse une seule machine.
- Reverse proxy
Traefik
Détecte les services Compose via leurs labels et leur route le trafic automatiquement.
- Intégration continue
GitLab CI/CD
Lance des environnements Compose éphémères pour les tests d'intégration.
Les concepts à connaître autour de Docker Compose
Ces notions permettent de situer Compose dans une chaîne de livraison moderne.
- ConteneurL'unité d'exécution isolée que Compose démarre pour chaque service.
- MicroservicesL'architecture qui découpe une application en services indépendants.
- Infrastructure as CodeLa description déclarative et versionnée de l'infrastructure, dont Compose applique le principe.
- CI/CDL'automatisation des tests et des déploiements, où Compose sert d'environnement éphémère.
- Reverse proxyLe point d'entrée HTTP placé devant les services d'une stack Compose.
- DevOpsLa culture qui fait du fichier Compose un contrat partagé entre développement et exploitation.
Ressources pour approfondir Docker Compose
Trois articles du blog Blent pour maîtriser Compose et préparer la suite.
- Guide
Docker Compose : tout savoir
La syntaxe du fichier Compose et ses usages, du développement au déploiement.
Lire l'article - Fondamentaux
Docker, à quoi ça sert ?
Les bases de Docker à maîtriser avant de composer plusieurs conteneurs.
Lire l'article - Tutoriel
Tutoriel Kubernetes : premiers pas
L'étape suivante pour déployer vos conteneurs sur un cluster.
Lire l'article
Questions fréquentes
Questions fréquentes
Expertise
À propos de l'auteur
Équipe Blent
Les ingénieurs et mentors Blent conçoivent, automatisent et mettent en production des infrastructures Cloud, et forment chaque année des centaines de professionnels au DevOps.
Sources et méthodologie
- Documentation officielle Docker Compose et Compose Specification (compose-spec.io)
- Documentation Kompose
- Retours d'expérience des projets et formations Blent
Comment fonctionne Docker Compose ?
Compose traduit un fichier déclaratif en une série d'opérations Docker, qu'il exécute dans le bon ordre et qu'il sait défaire.
Décrire l'application
Le fichier compose.yaml liste les services, chacun avec son image ou son contexte de build, ses ports, ses variables, ses volumes et ses dépendances.
Créer les ressources partagées
À l'exécution de docker compose up, Compose crée un réseau dédié au projet et les volumes nommés déclarés, préfixés par le nom du projet.
Construire ou tirer les images
Les services avec une section build sont construits localement ; les autres images sont téléchargées depuis leur registre.
Démarrer dans l'ordre
Les conteneurs sont lancés en respectant depends_on. Avec une condition service_healthy, Compose attend qu'un service réponde à son healthcheck avant de démarrer ceux qui en dépendent.
Relier les services
Sur le réseau du projet, chaque service est joignable par son nom : l'API contacte la base à l'adresse db:5432, sans adresse IP à gérer.
Exploiter puis tout arrêter
docker compose logs, ps et exec servent au suivi ; docker compose down supprime conteneurs et réseau, et l'option -v supprime aussi les volumes.