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.
À 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 volumedonnees-baseest 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. SansPOSTGRES_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:alpineLe :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 lsAstuce : 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 ✓ Réussi- crée un volume
donnees-base; - lance en arrière-plan un conteneur
baseà partir depostgres:18-alpine, avec un mot de passe (POSTGRES_PASSWORD), le volume branché sur/var/lib/postgresql/data, et la politiqueunless-stopped; - vérifie avec
docker psqu'il tourne, et lis son journal.
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
Bravo, cet exercice est réussi !
- Indice 1 :
docker volume create donnees-base. - Indice 2 : Les options :
-d --name base -e POSTGRES_PASSWORD=… -v donnees-base:/var/lib/postgresql/data --restart unless-stopped, puis l'image. - Indice 3 : Si le conteneur s'arrête aussitôt,
docker logs basedit pourquoi (souvent : le mot de passe manque).
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 ✓ RéussiLes pages de ton blog sont dans ~/blog. Lance un conteneur blog (image nginx:alpine) qui :
- répond sur le port
8080de la machine (port80du conteneur) ; - 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.
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
Bravo, cet exercice est réussi !
- Indice 1 : Un dossier de la machine se branche comme un volume :
-v chemin-machine:chemin-conteneur. - Indice 2 : Lecture seule : ajoute
:roà la fin,-v ~/blog:/usr/share/nginx/html:ro. - Indice 3 : Vérifier :
docker exec blog ls /usr/share/nginx/html.
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 ✓ RéussiTon site et sa base MariaDB doivent se parler, mais la base ne doit pas être joignable depuis Internet.
- crée un réseau
appli; - lance la base : conteneur
base, imagemariadb:11, sur le réseauappli, avecMARIADB_ROOT_PASSWORD, et sans publier de port ; - lance le site : conteneur
site, imagephp:8.3-apache, sur le réseauappli, port8080vers80, avec la variableDB_HOST=base; - affiche les réseaux.
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
Bravo, cet exercice est réussi !
- Indice 1 :
docker network create appli, puis--network applidans chaquedocker run. - Indice 2 : La base :
docker run -d --name base --network appli -e MARIADB_ROOT_PASSWORD=… mariadb:11(pas de-p). - Indice 3 : Le site :
docker run -d --name site --network appli -p 8080:80 -e DB_HOST=base php:8.3-apache, puisdocker network ls.
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