1. Pourquoi persister les données ?

Par défaut, le système de fichiers d'un conteneur est éphémère — toutes les données sont perdues à la suppression du conteneur. Les volumes permettent de persister les données au-delà du cycle de vie du conteneur.

# Problème : données perdues à la suppression
docker run --rm postgres echo "data created"
# → Données PostgreSQL supprimées avec le conteneur !

# Solution : volume nommé
docker run -v pgdata:/var/lib/postgresql/data postgres
# → Données survivent à la recréation du conteneur

2. Types de montage

╔══════════════╦═══════════════════════════════════╗
║ Type         ║ Description                       ║
╠══════════════╬═══════════════════════════════════╣
║ Volume       ║ Géré par Docker dans /var/lib/docker
║ Bind mount   ║ Dossier hôte monté dans le conteneur
║ tmpfs        ║ RAM — éphémère, non persistant    ║
╚══════════════╩═══════════════════════════════════╝
CritèreVolumeBind mounttmpfs
Géré par DockerOuiNonN/A
PerformanceBonneBonne (dev)Excellente
PersistanceOuiOuiNon
Partage inter-conteneursOuiOuiNon
Cas d'usageBases de données, prodDev live reloadSecrets, cache

3. Volumes nommés

# Créer un volume
docker volume create pgdata

# Lister les volumes
docker volume ls

# Inspecter un volume
docker volume inspect pgdata

# Utiliser un volume
docker run -d \
  --name postgres \
  -v pgdata:/var/lib/postgresql/data \
  -e POSTGRES_PASSWORD=secret \
  postgres:15

# Syntaxe --mount (plus explicite)
docker run \
  --mount type=volume,source=pgdata,target=/var/lib/postgresql/data \
  postgres:15

# Supprimer un volume
docker volume rm    pgdata
docker volume prune          # Tous les volumes inutilisés

4. Bind Mounts

Un bind mount monte un dossier ou fichier de l'hôte dans le conteneur. Idéal pour le développement (live reload).

# Monter le dossier courant dans /app
docker run -v $(pwd):/app node:18-alpine npm start

# Windows PowerShell
docker run -v ${PWD}:/app node:18-alpine npm start

# Read-only mount
docker run -v $(pwd)/config:/app/config:ro monapp

# Syntaxe --mount
docker run \
  --mount type=bind,source=$(pwd),target=/app,readonly \
  monapp
Dev workflow : Pour une app Node.js, montez le code source mais excluez node_modules avec un volume anonyme : docker run -v $(pwd):/app -v /app/node_modules node:18-alpine

5. tmpfs (RAM)

# Monter en RAM — données non persistées, rapide
docker run --tmpfs /tmp monapp

# Avec taille et options
docker run \
  --mount type=tmpfs,target=/tmp,tmpfs-size=100m \
  monapp

# Cas d'usage : secrets temporaires, cache, sessions

6. Sauvegarde & Restauration

# Sauvegarder un volume dans une archive tar
docker run --rm \
  -v pgdata:/data \
  -v $(pwd):/backup \
  alpine tar czf /backup/pgdata-backup.tar.gz -C /data .

# Restaurer depuis l'archive
docker run --rm \
  -v pgdata:/data \
  -v $(pwd):/backup \
  alpine tar xzf /backup/pgdata-backup.tar.gz -C /data

# Copier des données entre volumes
docker run --rm \
  -v source-vol:/from \
  -v dest-vol:/to \
  alpine cp -a /from/. /to