Gestion des données avec les volumes
Par défaut, tout ce qui se passe à l'intérieur d'un conteneur disparaît quand il est supprimé. Pour préserver les données, Docker propose les volumes.
Progression
7 / 8
Derniere mise a jour
24 sept. 2025
Etat
A jour
Par défaut, tout ce qui se passe à l'intérieur d'un conteneur disparaît quand il est supprimé. Pour préserver les données, Docker propose les volumes.
Qu'est-ce qu'un volume ?
Un volume Docker est un espace de stockage persistant utilisé par un ou plusieurs conteneurs. Il est indépendant du cycle de vie des conteneurs.
Deux types principaux
| Type | Description | Cas d'usage |
|---|---|---|
| Named volume | Volume géré par Docker (stocké dans /var/lib/docker/volumes) | Production, bases de données |
| Bind mount | Monte un dossier local dans le conteneur | Développement, fichiers de config |
Named Volumes (recommandé pour la production)
Créer un volume
docker volume create mon_volumeUtiliser un volume avec un conteneur
docker run -d -v mon_volume:/data --name mon_conteneur busyboxAvec la syntaxe --mount (recommandée) :
docker run -d --name mon_conteneur \
--mount source=mon_volume,target=/data \
busyboxExemple concret : Base de données PostgreSQL
# Créer un volume pour les données
docker volume create postgres_data
# Lancer PostgreSQL avec le volume
docker run -d \
--name postgres_db \
--mount source=postgres_data,target=/var/lib/postgresql/data \
-e POSTGRES_PASSWORD=motdepasse \
-p 5432:5432 \
postgres:15Avantages des named volumes :
- Gérés entièrement par Docker
- Sécurisés et isolés
- Portables entre environnements
- Sauvegarde facilitée
- Partageable entre conteneurs
Bind Mounts (pour le développement)
Exemple simple
docker run -v $(pwd)/logs:/app/logs mon_appAvec --mount :
docker run --mount type=bind,source="$(pwd)"/logs,target=/app/logs mon_appExemple concret : Développement d'une app web
# Monter le code source pour le développement
docker run -d \
--name dev_app \
--mount type=bind,source="$(pwd)",target=/app \
-p 3000:3000 \
node:18 \
npm run devAvantages des bind mounts :
- Modifications en temps réel
- Accès direct aux fichiers depuis l'hôte
- Parfait pour le développement
- Partage de fichiers de configuration
Gestion des volumes
Lister les volumes
docker volume lsInspecter un volume
docker volume inspect mon_volumeInformations retournées :
[
{
"CreatedAt": "2025-01-15T10:30:45Z",
"Driver": "local",
"Mountpoint": "/var/lib/docker/volumes/mon_volume/_data",
"Name": "mon_volume"
}
]Supprimer un volume
docker volume rm mon_volumePartager des volumes entre conteneurs
Exemple : App web + Base de données
# Créer un volume partagé
docker volume create app_data
# Conteneur de base de données
docker run -d \
--name db \
--mount source=app_data,target=/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
mysql:8
# Conteneur d'application
docker run -d \
--name app \
--mount source=app_data,target=/app/data \
-p 8080:8080 \
mon_appVolumes en lecture seule
docker run -d \
--mount source=config_vol,target=/etc/config,readonly \
mon_appAvec -v :
docker run -d -v config_vol:/etc/config:ro mon_appNettoyage des volumes
Supprimer les volumes non utilisés
docker volume pruneCette commande supprime :
- Tous les volumes qui ne sont attachés à aucun conteneur
- Attention : irréversible !
Forcer la suppression
docker volume prune -fBonnes pratiques
Pour le développement
- Utilisez des bind mounts pour le code source
- Montez les fichiers de config depuis l'hôte
- Utilisez des volumes nommés pour les données
# Exemple de développement optimal
docker run -d \
--name dev_container \
--mount type=bind,source="$(pwd)",target=/app \
--mount type=bind,source="$(pwd)"/config,target=/etc/app \
--mount source=dev_data,target=/app/data \
-p 8000:8000 \
mon_appPour la production
- Toujours utiliser des named volumes pour les données critiques
- Bind mounts uniquement pour les configs read-only
- Backups réguliers des volumes importants
# Exemple de production
docker run -d \
--name prod_app \
--mount source=prod_data,target=/app/data \
--mount type=bind,source=/etc/app-config,target=/etc/app,readonly \
--restart unless-stopped \
mon_appSauvegarde d'un volume
# Créer une sauvegarde
docker run --rm \
--mount source=mon_volume,target=/data \
--mount type=bind,source="$(pwd)",target=/backup \
ubuntu tar czf /backup/backup.tar.gz -C /data .
# Restaurer une sauvegarde
docker run --rm \
--mount source=nouveau_volume,target=/data \
--mount type=bind,source="$(pwd)",target=/backup \
ubuntu tar xzf /backup/backup.tar.gz -C /dataComparaison --mount vs -v
| Aspect | --mount | -v |
|---|---|---|
| Lisibilité | Plus explicite | Plus concis |
| Flexibilité | Plus d'options | Limité |
| Erreurs | Messages clairs | Moins informatif |
| Production | Recommandé | Acceptable |
Exemple équivalent :
# Avec --mount (recommandé)
docker run --mount type=volume,source=data,target=/app/data mon_app
# Avec -v
docker run -v data:/app/data mon_appDiagnostic et résolution de problèmes
Vérifier l'utilisation d'un volume
docker ps --filter volume=mon_volumeVoir les volumes orphelins
docker volume ls -f dangling=trueLocaliser les données d'un volume
docker volume inspect mon_volume | grep MountpointÀ retenir
- Named volumes : production, données critiques, gérés par Docker
- Bind mounts : développement, configs, accès temps réel
- Toujours nettoyer les volumes non utilisés
- Sauvegarder les volumes importants
- Utiliser
--mountpour plus de clarté - Volumes en lecture seule pour les configurations
- Attention aux permissions sur les bind mounts
Liens vers les autres parties
Tags
#docker #volumes #persistance #bind-mounts #named-volumes #données #stockage