Génie civil & structural
Automatiser le nettoyage de conteneur Docker pour enregistrer l'espace disque
Table of Contents
Pourquoi le nettoyage automatisé Docker est essentiel pour la gestion de l'espace disque
Les conteneurs Docker offrent un environnement léger et cohérent pour le développement, les essais et le déploiement des applications. Cependant, la facilité de faire tourner rapidement et de démonter les conteneurs est à un coût : bloat disque. Au fil du temps, les images en suspension, les conteneurs arrêtés, les volumes inutilisés et les restes de la construction de cache s'accumulent, consommant un précieux espace disque.
Un poste de travail de développeur unique peut rassembler des gigaoctets de images Docker non utilisées en quelques semaines. Dans les environnements de production, où les conteneurs sont fréquemment mis à jour ou remplacés, le problème s'équilibre rapidement. Le nettoyage manuel est sujet aux erreurs et souvent négligé.
Comprendre les services de nettoyage Docker ,
Docker fournit une suite de commandes pour supprimer les données inutilisées. Le plus puissant est , qui peut cibler les conteneurs, les images, les volumes et les réseaux.
- – Enlève tous les conteneurs arrêtés, toutes les images en suspension et les réseaux inutilisés.
- – Ajoute la suppression de toutes les images inutilisées (et non pas seulement celles qui sont enroulées), y compris les images non référencées par un conteneur.
- – Prélève également des volumes inutilisés (par défaut les volumes ne sont pas supprimés).
- – Combine tous les drapeaux : suppression de force sans confirmation, toutes les images inutilisées et les volumes.
Pour un contrôle plus granulaire, Docker propose des commandes séparées : , , et . Chacun accepte des filtres (p. ex. ) pour limiter la suppression aux ressources plus anciennes qu'un certain temps.
Configuration étape par étape pour l'automatisation par Cron
Sur les systèmes Linux, cron reste l'outil de planification le plus simple pour les tâches récurrentes. Pour automatiser le nettoyage Docker, vous n'avez besoin que de quelques lignes dans votre crontab.
1. Vérifier le chemin de commande Docker
Les emplois de Cron fonctionnent avec un environnement limité. Déterminer la voie complète de en exécutant:
which docker
Généralement, cela retourne . Utilisez ce chemin dans votre commande cron.
2. Modifier votre Crontab
Exécuter :
crontab -e
Si c'est votre première fois, vous serez invité à choisir un éditeur. Ajoutez une ligne comme celle qui suit pour courir tous les jours à 2:00 AM:
0 2 * * * /usr/bin/docker system prune -af --volumes > /dev/null 2>&1
Le redirige stdout et stderr vers null pour éviter de remplir votre boîte aux lettres avec sortie. Ajustez le calendrier au besoin (p. ex. ] pour une semaine).
3. Testez le travail
Avant de compter sur cron, exécutez la commande manuellement pour s'assurer qu'elle fonctionne comme prévu :
sudo /usr/bin/docker system prune -af --volumes
Si vous utilisez une installation Docker non root, vous devrez peut-être ajouter ou exécuter la tâche cron en tant qu'utilisateur dans le groupe .
Automatisation avancée avec minuteries système
Alors que cron est suffisant pour beaucoup, les minuteurs système offrent une meilleure loging, la gestion de la dépendance, et l'intégration avec le reste du système d'initialisation. Voici comment créer un minuteur pour le nettoyage Docker.
1. Créer un groupe de services
Enregistrer les éléments suivants comme :
[Unit]
Description=Docker system prune
Wants=docker.service
After=docker.service
[Service]
Type=oneshot
ExecStart=/usr/bin/docker system prune -af --volumes
User=root
StandardOutput=journal
2. Créer une unité de minuterie
Enregistrer sous :
[Unit]
Description=Run Docker cleanup daily
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
3. Activer et démarrer la minuterie
sudo systemctl daemon-reload
sudo systemctl enable docker-cleanup.timer
sudo systemctl start docker-cleanup.timer
Vérifier avec . Cette approche enregistre la sortie de la revue systèmed, ce qui facilite l'audit des opérations de nettoyage.
Configuration des filtres de nettoyage pour les politiques de conservation
La taille agressive est sûre pour la plupart des environnements de développement, mais les systèmes de production peuvent exiger des politiques de conservation . Par exemple, vous pouvez vouloir garder des images étiquetées comme ou , ou seulement supprimer des ressources plus de 48 heures.
Filtrer par Âge
Pour tailler des images et des contenants inutilisés plus de 24 heures :
docker system prune -af --filter "until=24h" --volumes
Le filtre fonctionne à la fois pour les images et les conteneurs. Combiner avec plusieurs fois pour des règles plus complexes.
Exclure les ressources spécifiques
Docker n'a pas de liste d'exclusion intégrée, mais vous pouvez utiliser des étiquettes pour empêcher la suppression. Étiquette des conteneurs ou des images importants (p. ex. ), puis utiliser un filtre d'étiquette négatif (pas encore supporté dans . Un contournement consiste à combiner avec des scripts personnalisés qui vérifient les étiquettes avant la suppression.
Surveillance de l'espace disque et de l'efficacité du nettoyage
L'automatisation est seulement aussi bonne que votre surveillance. Configurez des alertes pour suivre l'utilisation du disque après chaque nettoyage.
- Courir dans un travail de cron et enregistrer les résultats.
- Utiliser un outil comme efflux-système-ressources[ pour envoyer des mesures à InfluxDB ou Prométhée.
- Intégration avec Datadog[ ou Nouvelle relique[ pour visualiser le stockage Docker au fil du temps.
Si votre nettoyage fonctionne mais que l'utilisation du disque reste élevée, examinez en utilisant pour voir où l'espace est consommé. Les coupables courants comprennent le cache de construction dans les systèmes d'IC ou de grands volumes qui ne sont pas enlevés parce qu'ils sont toujours référencés par des conteneurs arrêtés.
Meilleures pratiques en matière d'environnement de production
1. Toujours utiliser une approche par étapes
Commencez par une sortie hebdomadaire à sec en utilisant sans drapeau (pour voir ce qui serait supprimé).
2. Coordonner avec les pipelines CI/CD
Si votre système de construction crée de nombreuses images temporaires, planifiez la taille après les constructions ou pendant les fenêtres à faible trafic. Évitez la taille pendant que les constructions fonctionnent pour empêcher l'enlèvement accidentel de couches intermédiaires qui sont encore en usage.
3. Données critiques de sauvegarde
Les volumes contenant des bases de données ou des téléchargements d'utilisateurs doivent être sauvegardés avant toute taille agressive de volume. Utilisez des outils de gestion de volume comme avec pour lier le stockage externe de montage qui ne sera pas affecté par le prune.
4. Exécuter la taille comme utilisateur non-routier
Pour la sécurité, évitez d'exécuter des tâches cron comme root à moins que cela ne soit nécessaire. Ajoutez votre utilisateur au groupe et exécutez le travail sans . Cependant, notez que tout utilisateur du groupe a effectivement accès à la racine de l'hôte; évaluez le risque dans votre environnement.
5. Activité de nettoyage des registres
Rediriger la sortie vers un fichier journal au lieu de pour la vérification :
0 2 * * * /usr/bin/docker system prune -af --volumes >> /var/log/docker-cleanup.log 2>&1
Vérifiez régulièrement le journal des erreurs ou des suppressions inattendues.
Pièges courants et comment les éviter
- : Le drapeau supprime toutes les images inutilisées, y compris les couches intermédiaires qui pourraient être nécessaires pour les constructions futures. Si vous rebâtissez fréquemment, envisagez de mettre en place un filtre ou un fonctionnement court ] sans .
- Volumes contenant un état important[: Par défaut, ne supprime pas les volumes à moins que le drapeau ne soit utilisé. Ajoutez ce drapeau seulement si vous êtes certain qu'aucun volume ne détient des données persistantes.
- La connectivité de rupture de conteneur de pruneau réseau[: supprime les réseaux inutilisés. Si un réseau personnalisé n'est plus référencé par aucun conteneur, il sera supprimé, potentiellement casser le démarrage futur de conteneur. Gardez cela à l'esprit si vous utilisez des réseaux de superposition en Swarm.
- Cron issues : Docker peut ne pas être dans le PATH quand cron tourne. Utilisez toujours le chemin complet vers le binaire.
Autres outils et approches
Alors que les commandes Docker natives couvrent la plupart des besoins, plusieurs outils tiers fournissent des fonctionnalités avancées:
- Watchtower – Automatise la mise à jour des conteneurs en cours d'exécution et peut nettoyer les anciennes images après les mises à jour.
- Portainer – Un interface web pour la gestion Docker qui comprend une fonction de nettoyage programmée.
- prune de constructeur d'éclisses – Des cibles spécifiques construisent le cache, qui peut être énorme dans les pipelines CI/CD.
Pour les environnements de Kubernetes, envisager d'utiliser kubelet collecte des ordures et des outils comme Kured[ ou Descheduler pour le nettoyage des nodes.
Conclusion
Automatiser le nettoyage des conteneurs Docker est une pratique simple mais critique pour maintenir un hôte Docker sain et efficace. Que vous choisissiez des cron, des minuteurs système ou un outil tiers, la clé est d'exécuter régulièrement la taille avec une politique qui équilibre les économies de disque contre le risque de supprimer les données dont vous avez besoin. Commencez avec les filtres et les journaux, puis serrez votre horaire à mesure que votre confiance augmente. En intégrant le nettoyage automatisé dans votre routine opérationnelle, vous assurez que l'espace disque ne devienne jamais un goulot d'étranglement et vos conteneurs restent maigres, sécurisés et performants.