Monter un volume pour persister les données
Dans cette étape, vous apprendrez à utiliser les volumes Docker pour persister les données générées et utilisées par les conteneurs Docker. Par défaut, les données à l'intérieur d'un conteneur sont éphémères ; elles sont perdues lorsque le conteneur est supprimé. Les volumes offrent un moyen de stocker des données en dehors du système de fichiers du conteneur, permettant leur persistance même après l'arrêt ou la suppression du conteneur.
Commençons par arrêter et supprimer le conteneur my-nginx
de l'étape précédente.
docker stop my-nginx
docker rm my-nginx
Nous allons maintenant créer un volume Docker. Les volumes sont gérés par Docker et stockés dans une zone dédiée de la machine hôte.
docker volume create my-volume
Vous devriez voir le nom du volume (my-volume
) s'afficher, confirmant sa création.
Vous pouvez lister les volumes existants avec la commande docker volume ls
.
docker volume ls
Le volume my-volume
devrait apparaître dans la liste.
Exécutons maintenant un nouveau conteneur nginx
en montant le volume my-volume
dans le répertoire webroot par défaut de Nginx (/usr/share/nginx/html
). Ainsi, tous les fichiers placés dans /usr/share/nginx/html
seront en réalité stockés dans my-volume
sur l'hôte.
Nous lancerons le conteneur en mode détaché (-d
), publierons le port 80 du conteneur vers le port 8081 de l'hôte (-p 8081:80
), lui attribuerons un nom (my-nginx-volume
), et utiliserons l'option -v
pour monter le volume. Le format pour monter un volume nommé est nom_volume:chemin_conteneur
.
docker run -d --name my-nginx-volume -p 8081:80 -v my-volume:/usr/share/nginx/html nginx
L'ID du conteneur devrait s'afficher, indiquant son exécution.
Créons maintenant un fichier HTML simple dans le volume monté. Nous utiliserons docker exec
pour exécuter une commande dans le conteneur. Nous créerons un fichier index.html
dans /usr/share/nginx/html
avec un contenu basique.
docker exec my-nginx-volume sh -c 'echo "<h1>Bonjour depuis le volume !</h1>" > /usr/share/nginx/html/index.html'
Cette commande exécute un shell (sh -c
) dans le conteneur my-nginx-volume
et utilise la commande echo
pour créer le fichier index.html
.
Accédons maintenant au serveur web sur le port 8081 pour voir le contenu du fichier créé.
curl http://localhost:8081
Vous devriez voir <h1>Bonjour depuis le volume !</h1>
dans la sortie. Cela confirme que le fichier créé dans le conteneur est bien servi par Nginx, et comme il a été écrit dans le volume monté, les données sont persistantes.
Pour démontrer cette persistance, arrêtons et supprimons le conteneur my-nginx-volume
.
docker stop my-nginx-volume
docker rm my-nginx-volume
Lançons maintenant un nouveau conteneur en montant le même volume. Nous le nommerons my-nginx-volume-new
et publierons son port 80 vers le port 8082 de l'hôte.
docker run -d --name my-nginx-volume-new -p 8082:80 -v my-volume:/usr/share/nginx/html nginx
Le nouveau conteneur utilise le même volume my-volume
. Accédons au serveur sur le port 8082.
curl http://localhost:8082
Vous devriez toujours voir <h1>Bonjour depuis le volume !</h1>
. Ceci s'explique car le fichier index.html
était stocké dans my-volume
, qui a persisté malgré la suppression du conteneur original. Le nouveau conteneur, en montant le même volume, a accès aux données précédemment écrites.
Cette démonstration illustre l'utilité des volumes pour persister les données indépendamment du cycle de vie des conteneurs.