Theme
Lecon 7 / 8MAJ 24 sept. 2025
Parcours Cours Docker pour débutants

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.

#docker#volumes#persistance#bind-mounts#named-volumes#données

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

TypeDescriptionCas d'usage
Named volumeVolume géré par Docker (stocké dans /var/lib/docker/volumes)Production, bases de données
Bind mountMonte un dossier local dans le conteneurDéveloppement, fichiers de config

Named Volumes (recommandé pour la production)

Créer un volume

docker volume create mon_volume

Utiliser un volume avec un conteneur

docker run -d -v mon_volume:/data --name mon_conteneur busybox

Avec la syntaxe --mount (recommandée) :

docker run -d --name mon_conteneur \
  --mount source=mon_volume,target=/data \
  busybox

Exemple 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:15

Avantages 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_app

Avec --mount :

docker run --mount type=bind,source="$(pwd)"/logs,target=/app/logs mon_app

Exemple 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 dev

Avantages 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 ls

Inspecter un volume

docker volume inspect mon_volume

Informations 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_volume

Partager 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_app

Volumes en lecture seule

docker run -d \
  --mount source=config_vol,target=/etc/config,readonly \
  mon_app

Avec -v :

docker run -d -v config_vol:/etc/config:ro mon_app

Nettoyage des volumes

Supprimer les volumes non utilisés

docker volume prune

Cette commande supprime :

  • Tous les volumes qui ne sont attachés à aucun conteneur
  • Attention : irréversible !

Forcer la suppression

docker volume prune -f

Bonnes 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_app

Pour 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_app

Sauvegarde 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 /data

Comparaison --mount vs -v

Aspect--mount-v
LisibilitéPlus explicitePlus concis
FlexibilitéPlus d'optionsLimité
ErreursMessages clairsMoins informatif
ProductionRecommandé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_app

Diagnostic et résolution de problèmes

Vérifier l'utilisation d'un volume

docker ps --filter volume=mon_volume

Voir les volumes orphelins

docker volume ls -f dangling=true

Localiser 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 --mount pour 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