Objectifs
- Comprendre pourquoi les données à l’intérieur d’un conteneur sont éphémères par défaut.
- Utiliser les volumes nommés pour stocker des données de manière persistante, indépendamment du cycle de vie du conteneur.
- Partager un dossier de votre machine avec un conteneur en utilisant les bind mounts, notamment pour le développement.
- Savoir quand utiliser un volume nommé plutôt qu’un bind mount.
Le problème : La nature éphémère des conteneurs
Le système de fichiers d’un conteneur est isolé et temporaire. Lorsque vous supprimez un conteneur (docker rm), tout ce qui a été créé ou modifié à l’intérieur de ce conteneur est définitivement perdu.
C’est un problème majeur pour les applications qui ont besoin de stocker des données, comme une base de données. Si vous lancez un conteneur PostgreSQL, y insérez des données, puis le supprimez, toutes vos données disparaissent.
La solution : Les Volumes Docker
Pour résoudre ce problème, Docker propose un mécanisme de volumes. Un volume est un “disque dur virtuel” que l’on attache à un ou plusieurs conteneurs. Les données écrites dans le volume sont stockées sur la machine hôte, mais gérées par Docker. Elles persistent même si le conteneur est supprimé.
Il existe deux types principaux de volumes.
1. Volumes Nommés (Named Volumes)
C’est la méthode recommandée pour la persistance des données en production.
- Vous créez un volume avec un nom explicite.
- Docker gère l’emplacement physique du volume sur la machine hôte. C’est transparent pour vous.
- Ils sont faciles à sauvegarder, migrer et gérer via l’API Docker.
Création et utilisation :
# 1. Créer un volume nommé
docker volume create ma_base_de_donnees_data
# 2. Lancer un conteneur en "montant" ce volume
# -v <nom_du_volume>:<chemin_dans_le_conteneur>
docker run -d --name ma_db -e POSTGRES_PASSWORD=secret -v ma_base_de_donnees_data:/var/lib/postgresql/data postgres
Maintenant, toutes les données que PostgreSQL écrit dans son répertoire /var/lib/postgresql/data seront en fait stockées dans le volume ma_base_de_donnees_data sur votre machine.
2. Bind Mounts
Un “bind mount” est plus direct : il monte un dossier ou un fichier existant de votre machine hôte à l’intérieur du conteneur.
C’est extrêmement utile en développement. Par exemple, vous pouvez monter le dossier contenant le code source de votre application dans le conteneur. Ainsi, toute modification que vous faites dans votre éditeur de code sur votre machine est immédiatement visible à l’intérieur du conteneur, sans avoir à reconstruire l’image.
Syntaxe : -v /chemin/absolu/sur/l_hote:/chemin/dans/le/conteneur
# Lancer un conteneur en montant le dossier du projet courant dans /app
docker run -d -v "$(pwd)":/app mon_app_de_dev
Volumes vs. Bind Mounts : Lequel choisir ?
- Volumes nommés : Pour toutes les données générées par une application qui doivent persister (bases de données, fichiers uploadés par les utilisateurs, etc.). C’est le choix par défaut pour la production.
- Bind Mounts : Principalement pour le développement, pour injecter du code source ou des fichiers de configuration depuis la machine hôte.
Commandes utiles
docker volume ls: Lister tous les volumes nommés.docker volume create <nom>: Créer un volume.docker volume inspect <nom>: Voir les détails d’un volume (y compris où il est stocké sur l’hôte).docker volume rm <nom>: Supprimer un volume. Attention, ceci supprime les données.docker volume prune: Supprimer tous les volumes locaux qui ne sont pas utilisés par au moins un conteneur.
Exercices
-
Créez un volume persistant :
- Créez un volume nommé
test-dataavecdocker volume create. - Vérifiez qu’il existe avec
docker volume ls.
- Créez un volume nommé
-
Lancez un conteneur qui écrit des données :
- Lancez un conteneur
ubuntuen montant le volumetest-datadans un dossier/data. - Le conteneur doit écrire un fichier
message.txtdans/datapuis se terminer.
docker run --rm -v test-data:/data ubuntu bash -c 'echo "données persistantes" > /data/message.txt' - Lancez un conteneur
-
Vérifiez la persistance :
- Lancez un nouveau conteneur
ubuntuen montant le même volume. - À l’intérieur de ce nouveau conteneur, exécutez
cat /data/message.txt. - Le message “données persistantes” devrait s’afficher, prouvant que les données ont survécu à la suppression du premier conteneur.
- Lancez un nouveau conteneur
-
Nettoyez :
- Supprimez le volume
test-dataavecdocker volume rm.
- Supprimez le volume