Aller au contenu
Tendances

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

Vous êtes sur

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èreDocker, dans son propre espaceVous : c’est un dossier de votre ordinateur
Idéal pourLes données d’une application ou d’une baseDes fichiers que vous éditez vous-même
À savoirMonté vide sur un dossier rempli, il reçoit une copie du contenu de l’imageIl 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.

Conteneur 1 écrit message.txt puis disparaît plus tard Conteneur 2 relit message.txt et le trouve owlnet-data le volume : message.txt écrit lit
Le conteneur passe, le volume reste : c’est lui, et non le conteneur, qui garde la donnée.

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

  1. Vous supprimez un conteneur qui utilisait le volume owlnet-data. Le volume…

  2. Vous voulez modifier des fichiers sur votre PC et voir le résultat aussitôt dans le conteneur. Vous choisissez…

  3. Un volume est-il une sauvegarde ?

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