Épisode 07 / 9Passer au projet35 min
Décrire un projet avec Docker Compose
Les commandes s’allongent, et une option oubliée suffit à tout changer. Compose écrit le projet dans un fichier : lisible, vérifiable, et relancé à l’identique en une commande.
Tapez les commandes dans PowerShell, avec Docker Desktop démarré : « Engine running » en bas à gauche.
Ajoutez sudo devant chaque commande docker, sauf si vous avez choisi le groupe docker à l’épisode 2.
Dans cet épisode
- Traduire une commande docker run en fichier compose.yaml
- Démarrer, observer, modifier et arrêter un projet avec quelques commandes
- Vérifier un fichier avant de le lancer
Relisez la dernière commande de l’épisode 5 : un nom, un port, un montage, une image. Il faudra la retaper à l’identique à chaque fois, sans rien oublier. Et dans six mois, qui se souviendra de toutes les options ?
Docker Compose écrit tout cela dans un fichier, compose.yaml. Vous le
relisez avant de le lancer, vous le sauvegardez, vous le recopiez sur une autre
machine : le projet se recrée à l’identique.
D’une commande à un fichier
Chaque option de docker run a sa place dans le fichier :
Dans docker run | Dans compose.yaml |
|---|---|
nginx:alpine | image: nginx:alpine |
-p 127.0.0.1:8084:80 | ports: puis - "127.0.0.1:8084:80" |
-v "${PWD}/site:/usr/share/nginx/html:ro" | volumes: puis - ./site:/usr/share/nginx/html:ro |
--restart unless-stopped | restart: unless-stopped |
-d | docker compose up -d |
--network … | Rien à écrire : Compose crée un réseau pour le projet |
Étape 1 : créer le projet
Un projet Compose est un dossier. Celui-ci contient un sous-dossier site, avec
la page, et le fichier compose.yaml à côté.
mkdir ~\docker-lab\compose-demo\site
cd ~\docker-lab\compose-demo
New-Item site\index.html, compose.yaml
Remplissez ensuite chaque fichier avec le Bloc-notes : notepad site\index.html,
puis notepad compose.yaml.
mkdir -p ~/docker-lab/compose-demo/site
cd ~/docker-lab/compose-demo
Remplissez ensuite chaque fichier avec nano : nano site/index.html, puis
nano compose.yaml.
Le contenu de site/index.html :
<!doctype html>
<html lang="fr">
<meta charset="utf-8">
<title>OwlNet Compose</title>
<h1>Docker Compose fonctionne !</h1>
<p>Cette page vient d’un dossier de mon ordinateur.</p>
Le contenu de compose.yaml :
services:
web:
image: nginx:alpine
ports:
- "127.0.0.1:8084:80"
volumes:
- ./site:/usr/share/nginx/html:ro
restart: unless-stopped
| Ligne | Ce qu’elle dit |
|---|---|
services: | La liste des conteneurs du projet — ici, un seul |
web: | Le nom du service. Les autres services le joindront par ce nom |
image: | L’image à utiliser |
ports: | Le port publié, entre guillemets comme le recommande Docker |
volumes: | Le dossier site, monté en lecture seule. Le chemin est relatif au fichier |
restart: unless-stopped | Relancer le conteneur s’il plante ou si Docker redémarre, sauf si vous l’avez arrêté vous-même |
Les espaces en début de ligne ne sont pas décoratifs : ils disent ce qui appartient à quoi. Deux espaces par niveau, jamais de tabulation.
Étape 2 : vérifier avant de lancer
docker compose config
Compose relit le fichier et l’affiche sous sa forme complète, chemins absolus compris. S’il y a une faute, il indique la ligne en cause, et rien n’a encore été lancé. Prenez l’habitude de cette vérification : elle ne coûte rien.
Étape 3 : démarrer et observer
docker compose up -d
docker compose ps
docker compose logs --tail 20
Ouvrez http://127.0.0.1:8084 : « Docker Compose
fonctionne ! ». Regardez le nom du conteneur dans docker compose ps :
compose-demo-web-1, c’est-à-dire le dossier, le service, et un numéro.
Dans Docker Desktop, la vue Containers regroupe le tout sous le nom du
projet, compose-demo. On peut le démarrer, l’arrêter ou lire ses journaux
d’un clic.
Étape 4 : modifier sans tout casser
Trois expériences, pour comprendre comment Compose réagit :
- Relancez
docker compose up -dsans rien changer. Compose répond que le service tourne déjà, et ne touche à rien. Cette commande est sans danger : elle ne fait que ce qui est nécessaire. - Modifiez
site/index.htmlet actualisez le navigateur. Le changement est immédiat : c’est un dossier monté, comme à l’épisode 5. - Remplacez 8084 par 8085 dans
compose.yaml, puis relancezdocker compose up -d. Cette fois, Compose recrée le conteneur : l’ancienne adresse ne répond plus, la nouvelle oui. Remettez 8084 ensuite.
Étape 5 : arrêter proprement
docker compose down
Le conteneur et le réseau du projet disparaissent. Vos fichiers restent, et les
volumes nommés aussi, si le projet en avait. Un docker compose up -d recrée
l’ensemble à l’identique : c’est tout l’intérêt.
Gardez le dossier compose-demo : l’épisode 8 s’en sert pour s’entraîner aux
mises à jour.
Testez-vous
3 questions pour vérifier que l’essentiel est acquis. Rien n’est noté ni enregistré.
Où Compose cherche-t-il le fichier compose.yaml ?
Un projet Compose, c’est un dossier. Le nom du dossier devient même le nom du projet, que l’on retrouve dans celui des conteneurs.
docker compose down supprime-t-il les volumes nommés du projet ?
down retire les conteneurs et le réseau du projet, et garde les données. L’option --volumes les efface aussi : à ne jamais taper par habitude.
Dans compose.yaml, que remplace la rubrique ports ?
Chaque option de docker run a sa rubrique dans compose.yaml : -p devient ports, -v devient volumes, --restart devient restart. La différence, c’est que le fichier reste.
Vérifier que tout fonctionne
Cochez au fur et à mesure : quand tout est coché, vous pouvez passer à la suite.
Problèmes courants
« no configuration file provided: not found »
Compose cherche compose.yaml dans le dossier où vous êtes. Placez-vous dans compose-demo avant de lancer la commande, et vérifiez avec ls que le fichier s’appelle bien compose.yaml, sans .txt.
Une erreur qui parle de yaml, de ligne et de colonne
Presque toujours un problème d’indentation. Le YAML n’accepte que des espaces, jamais de tabulation, et chaque niveau doit être aligné. La ligne indiquée par docker compose config est l’endroit où chercher, ou juste avant.
La page affiche « 403 Forbidden »
Nginx fonctionne, mais le dossier site est vide ou ne contient pas index.html. Vérifiez que le fichier est bien dans site, et non à côté de compose.yaml.
J’ai changé compose.yaml, mais rien n’a changé
Le fichier n’est relu qu’au lancement. Relancez docker compose up -d : Compose compare le fichier au projet en marche, et recrée ce qui doit l’être.
Votre progression reste sur cet appareil, rien n’est envoyé.