7.1 Pourquoi Docker Compose ?
Un conteneur répond à un besoin précis : exécuter un processus dans un environnement isolé. Une application complète comprend souvent plusieurs composants : un serveur web, une API, une base de données, un cache ou un service de traitement.
Avec Docker seul, chaque conteneur peut être géré séparément. Mais il faut alors conserver la cohérence des paramètres : réseaux, volumes, ports, variables et ordre de démarrage.
Docker Compose permet de décrire cet ensemble dans un fichier de configuration, puis de gérer les services comme un projet. Compose ne remplace pas Docker Engine : il s'appuie sur lui pour créer et gérer les objets Docker.
Docker exécute les conteneurs ; Compose décrit et coordonne les ressources nécessaires à une application composée de plusieurs services.
7.2 Le modèle déclaratif et le projet Compose
Compose adopte une approche déclarative : on décrit la configuration attendue de l'application plutôt que d'énumérer toutes les étapes de création de chaque conteneur.
Le fichier Compose est une déclaration de configuration, pas une photographie de l'état réel. Compose interprète cette déclaration et demande à Docker Engine les opérations nécessaires lors des commandes de gestion.
| Notion | Signification | Pour approfondir |
|---|---|---|
| Projet | Ensemble logique de services et de ressources gérés ensemble, identifié par un nom de projet. | |
| Service | Définition d'un composant applicatif et de sa configuration ; il peut correspondre à un ou plusieurs conteneurs. | |
| Conteneur | Instance concrète exécutée à partir de la définition d'un service. | |
| Ressources | Réseaux et volumes éventuellement créés ou réutilisés par le projet. |
Le nom du projet sert notamment à regrouper et identifier les ressources. Plusieurs projets Compose peuvent cohabiter sur une même machine, avec des noms et des ressources distincts.
7.3 La structure d’un fichier compose.yaml
Le fichier usuel est compose.yaml (ou compose.yml). Il utilise le format YAML, où l'indentation structure les relations entre les éléments.
Et si nous reprenions notre exemple d’architecture comme fil rouge pour découvrir le fichier compose.yaml ?
Un fichier Compose regroupe les définitions des services et les ressources partagées du projet. Voici une vue simplifiée de sa structure :
services:
nom_de_mon_service:
image: mon_image:semver
ports: (...)
environment: (...)
secrets: (...)
volumes: (...)
networks: (...)
healthcheck: (...)
depends_on: (...)
networks: (...)
volumes: (...)
secrets: (...)
Explication du fichier Compose :
| Élément à découvrir | Comment le lire ? | Pour comprendre la suite |
|---|---|---|
services | Au niveau racine, cette clé regroupe les composants de l’application. nom_de_mon_service est un nom de service choisi dans le projet. | 7.4 — Services, images et construction |
image / build | Indiquent quelle image utiliser ou comment la construire. Ici, le service référence une image par son nom et son tag. | 7.4 — Services, images et construction |
ports / networks | Décrivent l’accès depuis l’hôte et les réseaux auxquels les services sont connectés. La clé networks au niveau racine déclare les réseaux du projet. | 7.5 — Réseaux et communication |
volumes | Sous un service, décrit les montages. Au niveau racine, déclare les volumes nommés du projet. | 7.6 — Volumes et persistance |
environment / secrets | Fournissent la configuration et l’accès aux données sensibles. Les secrets sont déclarés au niveau racine, puis attribués aux services concernés. | 7.7 — Configuration, variables et secrets |
depends_on / healthcheck | Décrivent les dépendances de démarrage et les contrôles de santé. | 7.8 — Dépendances et disponibilité |
commencer par identifier les services, puis lire leur configuration. Les ressources déclarées au niveau racine sont référencées par les services qui les utilisent. Toutes les clés présentées ne sont pas obligatoires pour chaque service.
Un exemple complet sera présenté en 7.11 — Scénario : NGINX, WordPress et MariaDB, après l’explication de ces notions.
7.4 Services, images et construction
Un service Compose définit la façon dont un composant doit être exécuté. Il peut préciser l'image, la commande, les variables, les ports, les montages et les réseaux.
Deux modes d'obtention de l'image sont fréquents :
image: nginx:stable: Référence une image par son nom et son tag.services: web: image: nginx:stablebuild: ./api: Décrit un contexte de construction local, généralement associé à un Dockerfile.services: api: build: ./apiLe chemin
./apidésigne le contexte de construction, relatif au fichier Compose. Par défaut, Compose y cherche un fichier nomméDockerfile.Exemple minimal de
./api/Dockerfile:FROM nginx:stable-alpine COPY index.html /usr/share/nginx/html/index.htmlFROMchoisit l’image de base.COPYcopie le fichier./api/index.htmldans l’image construite, à l’emplacement servi par NGINX.Ainsi,
build: ./apifournit le dossier de construction ;./api/Dockerfiledécrit comment construire l’image du serviceapi. Le nomapiest ici un nom de service : cet exemple minimal sert une page HTML.
7.5 Réseaux et communication entre services
Compose crée généralement un réseau par défaut propre au projet.
Les services connectés à un même réseau peuvent communiquer entre eux en utilisant leur nom de service comme nom DNS, sans dépendre d'une adresse IP de conteneur susceptible de changer.
Voir le chapitre 5, section 5.2.3 — Résolution DNS sur un réseau bridge utilisateur.
1. Déclarer les réseaux et y connecter les services
Dans notre architecture, nous choisissons deux réseaux explicites. Voici uniquement les éléments concernés du fichier Compose :
services:
web:
networks:
- frontend
app:
networks:
- frontend
- backend
db:
networks:
- backend
networks:
frontend:
backend:
La clé networks au niveau racine déclare les deux réseaux du projet. Sous chaque service, networks indique à quels réseaux ses conteneurs sont connectés.
webpeut joindreappsurfrontend. NGINX utilise l’adresseapp:80dans sa configuration.apppeut joindredbsurbackend. WordPress utilise l’adressedb:3306pour sa connexion à MariaDB.webest uniquement surfrontendetdbuniquement surbackend: ils ne partagent aucun réseau.
Connecter app aux deux réseaux ne crée pas automatiquement une liaison réseau directe entre web et db. Voir le chapitre 5, section 5.2.4 — Règles de communication et sécurisation.
2. Publier un port sur l’hôte
services:
web:
ports:
- "8080:80"
La clé ports est placée sous le service web. La valeur "8080:80" associe le port 8080 de l’hôte au port 80 du conteneur NGINX.
Grâce à cette publication, le client sur l’hôte peut atteindre NGINX à l’adresse localhost:8080. Sans elle, une connexion à localhost:8080 ne serait pas transmise au port 80 du conteneur web.
Points intéressants :
- Les échanges entre
webetapp, puis entreappetdb, se font directement sur les réseaux Docker qu’ils partagent, viaapp:80etdb:3306. - Publier les ports d’
appet dedbsur l’hôte est donc inutile pour ces échanges. - Dans notre architecture, il est recommandé de ne pas les publier afin de limiter l’exposition de l’application et de la base de données.
- Seul
webpossède une déclarationports, car c’est le seul service qui doit être joignable depuis l’hôte.
Pour approfondir la différence entre port interne et port publié, voir le chapitre 5, section 5.3 — Ports et exposition des services.
networks définit les réseaux partagés par les services ; ports rend un port de conteneur accessible via un port de l’hôte.
7.6 Volumes et persistance des données
Les données écrites dans la couche modifiable d’un conteneur sont perdues lorsque ce conteneur est supprimé. Notre architecture utilise donc des montages pour fournir la configuration et conserver les données.
1. Fournir un fichier de l’hôte : le bind mount
services:
web:
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
./nginx/default.confest le fichier source sur l’hôte, dont le chemin est relatif au fichier Compose./etc/nginx/conf.d/default.confest son emplacement dans le conteneur.:rorend ce montage accessible en lecture seule dans le conteneur.
Il y a deux possibilités :
:ro→ Lecture seule : le conteneur peut lire les fichiers, mais ne peut pas les modifier via ce montage.:rw→ Lecture et écriture : le montage permet de lire et de modifier les fichiers. C’est le mode par défaut si aucune option n’est précisée.
Ces modes ne modifient pas les permissions du fichier sur l’hôte !
NGINX lit ainsi la configuration fournie par l’hôte, sans reconstruire son image. Ce montage fournit un fichier ; il ne décrit pas lui-même le comportement du serveur.
2. Conserver les données : les volumes nommés
services:
app:
volumes:
- wordpress_data:/var/www/html
db:
volumes:
- db_data:/var/lib/mysql
volumes:
wordpress_data:
db_data:
- Au niveau racine,
volumesdéclare les volumes nommés du projet. - Sous
app,wordpress_dataest monté dans/var/www/htmlpour conserver les fichiers WordPress. - Sous
db,db_dataest monté dans/var/lib/mysqlpour conserver les données MariaDB.
| Stockage | Caractéristique |
|---|---|
| Volume nommé | Géré par Docker ; adapté à la conservation des données applicatives. |
| Bind mount | Associe un chemin de l’hôte à un chemin du conteneur ; utile notamment pour fournir une configuration. |
un volume nommé peut survivre à la suppression du conteneur, mais il peut lui-même être supprimé. La persistance ne remplace pas une sauvegarde.
Pour aller plus loin : Compose peut référencer un volume déclaré comme external, déjà existant et dont le cycle de vie est géré en dehors du projet. Ce n’est pas le cas des deux volumes de notre scénario.
7.7 Configuration, variables et secrets
La configuration peut être fournie au démarrage, sans être intégrée à l’image. Notre scénario distingue les paramètres ordinaires et les mots de passe.
| Mécanisme | Fonction |
|---|---|
Interpolation ${VARIABLE} | Compose remplace une valeur du YAML à partir de son environnement ou de sources telles qu’un fichier .env. |
environment / env_file | Fournit des variables au processus exécuté dans le conteneur. |
secrets | Rend des données sensibles accessibles aux services autorisés, sous forme de fichiers dans notre scénario. |
1. Fournir les paramètres avec environment
services:
app:
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD_FILE: /run/secrets/db_password
db:
environment:
MARIADB_DATABASE: wordpress
MARIADB_USER: wordpress
MARIADB_PASSWORD_FILE: /run/secrets/db_password
MARIADB_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
Ces noms de variables sont reconnus par les images WordPress et MariaDB : Compose les transmet, et les images définissent leur signification.
| Variable | Rôle dans notre scénario |
|---|---|
WORDPRESS_DB_HOST | Adresse de MariaDB : nom de service db et port interne 3306. |
WORDPRESS_DB_NAME / WORDPRESS_DB_USER | Base et compte utilisés par WordPress. |
MARIADB_DATABASE / MARIADB_USER | Base et compte applicatif à créer lors de l’initialisation de MariaDB. |
WORDPRESS_DB_PASSWORD_FILE / MARIADB_PASSWORD_FILE | Chemin du fichier contenant le même mot de passe pour le compte applicatif, lu par chaque image. |
MARIADB_ROOT_PASSWORD_FILE | Chemin du fichier contenant le mot de passe du compte root de MariaDB. |
Les variables d’initialisation de MariaDB s’appliquent à une base nouvellement initialisée. Modifier ces valeurs dans Compose ne modifie pas automatiquement les comptes d’une base déjà conservée dans db_data.
2. Déclarer les secrets et les attribuer aux services
services:
app:
secrets:
- db_password
db:
secrets:
- db_password
- db_root_password
secrets:
db_password:
file: ./secrets/db_password.txt
db_root_password:
file: ./secrets/db_root_password.txt
- Au niveau racine,
secretsdéclare les secrets et leurs fichiers sources sur l’hôte. - Sous chaque service,
secretsaccorde l’accès aux secrets nécessaires :appreçoit le mot de passe applicatif ;dbreçoit les deux.webne reçoit aucun secret. - Compose les rend accessibles dans les conteneurs sous
/run/secrets/db_passwordet, pour MariaDB uniquement,/run/secrets/db_root_password. - Les variables
_FILEde l’extrait précédent indiquent aux images où lire ces mots de passe. Ce suffixe est une convention prise en charge par ces images, pas un mécanisme universel de Compose.
3. Utiliser l’interpolation
Exemple d’interpolation d’une valeur non sensible
À côté de compose.yaml, le fichier .env peut contenir :
DB_NAME=wordpress
Compose peut utiliser cette valeur dans le fichier YAML :
services:
app:
environment:
WORDPRESS_DB_NAME: ${DB_NAME}
db:
environment:
MARIADB_DATABASE: ${DB_NAME}
- Compose lit
DB_NAMEdepuis son environnement ou le fichier.env; une valeur dans son environnement est prioritaire. - Il remplace
${DB_NAME}parwordpressavant de créer les conteneurs : c’est l’interpolation. - La clé
environmenttransmet ensuiteWORDPRESS_DB_NAME=wordpressà WordPress etMARIADB_DATABASE=wordpressà MariaDB. Le nomDB_NAMEn’est pas automatiquement transmis aux conteneurs.
Pour l’interpolation, seules les variables référencées dans compose.yaml fournissent les valeurs à remplacer. Les autres variables présentes dans .env ne sont pas automatiquement injectées dans les conteneurs.
Une variable utilisée dans compose.yaml peut aussi servir à définir un port ou une image. Sa valeur n’est transmise au conteneur comme variable d’environnement que si elle est déclarée pour l’environnement de ce service.
La forme ${DB_NAME:-wordpress} fournit une valeur par défaut si la variable est absente ou vide.
La forme ${DB_NAME:?Définir DB_NAME} demande une valeur non vide et signale une erreur sinon.
${DB_NAME:?Définir DB_NAME}:?est la syntaxe : elle exige une variable définie et non vide.Définir DB_NAMEest le texte affiché si cette condition n’est pas remplie. Ce message est libre et peut être écrit en français.
Choisir un autre fichier pour l’interpolation
Par défaut, Compose utilise le fichier .env.
Pour utiliser, par exemple, .env.production, on le sélectionne avec l’option --env-file :
docker compose --env-file ./.env.production up
Le comportement de l’interpolation reste identique.
4. Fournir les variables avec env_file
Déclarer env_file sous un service permet de fournir au conteneur les variables contenues dans un fichier :
services:
app:
env_file:
- ./app.env
Le fichier app.env contient des lignes de la forme NOM=valeur, par exemple WORDPRESS_DB_NAME=wordpress.
Compose transmet TOUTES ces variables au conteneur app.
- Le fichier
.envutilisé pour l’interpolation n’injecte pas automatiquement ses variables dans les conteneurs. Compose utilise leurs valeurs pour remplacer les expressions${VARIABLE}danscompose.yaml; leur utilisation sousenvironmentpermet ensuite de les transmettre au conteneur. - Déclarer
env_filesous un service transmet toutes les variables du fichier ciblé au conteneur de ce service, sauf celles remplacées parenvironment. Les noms doivent correspondre à ceux attendus par l’application : pour WordPress, le fichier doit par exemple contenirWORDPRESS_DB_NAME=wordpress, et pas simplementDB_NAME=wordpress.
L’interpolation et env_file sont des possibilités complémentaires ; notre YAML final utilise directement environment et secrets.
7.8 Dépendances et disponibilité des services
Démarré ne signifie pas prêt : une base de données peut avoir lancé son processus sans encore accepter les connexions applicatives.
1. Exprimer les dépendances de démarrage
services:
web:
depends_on:
- app
app:
depends_on:
db:
condition: service_healthy
- Pour
web, la forme simple demande queappsoit démarré avant lui. Elle ne vérifie pas que WordPress est prêt à répondre. - Pour
app, la forme détaillée aveccondition: service_healthyattend que le contrôle de santé dedbindique un état sain avant son démarrage.
2. Définir le contrôle de santé de MariaDB
services:
db:
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 10s
timeout: 5s
retries: 10
| Élément | Lecture |
|---|---|
test | Commande du contrôle, exécutée dans le conteneur. Le script healthcheck.sh est fourni par l’image MariaDB. |
CMD | Exécute directement la commande et ses arguments, sans passer par un shell. |
--connect / --innodb_initialized | Vérifient la possibilité de connexion et l’initialisation d’InnoDB, le moteur de stockage. |
interval: 10s | Intervalle entre les contrôles. |
timeout: 5s | Durée maximale d’un contrôle avant qu’il soit considéré en échec. |
retries: 10 | Nombre d’échecs consécutifs avant que le conteneur soit déclaré non sain. |
Ces étapes ne sont pas équivalentes.
- Le contrôle de santé évalue les critères définis → il ne garantit pas que tout le site fonctionne.
- Un état non sain ne provoque pas, à lui seul, un redémarrage automatique par Compose.
Ces dépendances organisent le démarrage. Après celui-ci, une application robuste doit aussi gérer les indisponibilités et les reconnexions : depends_on ne remplace pas ce comportement applicatif.
7.9 Cycle de vie et portée de Compose
Une fois les services et leurs ressources décrits, Compose permet de gérer leur cycle de vie comme un projet. Dans notre scénario, cela concerne web, app, db, leurs réseaux et leurs volumes.
Compose est couramment utilisé au moyen de la commande docker compose (plugin Compose moderne). Il interagit avec Docker Engine et gère les ressources du projet.
| Commande (repère théorique) | Signification |
|---|---|
docker compose up | Crée et démarre les services du projet, en réconciliant une partie de leur configuration. |
docker compose ps | Présente l'état des conteneurs du projet. |
docker compose logs | Consulte les journaux des services. |
docker compose stop | Arrête les conteneurs sans supprimer les ressources du projet. |
docker compose down | Arrête et supprime les conteneurs et réseaux du projet créés par Compose ; les volumes nommés ne sont pas supprimés par défaut. |
La forme historique docker-compose (avec trait d'union) se rencontre encore dans d'anciens supports ; la syntaxe moderne est docker compose.
La déclaration Compose décrit l'application.
Docker Engine reste chargé de l'exécution effective des conteneurs sur l'hôte ciblé.
7.10 Compose et Kubernetes : deux niveaux différents
Notre fichier décrit une application cohérente sur un hôte Docker. Cela ne lui apporte pas automatiquement les capacités d’un orchestrateur de cluster.
Compose et Kubernetes utilisent tous deux des descriptions déclaratives, mais ils ne répondent pas au même besoin opérationnel.
| Docker Compose | Kubernetes |
|---|---|
| Décrit et gère une application composée de services, généralement sur un moteur Docker. | Orchestre des charges de travail sur un ensemble de nœuds. |
| Adapté notamment aux environnements de développement, de test et à des déploiements simples. | Conçu pour la planification, le maintien de l'état souhaité et la gestion d'applications distribuées. |
| Peut démarrer plusieurs instances d'un service selon les contraintes de l'hôte. | Dispose de contrôleurs de réconciliation et de mécanismes d'ordonnancement sur les nœuds. |
Compose ne constitue pas, à lui seul, un orchestrateur de cluster comparable à Kubernetes. Le fait de décrire plusieurs conteneurs dans un fichier YAML ne suffit pas à fournir les mêmes mécanismes de disponibilité, de placement et de reprise.
Compose structure une application multi-services ; Kubernetes orchestre des charges de travail à l'échelle d'un cluster.
7.11 Scénario : NGINX, WordPress et MariaDB
1. Architecture
Reprenons notre architecture du chapitre 5, section 5.2.4 — Règles de communication et sécurisation : un serveur web sur le réseau frontend, une application connectée aux deux réseaux, et une base de données accessible uniquement sur backend.
Lecture de l’architecture :
- Le client atteint
webvialocalhost:8080sur l’hôte. - NGINX transmet à
app:80surfrontend. - WordPress contacte MariaDB via
db:3306surbackend. - Le conteneur
dbn’est ni connecté àfrontend, ni publié sur l’hôte.
2. Le fichier de configuration
Afin de déclarer cette architecture avec Docker Compose, nous pourrions utiliser le fichier compose.yaml suivant :
services:
web:
image: nginx:stable-alpine
ports:
- "8080:80"
volumes:
# Bind mount : fichier de configuration NGINX fourni par l'hôte
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
networks:
- frontend
depends_on:
- app
app:
image: wordpress:php8.3-apache
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD_FILE: /run/secrets/db_password
secrets:
- db_password
volumes:
# Volume nommé : conservation des fichiers WordPress
- wordpress_data:/var/www/html
networks:
- frontend
- backend
depends_on:
db:
condition: service_healthy
db:
image: mariadb:11.4
environment:
MARIADB_DATABASE: wordpress
MARIADB_USER: wordpress
MARIADB_PASSWORD_FILE: /run/secrets/db_password
MARIADB_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
secrets:
- db_password
- db_root_password
volumes:
# Volume Docker : persistance des données MariaDB
- db_data:/var/lib/mysql
networks:
- backend
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 10s
timeout: 5s
retries: 10
networks:
frontend:
backend:
volumes:
wordpress_data:
db_data:
secrets:
db_password:
file: ./secrets/db_password.txt
db_root_password:
file: ./secrets/db_root_password.txt
3. Services et communications
Le fichier déclare trois services. Leurs réseaux et leurs ports déterminent les communications possibles.
| Service | Rôle et communications |
|---|---|
web | Utilise l’image NGINX et appartient à frontend. La déclaration 8080:80 publie son port HTTP : le port 8080 de l’hôte donne accès au port 80 du conteneur. |
app | Utilise l’image WordPress avec Apache. Il appartient à frontend et backend : NGINX peut le joindre sur app:80, et WordPress peut joindre MariaDB sur db:3306. Aucun de ses ports n’est publié sur l’hôte. |
db | Utilise l’image MariaDB et appartient uniquement à backend. Aucun port n’est publié sur l’hôte ; web et db ne partagent aucun réseau. |
Les noms app et db servent d’adresses sur les réseaux partagés. Les ports 80 et 3306 sont les ports internes des services, indépendamment du port publié pour NGINX.
Pour approfondir : 7.5 — Réseaux et communication entre services.
4. Configuration et données persistantes
Les trois montages répondent à deux besoins : fournir une configuration depuis l’hôte et conserver les données de l’application.
| Montage | Fonction dans le scénario |
|---|---|
Bind mount de web | ./nginx/default.conf sur l’hôte est monté dans /etc/nginx/conf.d/default.conf. L’option :ro empêche NGINX de modifier ce fichier via le montage. |
wordpress_data | Ce volume nommé est monté dans /var/www/html pour conserver les fichiers WordPress indépendamment du conteneur app. |
db_data | Ce volume nommé est monté dans /var/lib/mysql pour conserver les données MariaDB indépendamment du conteneur db. |
Le fichier default.conf doit contenir la configuration NGINX qui transmet les requêtes à app:80.
Compose rend ce fichier accessible au conteneur ; le montage seul ne configure pas le reverse proxy.
Les volumes nommés sont déclarés au niveau racine puis référencés sous les services. Ils conservent les données lors du remplacement des conteneurs, tant que les volumes eux-mêmes ne sont pas supprimés.
Pour approfondir : 7.6 — Volumes et persistance des données.
5. Paramètres et accès aux secrets
Les paramètres ordinaires sont transmis avec environment. Les mots de passe sont fournis dans des fichiers secrets accessibles uniquement aux services auxquels ils sont attribués.
| Déclaration | Articulation dans le scénario |
|---|---|
Paramètres dans environment | WordPress reçoit l’adresse db:3306, le nom de base wordpress et le compte wordpress. MariaDB reçoit le nom de base et le compte à créer lors de sa première initialisation. |
secrets au niveau racine | Déclare db_password et db_root_password, à partir des fichiers ./secrets/db_password.txt et ./secrets/db_root_password.txt sur l’hôte. |
secrets sous les services | app reçoit uniquement db_password. db reçoit ce même secret et db_root_password. web ne reçoit aucun secret. |
Variables _FILE | Les images WordPress et MariaDB lisent les mots de passe aux chemins indiqués sous /run/secrets/. Le même secret applicatif permet à WordPress d’utiliser le compte configuré dans MariaDB ; le secret root reste réservé à MariaDB. |
Les fichiers secrets ne sont pas créés par cette déclaration : ils doivent exister sur l’hôte et rester protégés. Les variables _FILE sont reconnues par les images utilisées dans ce scénario.
Pour approfondir : 7.7 — Configuration, variables et secrets.
6. Ordre de démarrage et disponibilité
Les deux déclarations depends_on n’apportent pas la même garantie.
| Déclaration | Effet dans le scénario |
|---|---|
healthcheck de db | Le contrôle utilise healthcheck.sh pour tester la connexion et l’initialisation d’InnoDB. Il est exécuté toutes les 10s, avec un délai maximal de 5s par contrôle et 10 échecs consécutifs avant de déclarer le conteneur non sain. |
app dépend de db | condition: service_healthy demande à Compose d’attendre que la base soit déclarée saine avant de démarrer WordPress. |
web dépend de app | La forme courte depends_on: - app impose le démarrage d’app avant celui de web, mais n’attend pas que WordPress soit prêt à répondre aux requêtes HTTP. |
Une base déclarée saine ne garantit donc pas que tout le site est prêt. Ces dépendances de démarrage ne constituent pas une surveillance continue capable de rétablir automatiquement toute l’application.
Pour approfondir : 7.8 — Dépendances et disponibilité des services.
Le fichier Compose rassemble les choix de l’architecture dans une déclaration cohérente :
- Communications : NGINX est le point d’entrée publié ; WordPress relie les deux réseaux ; MariaDB reste sur
backend. - Configuration et données : un bind mount fournit la configuration NGINX ; deux volumes nommés conservent les fichiers WordPress et les données MariaDB.
- Paramètres et secrets : les services reçoivent les paramètres et les fichiers secrets nécessaires à leur rôle.
- Démarrage : WordPress attend une base saine, mais la disponibilité HTTP de l’ensemble n’est pas garantie par ces seules déclarations.
7.12 Ce qu’il faut retenir
1. Compose et projet
Le fichier compose.yaml décrit la configuration attendue d’une application multi-services
Un projet regroupe ses services et ses ressources.
Docker Engine exécute les conteneurs.
2. Service et conteneur
Un service est une définition
Un conteneur en est une instance.
image désigne l’image à utiliserbuild décrit sa construction.
3. Structure
services décrit les composants.
Les réseaux, volumes et secrets déclarés au niveau racine sont référencés par les services qui les utilisent.
4. Réseaux et ports
Les services partageant un réseau peuvent communiquer par leur nom de service et leur port interne.ports publie un port sur l’hôte
Un service peut appartenir à plusieurs réseaux.
5. Stockage
Un bind mount rend un fichier ou dossier de l’hôte accessible au conteneur
Un volume nommé conserve des données indépendamment du conteneur.
⚠️ La persistance ne remplace pas une sauvegarde.
6. Modes de montage
:ro impose la lecture seule:rw autorise lecture et écriture au niveau du montage et constitue le mode par défaut.
⚠️ Ces options ne changent pas les permissions des fichiers sur l’hôte.
7. Variables du conteneur
environment les déclare dans le YAMLenv_file les fournit depuis un fichier.
Pour une même variable, environment est prioritaire.
8. Interpolation
Compose remplace les expressions ${VARIABLE} à partir de son environnement ou du fichier .env, que --env-file permet de remplacer.
⚠️ Ce fichier n’injecte pas automatiquement toutes ses variables dans les conteneurs.
9. Valeurs attendues
${VARIABLE:-valeur} fournit une valeur par défaut si la variable est absente ou vide${VARIABLE:?message} exige une valeur non vide.
Les noms des variables du conteneur doivent correspondre à ceux reconnus par l’image ou l’application.
10. Secrets
Ils sont déclarés au niveau racine puis attribués aux services autorisés.
Dans notre scénario, ils sont accessibles sous /run/secrets/
Les variables _FILE indiquent aux images compatibles où les lire.
⚠️ Les fichiers sources sur l’hôte restent à protéger.
11. Démarrage et disponibilité
depends_on exprime les dépendanceshealthcheck évalue la santé d’un service.condition: service_healthy attend un état sain, sans garantir que tout le site est prêt.
12. Cycle de vie
up crée ou actualise et démarre l’applicationstop arrête les conteneursdown supprime les conteneurs et réseaux du projet créés par Compose, sans supprimer les volumes nommés par défaut.
13. Portée
Compose gère une application sur un moteur Docker
Il ne fournit pas à lui seul l’orchestration d’un cluster comparable à Kubernetes.
Documentation officielle : Docker Compose et Compose file reference.