Docker Leçon 5
docker compose
Décrire toute une application (site, base, volumes) dans un fichier, et la lancer d'une seule commande.
À la fin de cette leçon, tu sauras
- Lire et écrire un fichier docker-compose.yml
- Lancer, suivre et arrêter une application à plusieurs conteneurs
- Mettre à jour les images proprement
Fini les commandes à rallonge
Un site avec sa base, c'est déjà deux docker run de trois lignes chacun, un réseau, un volume… et il faut s'en souvenir. docker compose décrit tout ça dans un fichier docker-compose.yml, que l'on garde avec le projet :
services:
web:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html:ro
restart: unless-stopped
base:
image: postgres:18-alpine
environment:
POSTGRES_PASSWORD: ${MOT_DE_PASSE_BASE}
volumes:
- donnees:/var/lib/postgresql/data
restart: unless-stopped
volumes:
donnees:Le format est le YAML : des paires clé: valeur, des listes avec - , et surtout une indentation de 2 espaces qui indique ce qui est rangé dans quoi. Jamais de tabulation.
- chaque service devient un conteneur, avec les mêmes réglages que
docker run; - compose crée automatiquement un réseau pour le projet :
webjoint la base à l'adressebase; - les volumes nommés se déclarent en bas, sous
volumes:; ${MOT_DE_PASSE_BASE}est lu dans un fichier.envà côté : le secret ne se retrouve pas dans le fichier compose (ni sur GitHub).
Les commandes
Elles se lancent dans le dossier qui contient docker-compose.yml :
cd ~/monsite
docker compose up -d # crée et démarre tout (en arrière-plan)
docker compose ps # l'état des services
docker compose logs web # le journal d'un service (-f pour suivre)
docker compose restart # redémarre
docker compose down # arrête et supprime les conteneurs et le réseau (les volumes restent)Mettre à jour
Pour profiter d'un correctif de sécurité (une nouvelle version de PHP ou de nginx), on retélécharge les images puis on recrée les conteneurs. Les volumes gardent les données :
docker compose pull # télécharge les nouvelles versions des images
docker compose up -d # recrée seulement les conteneurs dont l'image a changé
docker image prune -f # supprime les anciennes images devenues inutilesAttention : docker compose down -v supprime aussi les volumes, donc la base de données. À n'utiliser que si tu veux vraiment tout effacer.
À retenir
docker-compose.ymldécrit les services, leurs ports, volumes, variables et redémarrage.- YAML :
clé: valeur, listes avec-, indentation de 2 espaces, jamais de tabulation. - Compose crée un réseau : les services se joignent par leur nom.
- Les secrets dans
.env, utilisés avec${NOM}. up -d,ps,logs,down; mise à jour :pullpuisup -d.
Voir la fiche de révision de cette leçon (à imprimer ou à relire avant un contrôle)
Exercice 1 · Lancer un projet existant
Facile ✓ RéussiLe dossier ~/monsite contient déjà un docker-compose.yml.
- va dans le dossier et lis le fichier ;
- lance l'application en arrière-plan ;
- affiche l'état des services, puis le journal du service
web.
Tape tes commandes ici ou dans le fichier à gauche : chaque commande tapée dans le terminal est ajoutée au fichier.
Consignes à réussir
- À faire : Tu es dans ~/monsite
- À faire : Le fichier compose est lu
- À faire : Le service web tourne
- À faire : Lancé en arrière-plan (up -d)
- À faire : L'état des services est affiché
- À faire : Le journal de web est affiché
Bravo, cet exercice est réussi !
- Indice 1 :
cd ~/monsite, puiscat docker-compose.yml. - Indice 2 :
docker compose up -d. - Indice 3 :
docker compose psetdocker compose logs web.
Toujours bloqué ? Voir une solution
cd ~/monsite
cat docker-compose.yml
docker compose up -d
docker compose ps
docker compose logs web Exercice 2 · Écrire le fichier compose
Moyen ✓ RéussiÉcris le docker-compose.yml d'une application avec deux services :
web: imagenginx:alpine, port8080de la machine vers80;base: imagepostgres:18-alpine, la variablePOSTGRES_PASSWORDlue dans le fichier .env (${MOT_DE_PASSE_BASE}), et le volume nommédonneesbranché sur/var/lib/postgresql/data.
Les deux services redémarrent tout seuls (unless-stopped), et le volume donnees est déclaré en bas du fichier. Indentation : 2 espaces, pas de tabulation.
Clique sur ▶ Exécuter (ou Ctrl + Entrée) pour lancer ton programme.
Consignes à réussir
- À faire : Une section services:
- À faire : web utilise nginx:alpine
- À faire : Port 8080 → 80
- À faire : base utilise postgres:18-alpine
- À faire : Le mot de passe vient du .env
- À faire : Le volume donnees est branché sur /var/lib/postgresql/data
- À faire : Les deux services redémarrent tout seuls
- À faire : Le volume donnees est déclaré en bas
- À faire : Aucune tabulation
Bravo, cet exercice est réussi !
- Indice 1 : Chaque niveau se décale de 2 espaces :
services:, puisweb:, puisimage: nginx:alpine. - Indice 2 : Les listes (ports, volumes) : une ligne
ports:, puis- "8080:80". - Indice 3 : Pour la base :
environment:puisPOSTGRES_PASSWORD: ${MOT_DE_PASSE_BASE}. Et tout en bas, collé à gauche :volumes:puisdonnees:.
Toujours bloqué ? Voir une solution
services:
web:
image: nginx:alpine
ports:
- "8080:80"
restart: unless-stopped
base:
image: postgres:18-alpine
environment:
POSTGRES_PASSWORD: ${MOT_DE_PASSE_BASE}
volumes:
- donnees:/var/lib/postgresql/data
restart: unless-stopped
volumes:
donnees: Exercice 3 · La mise à jour du lundi
Pour aller plus loin ✓ RéussiLe projet ~/monsite tourne. Une mise à jour de sécurité de nginx est sortie.
- place-toi dans le dossier du projet ;
- télécharge les nouvelles images ;
- recrée les conteneurs en arrière-plan ;
- supprime les anciennes images inutilisées (sans confirmation,
-f) ; - vérifie que tout tourne.
Les données ne doivent pas être effacées : pas de down -v !
Tape tes commandes ici ou dans le fichier à gauche : chaque commande tapée dans le terminal est ajoutée au fichier.
Consignes à réussir
- À faire : Tu travailles dans ~/monsite
- À faire : Les images sont retéléchargées
- À faire : Les conteneurs sont recréés après le pull
- À faire : Les anciennes images sont supprimées
- À faire : Le service web tourne toujours
- À faire : Pas de down -v
- À faire : L'état est vérifié
Bravo, cet exercice est réussi !
- Indice 1 : Toutes les commandes compose se lancent dans le dossier du projet :
cd ~/monsite. - Indice 2 :
docker compose pull, puisdocker compose up -d. - Indice 3 :
docker image prune -f, puisdocker compose ps.
Toujours bloqué ? Voir une solution
# état du serveur (ne pas modifier)
cd ~/monsite
docker compose up -d
cd ~
# à toi :
cd ~/monsite
docker compose pull
docker compose up -d
docker image prune -f
docker compose ps