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ère | Volume | Bind mount | tmpfs |
|---|---|---|---|
| Géré par Docker | Oui | Non | N/A |
| Performance | Bonne | Bonne (dev) | Excellente |
| Persistance | Oui | Oui | Non |
| Partage inter-conteneurs | Oui | Oui | Non |
| Cas d'usage | Bases de données, prod | Dev live reload | Secrets, 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