Épisode 05 / 9Les gestes essentiels25 min
Conserver les données avec un volume
Ce qui disparaît avec un conteneur, ce qui lui survit, la différence entre un volume et un dossier monté — et comment sauvegarder vraiment.
Tapez les commandes dans PowerShell, avec Docker Desktop démarré : « Engine running » en bas à gauche.
Ajoutez sudo devant chaque commande docker, sauf si vous avez choisi le groupe docker à l’épisode 2.
Dans cet épisode
- Prouver qu’une donnée survit à la suppression d’un conteneur
- Choisir entre un volume nommé et un dossier monté
- Sauvegarder un volume, puis vérifier que la sauvegarde se restaure
Un conteneur se remplace : on le supprime, on en recrée un neuf, et c’est même la façon normale de le mettre à jour. Mais tout ce qu’il a écrit dans sa couche d’écriture part avec lui. Une base de données rangée là serait effacée à la première mise à jour.
La solution : ranger les données à côté du conteneur.
Volume nommé ou dossier monté ?
Docker propose deux façons de sortir les données du conteneur.
| Volume nommé | Dossier monté | |
|---|---|---|
| S’écrit | -v owlnet-data:/data | -v "${PWD}:/data" |
| Qui le gère | Docker, dans son propre espace | Vous : c’est un dossier de votre ordinateur |
| Idéal pour | Les données d’une application ou d’une base | Des fichiers que vous éditez vous-même |
| À savoir | Monté vide sur un dossier rempli, il reçoit une copie du contenu de l’image | Il masque ce que l’image contenait à cet endroit |
Retenez la dernière ligne : c’est l’origine de nombreuses surprises. Un dossier monté remplace le contenu d’origine par celui de votre dossier — s’il est vide, l’application trouve un dossier vide.
Exercice 1 : prouver la persistance
Créez un volume, puis faites écrire un fichier dedans par un conteneur
jetable. alpine est un système minuscule, parfait pour ces petites tâches.
docker volume create owlnet-data
docker run --rm -v owlnet-data:/data alpine sh -c "echo 'Bonjour depuis le volume' > /data/message.txt"
Grâce à --rm, ce conteneur a déjà disparu. Un second, tout neuf, va relire le
fichier :
docker run --rm -v owlnet-data:/data:ro alpine cat /data/message.txt
« Bonjour depuis le volume » s’affiche : le premier conteneur n’existe plus, le
volume a gardé la donnée. Le :ro final monte le volume en lecture seule, car
ce second conteneur n’a besoin que de lire.
Pour voir la fiche du volume :
docker volume inspect owlnet-data
Dans Docker Desktop, ouvrez Volumes puis owlnet-data : vous pouvez y
parcourir les fichiers qu’il contient, sans jamais fouiller dans les dossiers
internes de Docker.
Exercice 2 : un dossier modifié en direct
Reprenez le dossier mon-image de l’épisode 4, et montez-le dans un Nginx tout
neuf, à la place de sa page d’accueil :
cd ~/docker-lab/mon-image
docker run -d --name owlnet-direct -p 127.0.0.1:8082:80 -v "${PWD}:/usr/share/nginx/html:ro" nginx:alpine
${PWD} désigne le dossier où vous vous trouvez : PowerShell comme le Terminal
Ubuntu le comprennent. Ouvrez http://127.0.0.1:8082 :
votre page s’affiche.
Maintenant, modifiez le titre dans index.html, enregistrez, et actualisez le
navigateur. Le changement apparaît immédiatement, sans construire d’image.
À l’épisode 4, la page était copiée dans l’image ; ici, le conteneur lit
directement votre dossier.
Dernière expérience, plus inquiétante : ouvrez http://127.0.0.1:8082/Dockerfile. Le navigateur télécharge votre Dockerfile. Un dossier monté partage tout son contenu : ne montez jamais un dossier plus large que nécessaire, et encore moins votre dossier personnel entier.
Persistant ne veut pas dire sauvegardé
Un volume survit au conteneur. Il ne survit ni à une panne de disque, ni à une
fausse manœuvre. La sauvegarde se fait avec… un conteneur, qui emballe le
contenu du volume dans une archive, dans votre dossier docker-lab :
cd ~/docker-lab
docker run --rm -v owlnet-data:/data:ro -v "${PWD}:/sauvegarde" alpine tar czf /sauvegarde/owlnet-data.tar.gz -C /data .
Deux montages dans la même commande : le volume en lecture seule, et votre dossier comme destination. Une sauvegarde qui n’a jamais été restaurée n’est qu’un espoir : restaurez-la dans un nouveau volume, et relisez le message.
docker volume create owlnet-restaure
docker run --rm -v owlnet-restaure:/data -v "${PWD}:/sauvegarde:ro" alpine tar xzf /sauvegarde/owlnet-data.tar.gz -C /data
docker run --rm -v owlnet-restaure:/data:ro alpine cat /data/message.txt
Si « Bonjour depuis le volume » s’affiche, votre méthode de sauvegarde est prouvée. C’est la même, à l’identique, pour les données d’une vraie application : seul le nom du volume change.
Nettoyer
docker rm -f owlnet-direct
docker volume rm owlnet-data owlnet-restaure
Testez-vous
3 questions pour vérifier que l’essentiel est acquis. Rien n’est noté ni enregistré.
Vous supprimez un conteneur qui utilisait le volume owlnet-data. Le volume…
Un volume a sa propre vie. Il ne disparaît que si vous le supprimez explicitement, avec docker volume rm ou une option de nettoyage qui le vise.
Vous voulez modifier des fichiers sur votre PC et voir le résultat aussitôt dans le conteneur. Vous choisissez…
Le dossier monté fait apparaître un dossier de votre ordinateur à l’intérieur du conteneur : chaque modification est visible immédiatement. Le volume nommé, lui, est géré par Docker, à l’abri de vos manipulations.
Un volume est-il une sauvegarde ?
Persistant ne veut pas dire sauvegardé. Le volume est sur le même disque que tout le reste : une copie ailleurs, dont la restauration a été testée, reste indispensable.
Vérifier que tout fonctionne
Cochez au fur et à mesure : quand tout est coché, vous pouvez passer à la suite.
Problèmes courants
« volume is in use »
Un conteneur, même arrêté, utilise encore ce volume. Trouvez-le avec docker ps -a --filter volume=owlnet-data, supprimez-le, puis recommencez.
Le dossier monté apparaît vide dans le conteneur
Le terminal n’était pas dans le bon dossier au moment du docker run : ${PWD} désigne le dossier courant. Vérifiez avec pwd, placez-vous dans mon-image, supprimez le conteneur et relancez-le.
Où Docker range-t-il physiquement un volume ?
Sous Ubuntu, dans /var/lib/docker/volumes ; sous Windows, dans le disque virtuel de Docker Desktop. N’y touchez pas à la main : passez toujours par un conteneur, comme dans cet épisode.
Ubuntu : je ne peux pas supprimer l’archive sans sudo
C’est normal : le conteneur qui l’a créée tournait en administrateur, l’archive appartient donc à root. Supprimez-la avec sudo rm, ou rendez-la vôtre avec sudo chown $USER owlnet-data.tar.gz.
Votre progression reste sur cet appareil, rien n’est envoyé.