Intermédiaire50 min35 XP
Objectifs de cette leçon
- Persister les données avec les volumes
- Comprendre la différence bind mounts vs volumes
- Gérer le partage de données entre conteneurs
Volumes et persistance des données 💾
Le problème de la persistance
Par défaut, les données dans un conteneur sont éphémères :
# Créer un conteneur et ajouter un fichier docker run -it ubuntu bash root@abc:/# echo "données importantes" > /data.txt root@abc:/# exit # Supprimer le conteneur docker rm abc # Les données sont PERDUES 💀
Solution : Utiliser des volumes ou des bind mounts.
Les 3 types de stockage
1. Volumes nommés (recommandé en prod)
┌─────────────────────────┐ │ Conteneur │ │ /app/data ──────────┐ │ └──────────────────────┼───┘ │ ┌──────────▼──────────┐ │ Volume Docker │ │ (géré par Docker) │ │ /var/lib/docker/ │ │ volumes/ │ └─────────────────────┘
# Créer un volume docker volume create mon-volume # Lister les volumes docker volume ls # Utiliser un volume docker run -d \ -v mon-volume:/app/data \ mon-app # Inspecter un volume docker volume inspect mon-volume
2. Bind mounts (développement)
┌─────────────────────────┐ │ Conteneur │ │ /app ─────────────┐ │ └────────────────────┼─────┘ │ ┌────────────▼────────────┐ │ Répertoire de l'hôte │ │ /home/dev/mon-app │ └─────────────────────────┘
# Monter un dossier de l'hôte docker run -d \ -v $(pwd):/app \ -v /app/node_modules \ mon-app # Le 2ème -v empêche l'écrasement de node_modules
3. tmpfs (données temporaires)
# Données en mémoire uniquement (disparaissent à l'arrêt) docker run -d \ --tmpfs /app/tmp \ mon-app
Commandes pour les volumes
# Créer un volume docker volume create ma-bdd # Lister les volumes docker volume ls # Inspecter un volume docker volume inspect ma-bdd # Supprimer un volume docker volume rm ma-bdd # Supprimer tous les volumes inutilisés docker volume prune
Exemple concret : PostgreSQL avec volume
# Créer un volume pour les données docker volume create pgdata # Lancer PostgreSQL avec le volume docker run -d \ --name ma-postgres \ -e POSTGRES_PASSWORD=secret \ -v pgdata:/var/lib/postgresql/data \ -p 5432:5432 \ postgres:15-alpine # Les données survivent aux redémarrages ! docker stop ma-postgres docker start ma-postgres # → Les données sont toujours là ✅
Bonnes pratiques
| Cas | Type recommandé | Exemple |
|---|---|---|
| Base de données | Volume nommé | -v pgdata:/var/lib/postgresql/data |
| Développement | Bind mount | -v $(pwd)/src:/app/src |
| Fichiers temporaires | tmpfs | --tmpfs /app/cache |
| Configuration | Bind mount ou config | -v ./nginx.conf:/etc/nginx/nginx.conf |
Exercices 🎯
- Volume : Créez un volume, montez-le dans un conteneur, ajoutez un fichier, supprimez le conteneur, recréez-le avec le même volume. Le fichier est toujours là ?
- Bind mount : Montez votre dossier de code dans un conteneur et modifiez un fichier. La modification apparaît-elle dans le conteneur ?
- Persistance : Lancez PostgreSQL avec un volume, créez une table, redémarrez le conteneur. La table est toujours là ?
Prochaine leçon : Les réseaux Docker.
Volumes et persistance
Cliquez pour basculerConteneurNginx
Disque hôte/data
⚠️ docker rm <conteneur> → données perdues !
$ docker run -d nginx