Cours RechercherCtrl K

Docker Leçon 4

Volumes, variables et réseaux

Garder ses données quand le conteneur disparaît, lui donner ses réglages, et relier plusieurs conteneurs.

30 min

À la fin de cette leçon, tu sauras

  • Conserver des données avec un volume
  • Partager un dossier de la machine avec un conteneur
  • Passer des réglages par variables d'environnement, relier des conteneurs par un réseau

Le problème : un conteneur est jetable

Supprime un conteneur PostgreSQL… et toute la base part avec lui. Pour les données qui doivent survivre, on utilise un volume : un espace de stockage géré par Docker, branché à un dossier du conteneur.

docker volume create donnees-base
docker run -d --name base \
  -e POSTGRES_PASSWORD=Un-Mot-De-Passe-Solide \
  -v donnees-base:/var/lib/postgresql/data \
  --restart unless-stopped \
  postgres:18-alpine
docker volume ls
  • -v donnees-base:/var/lib/postgresql/data : le volume donnees-base est branché sur le dossier où PostgreSQL range ses fichiers. On peut supprimer et recréer le conteneur (pour une mise à jour, par exemple) : les données restent ;
  • -e NOM=valeur : une variable d'environnement. C'est ainsi qu'on donne ses réglages et ses secrets à un conteneur, sans les écrire dans l'image. Sans POSTGRES_PASSWORD, PostgreSQL refuse de démarrer ;
  • --restart unless-stopped : Docker relance le conteneur s'il plante ou si le serveur redémarre (sauf si tu l'as arrêté toi-même).

Partager un dossier de la machine

Au lieu d'un volume, on peut brancher un dossier existant de la machine (un bind mount) : pratique pour les fichiers d'un site qu'on modifie depuis l'extérieur.

docker run -d --name blog -p 8080:80 -v ~/blog:/usr/share/nginx/html:ro nginx:alpine

Le :ro final (read only) interdit au conteneur de modifier ces fichiers : si le serveur web est piraté, il ne peut pas réécrire ton site.

Relier des conteneurs : les réseaux

Sur un même réseau Docker, les conteneurs se parlent par leur nom : le site se connecte à la base avec l'adresse base, sans publier le port 5432 sur Internet.

docker network create appli
docker run -d --name base --network appli -e POSTGRES_PASSWORD=… postgres:18-alpine
docker run -d --name site --network appli -p 8080:80 -e DB_HOST=base monsite:1.0
docker network ls

Astuce : docker inspect base affiche toute la configuration d'un conteneur (volumes, réseau, variables, politique de redémarrage). Pratique pour vérifier.

Attention : docker volume rm et docker compose down -v effacent les données pour de bon. Sauvegarde avant.

À retenir

  • Un volume garde les données quand le conteneur est supprimé : -v nom:/dossier/du/conteneur.
  • Un dossier de la machine se branche pareil : -v ~/site:/usr/share/nginx/html:ro (:ro = lecture seule).
  • Réglages et secrets par variables : -e NOM=valeur, jamais dans l'image.
  • --restart unless-stopped : relancé après un plantage ou un redémarrage.
  • Sur un même réseau, les conteneurs se joignent par leur nom ; la base n'a pas besoin de -p.

Voir la fiche de révision de cette leçon (à imprimer ou à relire avant un contrôle)

Exercice 1 · Une base de données qui ne perd rien

Facile
  1. crée un volume donnees-base ;
  2. lance en arrière-plan un conteneur base à partir de postgres:18-alpine, avec un mot de passe (POSTGRES_PASSWORD), le volume branché sur /var/lib/postgresql/data, et la politique unless-stopped ;
  3. vérifie avec docker ps qu'il tourne, et lis son journal.
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 : Le volume donnees-base existe
  • À faire : Le conteneur base tourne (postgres:18-alpine)
  • À faire : Un mot de passe est donné
  • À faire : Le volume est branché sur /var/lib/postgresql/data
  • À faire : Il redémarre tout seul (unless-stopped)
  • À faire : Son journal est lu
Toujours bloqué ? Voir une solution
docker volume create donnees-base
docker run -d --name base -e POSTGRES_PASSWORD=Un-Mot-De-Passe-Solide -v donnees-base:/var/lib/postgresql/data --restart unless-stopped postgres:18-alpine
docker ps
docker logs base

Exercice 2 · Le blog en lecture seule

Moyen

Les pages de ton blog sont dans ~/blog. Lance un conteneur blog (image nginx:alpine) qui :

  1. répond sur le port 8080 de la machine (port 80 du conteneur) ;
  2. sert le dossier ~/blog à la place de /usr/share/nginx/html, en lecture seule.

Vérifie ensuite, avec docker exec, que le conteneur voit bien index.html dans /usr/share/nginx/html.

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 : Le conteneur blog tourne avec nginx:alpine
  • À faire : Port 8080 → 80
  • À faire : ~/blog est branché sur /usr/share/nginx/html
  • À faire : En lecture seule (:ro)
  • À faire : Le contenu est vérifié dans le conteneur
Toujours bloqué ? Voir une solution
docker run -d --name blog -p 8080:80 -v ~/blog:/usr/share/nginx/html:ro nginx:alpine
docker exec blog ls /usr/share/nginx/html

Exercice 3 · Une base cachée derrière un réseau

Pour aller plus loin

Ton site et sa base MariaDB doivent se parler, mais la base ne doit pas être joignable depuis Internet.

  1. crée un réseau appli ;
  2. lance la base : conteneur base, image mariadb:11, sur le réseau appli, avec MARIADB_ROOT_PASSWORD, et sans publier de port ;
  3. lance le site : conteneur site, image php:8.3-apache, sur le réseau appli, port 8080 vers 80, avec la variable DB_HOST=base ;
  4. affiche les réseaux.
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 : Le réseau appli existe
  • À faire : La base tourne sur le réseau appli
  • À faire : La base n'a pas de port publié
  • À faire : Le site tourne sur le réseau appli
  • À faire : Le site est publié sur 8080
  • À faire : Le site sait où est la base (DB_HOST=base)
  • À faire : Les réseaux sont affichés
Toujours bloqué ? Voir une solution
docker network create appli
docker run -d --name base --network appli -e MARIADB_ROOT_PASSWORD=Un-Mot-De-Passe-Solide mariadb:11
docker run -d --name site --network appli -p 8080:80 -e DB_HOST=base php:8.3-apache
docker network ls

Quiz

1Que deviennent les données d'un volume quand on supprime le conteneur ?
2Comment le site joint-il la base sur un même réseau Docker ?
3À quoi sert :ro dans -v ~/blog:/usr/share/nginx/html:ro ?