Pourquoi un conteneur perd ses données au redémarrage
Écrivez une ligne dans une base de données qui tourne dans un conteneur Docker, arrêtez le conteneur, relancez-le : la ligne a disparu.
Chaque conteneur reçoit son système de fichiers neuf depuis son image à chaque démarrage. Tout ce que le conteneur écrit lui-même — fichiers de base de données, uploads, logs — va dans une couche accessible en écriture qui est jetée quand le conteneur est supprimé. Un volume Docker sert à garder ces données hors du conteneur, là où elles survivent.
Qu’est-ce qu’un volume Docker ?
Un volume Docker est un mécanisme pour sauvegarder les données en dehors du conteneur, de sorte qu’elles persistent même lorsque le conteneur est arrêté, redémarré ou supprimé.
Pensez aux volumes comme à un disque dur externe que vous connectez à votre conteneur. Les données sont écrites sur ce “disque externe” et restent en sécurité indépendamment de ce qui arrive au conteneur.
Pourquoi utiliser les volumes ?
- Persistance : les données survivent au cycle de vie du conteneur
- Partage : plusieurs conteneurs peuvent accéder aux mêmes données
- Sauvegarde : il est plus facile de faire des sauvegardes des données
- Performance : les volumes sont optimisés pour les opérations I/O
- Portabilité : vous pouvez déplacer les données entre différents hôtes
Volumes, bind mounts et tmpfs : lequel choisir
Il y a trois façons de persister des données, dans l’ordre où il faut les envisager : volumes, bind mounts, tmpfs.
1. Volumes - le choix recommandé
Les volumes sont entièrement gérés par Docker et sauvegardés dans un répertoire spécial sur l’hôte (/var/lib/docker/volumes/ sur Linux).
| |
Avantages :
- Gérés par Docker (faciles à créer, supprimer, inspecter)
- Fonctionnent sur Linux, Windows et Mac
- Peuvent être partagés entre plusieurs conteneurs
- Supportent des drivers pour le stockage distant (cloud, NFS, etc.)
2. Bind mounts - connexion directe
Les bind mounts connectent un dossier spécifique de votre ordinateur directement au conteneur.
| |
Quand les utiliser :
- Pendant le développement, pour voir les modifications du code en temps réel
- Quand vous avez besoin d’accéder à des fichiers spécifiques du système hôte
- Pour partager des configurations entre l’hôte et le conteneur
Attention : les bind mounts dépendent de la structure du système de fichiers de l’hôte, ils sont donc moins portables.
3. tmpfs - données temporaires en mémoire
Les tmpfs mounts sauvegardent les données dans la RAM de l’hôte, pas sur le disque.
| |
Quand les utiliser :
- Pour des données sensibles qui ne doivent pas être écrites sur le disque
- Pour des caches temporaires à hautes performances
- Les données sont perdues quand le conteneur s’arrête (et c’est exactement ce que vous voulez)
Commandes de volume Docker : create, list, inspect, remove
Créer un volume
| |
Lister les volumes
| |
Inspecter un volume
| |
Cette commande montre où le volume est physiquement sauvegardé et d’autres informations utiles.
Supprimer un volume
| |
Attention : supprimer un volume signifie perdre toutes les données contenues. Il n’y a pas de corbeille ni de récupération.
Exemples de volume Docker : base de données, dev en live-reload, partage
Exemple 1 : base de données MySQL avec données persistantes
Sans volume, chaque fois que vous redémarrez le conteneur MySQL, vous perdez toutes les données. Voici comment résoudre ce problème :
| |
Maintenant, vous pouvez arrêter, redémarrer ou même supprimer et recréer le conteneur : les données de la base de données resteront intactes dans le volume mysql-data.
Exemple 2 : développement web avec bind mount
Pendant le développement, vous voulez que les modifications du code soient immédiatement visibles dans le conteneur :
| |
Chaque modification des fichiers dans le dossier src sera immédiatement disponible dans le conteneur.
Exemple 3 : partager des données entre conteneurs
Deux conteneurs qui doivent accéder aux mêmes fichiers :
| |
Volumes dans Docker Compose
Dans Docker Compose, vous déclarez les volumes une fois et chaque service qui en a besoin les référence par leur nom :
| |
Avec un simple docker-compose up, Docker crée automatiquement les volumes nécessaires.
Sauvegarder et restaurer un volume Docker
Sauvegarder un volume
| |
Cette commande :
- Monte le volume en lecture seule (
ro) - Crée une archive compressée dans le répertoire actuel
Restaurer une sauvegarde
| |
Erreurs à éviter avec les volumes Docker
1. Oublier le volume pour une base de données
Si vous utilisez une base de données dans Docker sans volume, vous perdrez toutes les données. Toujours.
2. Utiliser des bind mounts en production
Les bind mounts sont excellents pour le développement, mais en production, utilisez les volumes Docker pour plus de portabilité et de sécurité.
3. Ne pas sauvegarder les volumes
Les volumes ne sont pas automatiquement inclus dans les sauvegardes du système. Planifiez des sauvegardes régulières.
4. Accumuler des volumes orphelins
Quand vous supprimez des conteneurs, les volumes restent. Utilisez périodiquement :
| |
Pour supprimer les volumes qui ne sont plus connectés à aucun conteneur.
Quelle option de stockage pour quel usage
| Scénario | Solution |
|---|---|
| Base de données en production | Volume Docker |
| Développement local | Bind mount |
| Données sensibles temporaires | tmpfs |
| Partage entre conteneurs | Volume Docker |
| Fichiers de configuration | Bind mount ou Volume |
| Logs d’application | Volume Docker |
La règle qui couvre la plupart des cas
Utilisez un volume nommé pour tout ce qu’un conteneur écrit et que vous voulez conserver, les bases de données en premier. Utilisez un bind mount quand vous voulez que le conteneur voie un dossier de votre machine pendant que vous l’éditez, c’est-à-dire surtout en développement local. Gardez tmpfs pour les données qui ne doivent jamais toucher le disque.
Une fois qu’une base de données a un volume, vous pouvez supprimer et recréer son conteneur autant de fois que vous voulez : les données restent en place. C’est tout l’intérêt.