Aller au contenu
Tendances

É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.

Vous êtes sur

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 runDans compose.yaml
nginx:alpineimage: nginx:alpine
-p 127.0.0.1:8084:80ports: 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-stoppedrestart: unless-stopped
-ddocker 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
LigneCe 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-stoppedRelancer 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.

compose.yaml la notice up -d Projet « compose-demo », du nom du dossier réseau compose-demo_default compose-demo-web-1 service web · Nginx 127.0.0.1:8084 port publié ./site lecture seule
Une seule commande crée le réseau, le conteneur, le port et le montage — et les noms suivent tous la même règle.

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 :

  1. Relancez docker compose up -d sans 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.
  2. Modifiez site/index.html et actualisez le navigateur. Le changement est immédiat : c’est un dossier monté, comme à l’épisode 5.
  3. Remplacez 8084 par 8085 dans compose.yaml, puis relancez docker 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é.

  1. Où Compose cherche-t-il le fichier compose.yaml ?

  2. docker compose down supprime-t-il les volumes nommés du projet ?

  3. Dans compose.yaml, que remplace la rubrique ports ?

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é.