Principes de base de l’Orchestration de conteneurs, application avec Docker Compose.
2026-09-30
L’orchestration consiste à coordonner plusieurs conteneurs au sein d’une même application. Si kubernetes de Google est l’outil de référence pour les déploiements complexes, docker compose offre une alternative plus simple pour les architectures modestes.
Docker compose, disponible comme plugin de Docker, permet de décrire une architecture multi-conteneurs dans un fichier YAML (docker-compose.yml). Il gère les services, volumes et réseaux avec la même syntaxe que Docker, simplifiant ainsi le déploiement d’applications conteneurisées.
compose.yml) pour définir les services, réseaux et volumes.Les exemples suivants sont accessibles dans le dépôt :
✅ : ebpro/notebook-containers-intro-sample-java-restjpa
/home/jovyan/work/examples/github/ebpro/notebook-containers-intro-sample-java-restjpaClone Command:
docker-compose.yml ou compose.yml.compose.yml (ou docker-compose.yml) s’articule autour de quatre piliers principaux.
services : C’est le cœur du fichier. Chaque service définit comment instancier un conteneur (image, build, variables d’environnement, dépendances).networks : Définit les ponts de communication. Par défaut, Compose crée un réseau pour le projet, mais vous pouvez isoler (ex: frontend vs backend).volumes : Déclare les espaces de stockage qui survivent à la suppression des conteneurs (docker compose down).configs / secrets : Permet de monter des fichiers de configuration ou des données sensibles de manière sécurisée (souvent utilisé avec Swarm ou les versions récentes de Compose).Un service dans Docker Compose correspond à un conteneur Docker. Chaque service peut spécifier une image Docker à utiliser ou un contexte de construction pour créer l’image. Les services peuvent également définir des variables d’environnement, des ports exposés, des volumes montés, et des dépendances entre eux.
docker-compose.yml
Pour démarrer une application multi-conteneurs, utilisez la commande docker compose up dans le répertoire contenant le fichier docker-compose.yml. L’option -d (detach) permet d’exécuter les conteneurs en arrière-plan :
La commande docker compose ls fournit une vue d’ensemble de tous les projets Docker Compose en cours d’exécution, affichant pour chacun son nom, le répertoire source, l’état des services et le nombre de conteneurs actifs.
La commande docker compose ps affiche les conteneurs du projet en cours, avec leurs noms générés automatiquement selon le format <projet>-<service>-<numéro>. Cette convention de nommage permet d’exécuter plusieurs instances du même projet dans différents répertoires ou de dupliquer des services sans conflits, à condition d’éviter les liaisons de volumes (bind mounts) et les mappages de ports fixes vers l’hôte.
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
notebook-containers-intro-sample-java-restjpa-app-1 docker.io/brunoe/restjpa:0.1.0 "java -jar /app/app.…" app 12 seconds ago Up 1 second (health: starting) 0.0.0.0:8088->8080/tcp, [::]:8088->8080/tcp
notebook-containers-intro-sample-java-restjpa-db-1 postgres:15.2-alpine "docker-entrypoint.s…" db 13 seconds ago Up 11 seconds (healthy) 5432/tcp
Docker Compose gère automatiquement les réseaux et volumes en les préfixant avec le nom du projet (par défaut, le nom du répertoire parent), permettant ainsi d’isoler les ressources entre différents projets et d’éviter les conflits de nommage, tout en facilitant leur identification et leur gestion avec des commandes comme docker compose down -v pour le nettoyage complet.
NETWORK ID NAME DRIVER SCOPE
7c3769659ab9 app-net bridge local
8fef64541bc6 bridge bridge local
cc35b78d4d3c host host local
aee8e3a815ab none null local
430cbc1c3ae9 restjpa-backend bridge local
76ded3c0f41f restjpa-frontend bridge local
La commande docker compose logs permet de visualiser les journaux d’un ou plusieurs services, avec des options utiles comme -f pour suivre les logs en temps réel, --tail pour limiter le nombre de lignes affichées, et --since pour filtrer par date, facilitant ainsi le diagnostic et la surveillance des applications multi-conteneurs.
db-1 | 2026-09-30 07:11:24.266 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
db-1 | 2026-09-30 07:11:24.266 UTC [1] LOG: listening on IPv6 address "::", port 5432
db-1 | 2026-09-30 07:11:24.286 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
db-1 | 2026-09-30 07:11:24.309 UTC [52] LOG: database system was shut down at 2026-09-30 07:11:24 UTC
db-1 | 2026-09-30 07:11:24.325 UTC [1] LOG: database system is ready to accept connections
app-1 | Picked up JAVA_TOOL_OPTIONS: -XX:+UseZGC -XX:+ZGenerational -Xmx512m -Xms512m
app-1 | 2026-09-30 07:11:33.942 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...
Docker Compose offre plusieurs commandes pour gérer le cycle de vie des services : stop pour arrêter les conteneurs, rm pour les supprimer, restart pour les redémarrer, et down pour tout nettoyer (conteneurs et réseaux) - avec l’option -v pour inclure également la suppression des volumes, qu’ils soient nommés ou anonymes.
Attention
La commande docker compose down -v supprime définitivement toutes les données persistées dans les volumes.
L’autre service app est une application JPA/REST Java dont l’image docker est produite par sample-java/restjpa/Dockerfile.
L’option build dans docker-compose.yml indique qu’il faut fabriquer l’image à partir du contexte courant (image sera alors son tag).
La sous-commande build de Docker Compose permet de construire les images à partir du contexte défini dans le fichier docker-compose.yml.
Il est aussi une sous-commande push pour pousser les images vers un registre (Docker Hub, GitHub Container Registry, …).
La fabrication de l’image sera automatique au démarrage au besoin avec up uniquement si l’image n’existe pas déjà localement ou si le Dockerfile a été modifié depuis la dernière construction. Pour forcer la reconstruction de l’image à chaque démarrage, utilisez l’option --build avec docker compose up.
La directive depends_on dans Docker Compose permet de gérer les dépendances entre services, mais va au-delà du simple ordre de démarrage grâce à la condition service_healthy qui, combinée avec des HEALTHCHECK (cf. Dockerfile), assure qu’un service est réellement opérationnel avant le démarrage des services qui en dépendent - par exemple, vérifier qu’une base de données accepte effectivement les connexions avant de lancer l’application qui l’utilise.
Les exemples suivants sont accessibles dans le dépôt :
✅ : ebpro/notebook-java-rest-sample-quarkus
/home/jovyan/work/examples/github/ebpro/notebook-java-rest-sample-quarkusClone Command:
L’exemple ci-dessous présente un exemple avancé en ajoutant un reverse proxy (https://traefik.io) et des outils de monitoring pour gérer les points d’entrées de l’application (sécurité, répartition de charges, …).
Commencez par le compose.yml qui est plus simple :
compose.prod.yml
LISEZ LE README (le début sur les conteneurs) très attentivement pour comprendre la configuration pour découvrir les meilleures pratiques utilisées dans cet exemple :
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
notebook-java-rest-sample-quarkus-postgres-1 postgres:16-alpine "docker-entrypoint.s…" postgres 33 seconds ago Up 26 seconds (healthy) 5432/tcp
notebook-java-rest-sample-quarkus-product-catalog-1 brunoe/product-catalog:1.0.0-jib "/opt/jboss/containe…" product-catalog 27 seconds ago Up 2 seconds (health: starting) 8080/tcp, 8443/tcp
notebook-java-rest-sample-quarkus-traefik-1 traefik:v3.0 "/entrypoint.sh --pi…" traefik 33 seconds ago Up 26 seconds (healthy) 0.0.0.0:8080->8080/tcp, [::]:8080->8080/tcp, 0.0.0.0:8888->80/tcp, [::]:8888->80/tcp, 0.0.0.0:5443->443/tcp, [::]:5443->443/tcp
Lorsque l’application grandit, un seul serveur devient vite une limite :
saturation CPU / RAM
point unique de panne
impossibilité de gérer la charge variable
On passe alors d’un outil pensé pour le développement local
à des outils conçus pour exploiter plusieurs machines
Un orchestrateur permet de :
Deux approches outils :
| Critère | Docker Swarm | Kubernetes (K8s) |
|---|---|---|
| Philosophie | Extension naturelle de Docker | Plateforme complète d’orchestration |
| Complexité | Simple et rapide à prendre en main | Plus complexe mais extrêmement puissant |
| Unité de déploiement | Service | Pod (groupe de conteneurs) |
| Installation | docker swarm init |
Installation plus lourde en production ou Cloud managé |
| Cas d’usage typique | PME, projets simples | Standard industriel, Cloud natif, Multi-cloud |
| Écosystème | Limité | Très vaste et extensible |
E. Bruno - Orchestration