Intro
Les volumes Docker sont le moyen recommandé pour persister les données générées et utilisées par les conteneurs Docker. En production, une gestion correcte des volumes est essentielle pour garantir la disponibilité, l'intégrité et la récupérabilité des données. Un processus opérationnel clair pour les volumes Docker réduit les retouches en séparant les étapes de recherche, de configuration et de publication. Cet article fournit une checklist pratique et concrète pour exploiter les volumes Docker en production, couvrant l'inventaire de l'environnement, la configuration sûre, la vérification, la récupération après échec et les opérations courantes. Pour la production des volumes Docker, le premier pilote utile doit être étroit, mesurable et facile à inspecter localement avant le déploiement. En suivant cette checklist, les développeurs, consultants DevOps et équipes techniques de startups peuvent éviter les pièges courants et maintenir une persistance fiable des données.
Inventaire de la version et de l'environnement
Avant toute modification, établissez une image complète de l'environnement Docker. Cela inclut la version du moteur Docker, le pilote de stockage, les plugins de volume éventuels et la topologie des conteneurs utilisant des volumes. Connaître ces détails permet d'éviter les problèmes de compatibilité et de planifier les fenêtres de maintenance.
Étape 1 : Vérifier la version de Docker et le pilote de stockage
Exécutez la commande suivante pour afficher les informations de version de Docker et le pilote de stockage actuel :
docker version
Sortie attendue (exemple) :
Client: Docker Engine - Community
Version: 24.0.7
API version: 1.43
Go version: go1.20.10
Git commit: afdd53b
Built: Thu Oct 26 09:08:17 2023
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 24.0.7
API version: 1.43 (minimum version 1.12)
Go version: go1.20.10
Git commit: 311b9ff
Built: Thu Oct 26 09:08:17 2023
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.27
GitCommit: 9f7e1c1d
runc:
Version: 1.1.10
GitCommit: v1.1.10-0-g18a0cb0
docker-init:
Version: 0.19.0
GitCommit: de40ad0
La version du serveur et l'OS/Arch indiquent l'environnement hôte. Pour obtenir le pilote de stockage :
docker info --format '{{.Driver}}'
Sortie attendue (communément overlay2) :
overlay2
Si un plugin de volume est utilisé (par exemple, pour le stockage cloud), vérifiez sa version séparément.
Étape 2 : Lister les volumes existants
Listez tous les volumes pour comprendre l'utilisation actuelle :
docker volume ls
Exemple de sortie :
DRIVER VOLUME NAME
local app_data
local db_data
local logs
Pour chaque volume, inspectez ses détails, y compris le point de montage et les libellés :
docker volume inspect app_data
Exemple de sortie :
[
{
"CreatedAt": "2023-11-01T10:00:00Z",
"Driver": "local",
"Labels": {
"com.example.app": "web"
},
"Mountpoint": "/var/lib/docker/volumes/app_data/_data",
"Name": "app_data",
"Options": {},
"Scope": "local"
}
]
Étape 3 : Identifier les conteneurs utilisant des volumes
Déterminez quels conteneurs montent quels volumes :
docker ps --filter volume=app_data --format 'table {{.ID}}\t{{.Names}}\t{{.Image}}\t{{.Mounts}}'
Exemple de sortie :
CONTAINER ID NAMES IMAGE MOUNTS
abc123def456 web1 nginx: latest /usr/share/nginx/html, app_data
Alternativement, inspectez les montages d'un conteneur :
docker inspect web1 --format '{{json .Mounts}}' | jq
Cela montre le nom du volume, le chemin de destination et le statut lecture-écriture. Documentez toutes les relations volume-conteneur.
Étape 4 : Évaluer le système de fichiers hôte et la capacité
Assurez-vous d'avoir suffisamment d'espace disque sur l'emplacement de montage du volume. Vérifiez l'utilisation du disque :
df -h /var/lib/docker/volumes
Exemple de sortie :
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 100G 60G 40G 60% /var/lib/docker
Si vous utilisez une partition séparée pour les volumes, vérifiez-la. Vérifiez également que le système de fichiers prend en charge les fonctionnalités requises (par exemple, pour overlay2).
Tableau d'inventaire de la topologie
Documentez l'environnement dans un tableau, par exemple :
| Nom du volume | Pilote | Point de montage | Utilisé par le(s) conteneur(s) | Chemin de montage dans le conteneur | Lecture-écriture |
|---|---|---|---|---|---|
| app_data | local | /var/lib/docker/volumes/app_data/_data | web1 | /usr/share/nginx/html | rw |
| db_data | local | /var/lib/docker/volumes/db_data/_data | db1 | /var/lib/postgresql/data | rw |
| logs | local | /var/lib/docker/volumes/logs/_data | web1, web2 | /var/log/app | ro |
Cet inventaire sert de référence pour toutes les opérations ultérieures.
Chemin de configuration sûr
Lors de la configuration des volumes pour la production, suivez une approche délimitée et testable. Évitez de faire des modifications larges sans validation. Commencez par un petit volume pilote mesurable pour tester les configurations avant de les déployer sur des services critiques.
Étape 1 : Choisir le bon type de volume
Docker prend en charge les volumes nommés et les montages de liaison. Les volumes nommés sont gérés par Docker et sont le choix recommandé pour la production car ils sont isolés des chemins de l'hôte, prennent en charge les pilotes de volume et peuvent être sauvegardés plus facilement. Les montages de liaison dépendent de la structure du système de fichiers de l'hôte et peuvent avoir des problèmes de permissions. Utilisez des volumes nommés pour les données applicatives persistantes ; utilisez les montages de liaison uniquement pour le développement ou lorsque le chemin de l'hôte doit être partagé directement.
Étape 2 : Créer un volume nommé avec des libellés explicites
Les libellés aident à organiser et automatiser la gestion des volumes. Créez un volume avec des libellés :
docker volume create \
--label com.example.project=myapp \
--label com.example.env=production \
--label com.example.data=critical \
app_data
Vérifiez la création :
docker volume ls --filter label=com.example.project=myapp
Sortie :
DRIVER VOLUME NAME
local app_data
Étape 3 : Monter correctement les volumes dans les conteneurs
Lors de l'exécution de conteneurs, utilisez la syntaxe --mount pour plus de clarté et éviter l'ambiguïté. Exemple pour un conteneur de base de données :
docker run -d \
--name db1 \
-e POSTGRES_PASSWORD=secret \
--mount source=db_data, target=/var/lib/postgresql/data \
postgres:16
Cela définit explicitement le volume source et le chemin cible. Vérifiez que le conteneur est en cours d'exécution et que le volume est monté :
docker inspect db1 --format '{{json .Mounts}}' | jq
Extrait de la sortie attendue :
[
{
"Type": "volume",
"Name": "db_data",
"Source": "/var/lib/docker/volumes/db_data/_data",
"Destination": "/var/lib/postgresql/data",
"Driver": "local",
"Mode": "rw",
"RW": true,
"Propagation": "rprivate"
}
]
Étape 4 : Utiliser Docker Compose pour les configurations multi-conteneurs
Pour les applications avec plusieurs services, définissez les volumes dans un fichier Compose (docker-compose.yml) et utilisez des configurations sous contrôle de version. Exemple :
version: '3.8'
services:
web:
image: nginx:1.25
volumes:
- app_data:/usr/share/nginx/html
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: secret
volumes:
- db_data:/var/lib/postgresql/data
volumes:
app_data:
labels:
com.example.project: myapp
db_data:
labels:
com.example.project: myapp
Démarrez avec Compose :
docker compose up -d
Vérifiez que les volumes sont créés et attachés :
docker compose ps
Étape 5 : Définir les options de volume pour les performances et la fiabilité
Pour les volumes locaux, vous pouvez spécifier des options comme des limites de taille ou des options de montage, mais cela dépend du pilote de volume. Pour le pilote local par défaut, les options sont limitées. Pour des besoins avancés, envisagez un plugin de volume (par exemple, pour NFS ou le stockage cloud) et testez sa configuration dans un pilote.
Checklist de configuration
- Utiliser des volumes nommés pour toutes les données persistantes.
- Ajouter des libellés pour l'environnement, l'application et la criticité.
- Utiliser la syntaxe
--mountdans les commandesdocker run. - Définir les volumes dans les fichiers Compose et les stocker sous contrôle de version.
- Tester tout pilote de volume personnalisé ou option dans un environnement hors production d'abord.
- Ne jamais monter de répertoires sensibles de l'hôte dans les conteneurs sauf si absolument nécessaire, et alors en mode lecture seule si possible.
Vérification et diagnostics
Après la configuration des volumes, vérifiez qu'ils fonctionnent comme prévu et mettez en place des diagnostics réguliers. Cette section fournit des commandes concrètes et des sorties attendues pour confirmer la persistance des données et l'intégrité des volumes.
Étape 1 : Tester la persistance des données à travers le redémarrage du conteneur
Le but principal d'un volume est de persister les données même si le conteneur est supprimé. Testez en écrivant un fichier sur le volume, en supprimant le conteneur, puis en lisant le fichier depuis un nouveau conteneur.
Exécutez un conteneur temporaire qui écrit un fichier :
docker run --rm -v app_data:/data alpine sh -c 'echo "Hello Persistent World" > /data/testfile.txt'
Vérifiez que le fichier existe sur l'hôte au point de montage du volume :
sudo cat /var/lib/docker/volumes/app_data/_data/testfile.txt
Sortie attendue :
Hello Persistent World
Maintenant, démarrez un nouveau conteneur et lisez le fichier :
docker run --rm -v app_data:/data alpine cat /data/testfile.txt
Sortie attendue :
Hello Persistent World
Cela confirme que le volume conserve les données indépendamment du cycle de vie du conteneur.
Étape 2 : Vérifier l'utilisation et la santé du volume
Surveillez la taille du volume pour détecter une croissance inattendue ou des problèmes de capacité proche. Utilisez du sur l'hôte :
sudo du -sh /var/lib/docker/volumes/app_data/_data
Exemple de sortie :
24K /var/lib/docker/volumes/app_data/_data
Du point de vue du conteneur, exécutez :
docker exec db1 df -h /var/lib/postgresql/data
Sortie attendue (exemple) :
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 100G 1.2G 98G 2% /var/lib/postgresql/data
Mettez en place des alertes si l'utilisation du volume dépasse un seuil.
Étape 3 : Vérifier les permissions et la propriété du volume
Des permissions incorrectes peuvent causer des échecs d'application. Vérifiez la propriété à l'intérieur du conteneur :
docker exec web1 ls -l /usr/share/nginx/html
Exemple de sortie :
total 4
-rw-r--r-- 1 root root 24 Nov 1 10:00 testfile.txt
Si une application s'exécute en tant que non-root, assurez-vous que les fichiers du volume sont possédés par l'utilisateur approprié. Vous devrez peut-être ajuster la propriété sur l'hôte ou utiliser un conteneur d'initialisation.
Étape 4 : Diagnostiquer les problèmes de montage de volume avec les événements
Si un conteneur ne démarre pas à cause d'un problème de volume, consultez les journaux et événements Docker :
docker logs db1
Recherchez des messages comme "Permission denied" ou "No such file or directory". Pour des événements plus larges :
docker events --filter volume=app_data --since 24h
Cela montre les événements liés au volume (create, mount, unmount, destroy).
Étape 5 : Valider la fonctionnalité du pilote de volume
Pour les pilotes de volume personnalisés, testez que le pilote peut créer, monter et supprimer un volume. Exemple avec un pilote nfs hypothétique :
docker volume create --driver nfs --opt share=server:/export --name nfs-test
Ensuite, lancez un conteneur avec lui et vérifiez l'écriture/lecture. Supprimez après le test :
docker volume rm nfs-test
Assurez-vous qu'aucune erreur ne se produit.
Tableau récapitulatif des commandes de diagnostic
| Commande | Objectif | Sortie attendue |
|---|---|---|
docker volume ls | Lister les volumes | Liste des volumes avec pilote et nom |
docker volume inspect <name> | Afficher les détails du volume | JSON avec point de montage, libellés, options |
docker ps --filter volume=<name> | Trouver les conteneurs utilisant le volume | Liste des conteneurs avec info de montage |
docker exec <container> df -h <path> | Vérifier l'utilisation du disque dans le conteneur | Utilisation du système de fichiers pour le chemin monté |
sudo du -sh <mountpoint> | Vérifier la taille du volume sur l'hôte | Taille lisible par l'homme |
docker events --filter volume=<name> | Surveiller les événements du volume | Flux d'événements pour les activités du volume |
Modes de défaillance et récupération
Les opérations de production doivent prévoir les défaillances : volumes corrompus, suppression accidentelle, disque plein ou mauvaise configuration des conteneurs. Cette section explique les modes de défaillance courants et comment s'en remettre, y compris les procédures de restauration.
Mode de défaillance 1 : Suppression accidentelle de volume
Si un volume est supprimé alors qu'il est encore utilisé ou avant une sauvegarde, les données peuvent être perdues définitivement. Pour atténuer cela, mettez en œuvre des sauvegardes régulières et activez les politiques de rétention de volume de Docker (si disponibles).
Récupération : Si vous avez une sauvegarde, restaurez-la. Si le volume est encore référencé par un conteneur arrêté, vous pourrez peut-être récupérer à partir des métadonnées du conteneur, mais ce n'est pas garanti. Ayez toujours des sauvegardes.
Mode de défaillance 2 : Corruption de volume
La corruption peut survenir à cause de problèmes matériels, de coupures de courant soudaines ou de bogues du système de fichiers. Les symptômes incluent des erreurs d'E/S dans les journaux du conteneur ou des échecs de vérification d'intégrité des données.
Étapes de récupération :
- Arrêtez le conteneur affecté :
docker stop <container>. - Démontez le volume de tous les conteneurs.
- Exécutez des vérifications du système de fichiers sur l'hôte (si possible, démontez d'abord le volume) :
sudo umount /var/lib/docker/volumes/<volname>/_data
sudo fsck /dev/sda1 # ou le périphérique approprié
- Si la corruption est grave, restaurez à partir de la sauvegarde.
- Remontez et redémarrez les conteneurs.
Mode de défaillance 3 : Espace disque insuffisant
Lorsque le disque hôte est plein, les conteneurs peuvent échouer à écrire, ou Docker peut arrêter les opérations. Surveillez proactivement l'utilisation du disque.
Récupération :
- Identifiez les volumes volumineux avec
du:
sudo du -h --max-depth=1 /var/lib/docker/volumes | sort -rh
- Nettoyez les images et conteneurs inutilisés :
docker system prune -a --volumes # attention : supprime les volumes inutilisés
- Si les volumes critiques sont trop volumineux, envisagez de les déplacer vers un disque plus grand ou mettez en œuvre la rotation des journaux.
Mode de défaillance 4 : Problèmes de permissions après mise à jour du conteneur
Lors de la mise à niveau d'une image d'application qui change l'utilisateur d'exécution, les fichiers du volume peuvent ne pas être accessibles.
Récupération :
- Vérifiez la propriété et les permissions :
docker exec <container> id
docker exec <container> ls -l /path/to/volume
- Ajustez la propriété sur l'hôte ou en utilisant un conteneur temporaire :
docker run --rm -v <volname>:/data alpine chown -R 1000:1000 /data
Mode de défaillance 5 : Perte de données due à une mauvaise configuration de montage de liaison
L'utilisation de montages de liaison avec des chemins relatifs ou de mauvais chemins hôte peut entraîner l'écriture de données à des emplacements inattendus ou leur non-persistance.
Prévention : Utilisez toujours des chemins absolus pour les montages de liaison et préférez les volumes nommés.
Récupération : Vérifiez la configuration de montage du conteneur et corrigez le chemin. Si des données ont été écrites au mauvais chemin hôte, déplacez-les vers le bon emplacement.
Stratégies de restauration
Pour tout changement de configuration, ayez un plan de restauration. Par exemple, si une mise à jour de pilote de volume casse les montages de volume, revenez à la version précédente du pilote. Gardez des sauvegardes des données de volume et des fichiers de configuration. Utilisez les capacités de snapshot de volume de Docker si disponibles (via des outils tiers ou des plugins de volume).
Commandes de sauvegarde et de restauration
Des sauvegardes régulières sont essentielles. Voici une méthode simple de sauvegarde utilisant un conteneur temporaire pour archiver le contenu du volume :
docker run --rm -v app_data:/data -v $(pwd):/backup alpine tar czf /backup/app_data_backup-$(date +%Y%m%d).tar.gz -C /data .
Cela crée une archive horodatée dans le répertoire courant.
Pour restaurer :
docker run --rm -v app_data:/data -v $(pwd):/backup alpine sh -c 'cd /data && tar xzf /backup/app_data_backup-20240101.tar.gz'
Testez périodiquement les sauvegardes en les restaurant dans un volume de test et en vérifiant l'intégrité des données.
Checklist des opérations
La checklist suivante résume les tâches de routine pour exploiter les volumes Docker en production. Effectuez-les à intervalles réguliers (quotidien, hebdomadaire, mensuel) ou après des modifications.
Vérifications quotidiennes
- [ ] Vérifier que tous les conteneurs critiques sont en cours d'exécution et que leurs volumes sont montés :
docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Mounts}}'
- [ ] Vérifier l'espace disque sur les points de montage des volumes :
df -h /var/lib/docker/volumes
- [ ] Examiner les événements Docker pour les erreurs de volume :
docker events --since 24h --filter type=volume
Vérifications hebdomadaires
- [ ] Exécuter les tâches de sauvegarde pour tous les volumes critiques et vérifier que les tailles des fichiers de sauvegarde sont raisonnables.
- [ ] Tester la restauration d'une sauvegarde dans un volume temporaire.
- [ ] Vérifier les tendances d'utilisation des volumes à l'aide d'outils de journalisation ou de surveillance.
Vérifications mensuelles
- [ ] Examiner les libellés de volume et nettoyer les volumes inutilisés :
docker volume prune
(Attention : cela supprime tous les volumes inutilisés. Utilisez --filter pour limiter la portée si nécessaire.)
- [ ] Auditer les permissions et propriétés des volumes pour la cohérence.
- [ ] Vérifier les mises à jour des pilotes de volume et tester dans un environnement de préproduction.
Checklist de gestion des changements
Lors de l'introduction de changements (nouveaux volumes, mises à jour de pilotes, modifications de configuration) :
- [ ] Tester dans un environnement hors production d'abord.
- [ ] Documenter le changement et le plan de restauration.
- [ ] Effectuer une sauvegarde avant d'appliquer les changements.
- [ ] Surveiller de près après le déploiement pendant au moins 24 heures.
Référence rapide de réponse aux incidents
- [ ] Si un volume échoue, arrêtez immédiatement les écritures vers le conteneur affecté.
- [ ] Évaluez si une sauvegarde est disponible et à jour.
- [ ] Tentez une réparation du système de fichiers si une corruption est suspectée.
- [ ] Restaurez à partir d'une sauvegarde si nécessaire.
- [ ] Documentez l'incident et mettez à jour les checklists pour éviter qu'il ne se reproduise.
Conclusion
L'exploitation des volumes Docker en production exige une planification minutieuse, une surveillance cohérente et des procédures de récupération testées. En suivant cette checklist pratique, les équipes peuvent garantir la persistance des données, éviter les pièges courants et maintenir la fiabilité du système. Commencez par inventorier vos volumes et votre environnement actuels, puis mettez en œuvre des pratiques de configuration sûres avec des volumes nommés et des libellés. Vérifiez régulièrement la santé des volumes grâce à des diagnostics et des sauvegardes. Préparez-vous aux défaillances en comprenant les modes courants et en ayant des processus de restauration prêts. Utilisez la checklist des opérations pour intégrer ces tâches dans les routines quotidiennes. Les checklists d'opérations de production des volumes Docker aident les équipes à transformer les sujets de gestion des volumes en guides pratiques et révisés. Avec ces étapes, vous pouvez gérer les volumes Docker en production avec confiance.
Remarque : Tous les exemples de cet article sont illustratifs. Adaptez les commandes à votre environnement spécifique et testez dans une zone de préproduction avant de les appliquer à la production.