Cours RechercherCtrl K

Docker Leçon 5

docker compose

Décrire toute une application (site, base, volumes) dans un fichier, et la lancer d'une seule commande.

30 min

À 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 : web joint la base à l'adresse base ;
  • 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 inutiles

Attention : 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.yml dé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 : pull puis up -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

Le dossier ~/monsite contient déjà un docker-compose.yml.

  1. va dans le dossier et lis le fichier ;
  2. lance l'application en arrière-plan ;
  3. affiche l'état des services, puis le journal du service web.
commandes.sh
eleve@cours: ~

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

Écris le docker-compose.yml d'une application avec deux services :

  • web : image nginx:alpine, port 8080 de la machine vers 80 ;
  • base : image postgres:18-alpine, la variable POSTGRES_PASSWORD lue dans le fichier .env (${MOT_DE_PASSE_BASE}), et le volume nommé donnees branché 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.

docker-compose.yml
Console

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

Le projet ~/monsite tourne. Une mise à jour de sécurité de nginx est sortie.

  1. place-toi dans le dossier du projet ;
  2. télécharge les nouvelles images ;
  3. recrée les conteneurs en arrière-plan ;
  4. supprime les anciennes images inutilisées (sans confirmation, -f) ;
  5. vérifie que tout tourne.

Les données ne doivent pas être effacées : pas de down -v !

commandes.sh
eleve@cours: ~

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

Quiz

1Que fait docker compose down ?
2Comment mettre à jour les images d'un projet compose ?
3Dans un fichier compose, comment le service web joint-il le service base ?