Volumes et persistance des données
Par défaut, les données dans un conteneur sont éphémères. Les volumes et bind mounts permettent de persister les données au-delà du cycle de vie d'un conteneur.
Trois mécanismes de stockage
graph TD
C[Conteneur]
V[Volume Docker
/var/lib/docker/volumes/]
B[Bind Mount
Dossier hôte]
T[tmpfs Mount
RAM uniquement]
C -->|volume| V
C -->|bind| B
C -->|tmpfs| T
Volumes Docker (recommandé en production)
# Créer un volume
docker volume create mes-donnees
# Lister les volumes
docker volume ls
# Inspecter un volume
docker volume inspect mes-donnees
# Utiliser un volume dans un conteneur
docker run -d -v mes-donnees:/var/lib/mysql mysql:8
# Supprimer un volume (données perdues !)
docker volume rm mes-donnees
# Nettoyer les volumes inutilisés
docker volume prune
Avantages : géré par Docker, portable, permissions correctes, sauvegardable.
Bind mounts (développement)
# Monter un dossier local dans le conteneur
# Syntaxe -v : chemin-absolu-hôte:chemin-conteneur
docker run -d -v /home/user/monapp:/app -p 8080:8000 mon-app
# Syntaxe --mount (plus explicite)
docker run -d --mount type=bind,source=/home/user/monapp,target=/app mon-app
Usage typique : développement : les modifications du code local sont immédiatement visibles dans le conteneur sans rebuild.
Cas concret : base de données persistante
# Volume pour les données MySQL
docker volume create mysql-data
# Lancer MySQL avec persistance
docker run -d --name mysql-prod -e MYSQL_ROOT_PASSWORD=secret -e MYSQL_DATABASE=appdb -v mysql-data:/var/lib/mysql -p 3306:3306 mysql:8.0
# Arrêter et relancer → données toujours là
docker stop mysql-prod
docker rm mysql-prod
docker run -d --name mysql-prod -v mysql-data:/var/lib/mysql -p 3306:3306 mysql:8.0
# Les données appdb sont intactes
Sauvegarder et restaurer un volume
# Sauvegarder un volume dans une archive tar
docker run --rm -v mysql-data:/data -v $(pwd):/backup ubuntu tar czf /backup/mysql-backup.tar.gz /data
# Restaurer
docker run --rm -v mysql-data:/data -v $(pwd):/backup ubuntu tar xzf /backup/mysql-backup.tar.gz -C /
Erreurs fréquentes
- Bind mount avec chemin relatif :
-v ./data:/app/datane fonctionne pas sur toutes les plateformes. Utiliser un chemin absolu ou$(pwd)/data. - Permissions sur les bind mounts : le conteneur peut tourner avec un UID différent de l'hôte. Les fichiers créés par le conteneur peuvent appartenir à root sur l'hôte.
- Supprimer un conteneur avec ses données :
docker rmne supprime pas les volumes nommés. Mais les données anonymes (créées par-v /cheminsans nom) sont supprimées avecdocker rm -v.
À retenir
- Volumes Docker → production (géré par Docker, portable).
- Bind mounts → développement (code local reflété dans le conteneur).
docker volume prune→ nettoyer les volumes orphelins.- Sauvegarder les volumes avant
docker rmsur une base de données.