Docker pour les devs - 29 - Nettoyer Docker avant qu'il mange ton disque

Dangling images, build cache, conteneurs arretes et volumes orphelins : comment récupérer des Go d'espace disque.

  1. 01 Docker pour les devs - 00 - Pourquoi Docker change tout
  2. 02 Docker pour les devs - 01 - Containers vs VMs
  3. 03 Docker pour les devs - 02 - L'architecture de Docker
  4. 04 Docker pour les devs - 03 - Docker Desktop, Engine et alternatives
  5. 05 Docker pour les devs - 04 - Écrire un Dockerfile
  6. 06 Docker pour les devs - 05 - Layers et cache
  7. 07 Docker pour les devs - 06 - Le .dockerignore
  8. 08 Docker pour les devs - 07 - Multi-stage builds
  9. 09 Docker pour les devs - 08 - Choisir son image de base
  10. 10 Docker pour les devs - 09 - Docker Compose, les bases
  11. 11 Docker pour les devs - 10 - Docker Compose avance
  12. 12 Docker pour les devs - 11 - Networking Docker, les bases
  13. 13 Docker pour les devs - 12 - Networking Docker avance
  14. 14 Docker pour les devs - 13 - Volumes et persistance
  15. 15 Docker pour les devs - 14 - Variables d'environnement et secrets
  16. 16 Docker pour les devs - 15 - Permissions et utilisateurs
  17. 17 Docker pour les devs - 16 - Docker et monorepo
  18. 18 Docker pour les devs - 17 - Dev vs Prod
  19. 19 Docker pour les devs - 18 - ENTRYPOINT, CMD et scripts d'initialisation
  20. 20 Docker pour les devs - 19 - Debugger ses conteneurs
  21. 21 Docker pour les devs - 20 - Bases de donnees dans Docker
  22. 22 Docker pour les devs - 21 - Sauvegardes et restauration
  23. 23 Docker pour les devs - 22 - Conteneuriser un frontend
  24. 24 Docker pour les devs - 23 - Sécurité des conteneurs
  25. 25 Docker pour les devs - 24 - Optimisation des images
  26. 26 Docker pour les devs - 25 - Builds multi-platform
  27. 27 Docker pour les devs - 26 - Limiter les ressources de tes conteneurs
  28. 28 Docker pour les devs - 27 - Gerer les logs comme un adulte
  29. 29 Docker pour les devs - 28 - Healthchecks et restart policies
  30. 30 Docker pour les devs - 29 - Nettoyer Docker avant qu'il mange ton disque
  31. 31 Docker pour les devs - 30 - Registries et stratégie de tags
  32. 32 Docker pour les devs - 31 - Docker en CI/CD
  33. 33 Docker pour les devs - 32 - Au-dela de Compose
  34. 34 Docker pour les devs - 33 - Glossaire Docker de A a Z

29 - Nettoyer Docker avant qu'il mange ton disque

Ce que tu vas apprendre

  • Pourquoi Docker remplit ton disque silencieusement
  • Comment diagnostiquer avec docker system df
  • Les commandes prune pour tout nettoyer
  • Le build cache et comment le gerer
  • Automatiser le nettoyage avec un cron

Prerequisites

  • Utiliser Docker depuis un moment (sinon tu n'as rien a nettoyer)
  • Connaitre les volumes et les layers

"Disk full". Deux mots qui te reveillent a 3h du matin. J'ai reçu cette alerte un lundi. Le serveur de staging avait 100 Go de disque. Docker en occupait 74. Pas les donnees applicatives. Docker lui-meme. Des images de toutes les branches de feature qu'on avait testees depuis six mois, des conteneurs arretes jamais supprimes, un build cache de 20 Go.

Docker ne nettoie rien tout seul. Chaque docker build, chaque docker pull, chaque conteneur arrêté laisse des traces. Ca s'accumule.

Diagnostiquer avec docker system df

Avant de nettoyer, regarde ce qui prend de la place :

bashdocker system df
TYPE            TOTAL   ACTIVE  SIZE      RECLAIMABLE
Images          47      3       12.4GB    11.2GB (90%)
Containers      23      3       1.2GB     1.1GB (95%)
Local Volumes   15      3       8.7GB     6.3GB (72%)
Build Cache     89      0       4.5GB     4.5GB (100%)

La colonne RECLAIMABLE est ce que tu peux récupérer. Dans cet exemple, 23 Go sur 27. C'est typique d'une machine de dev apres quelques mois.

Pour le détail par image :

bashdocker system df -v

Les coupables habituels

Images dangling : des images sans tag. Elles apparaissent quand tu rebuilds une image avec le meme tag. L'ancienne perd son tag et devient <none>:<none>. Elle existe toujours sur le disque.

bashdocker images -f dangling=true

Conteneurs arretes : chaque docker run créé un conteneur. Quand il s'arrêté, il reste sur le disque. Ses logs aussi. Tu as probablement des dizaines de conteneurs arretes dont tu ignores l'existence.

bashdocker ps -a --filter status=exited

Volumes orphelins : un volume créé par un conteneur qui n'existe plus. Le volume survit a son conteneur. C'est voulu (pour ne pas perdre de donnees), mais ca s'accumule.

bashdocker volume ls -f dangling=true

Build cache : chaque layer intermediaire du build est mise en cache. Sur un projet actif avec des builds frequents, le cache grossit vite. C'est souvent le poste le plus lourd.

Nettoyer chirurgicalement

Supprimer les images dangling :

bashdocker image prune

Supprimer les conteneurs arretes :

bashdocker container prune

Supprimer les volumes orphelins :

bashdocker volume prune

Supprimer le build cache :

bashdocker builder prune

Chaque commande demande confirmation. Ajoute -f pour forcer.

Le nucleaire : docker system prune

bashdocker system prune

Ca supprime les conteneurs arretes, les réseaux non utilises et les images dangling. C'est deja pas mal.

Pour aller plus loin :

bashdocker system prune -a --volumes

Le flag -a supprime toutes les images non utilisees par un conteneur en cours d'exécution. Pas seulement les dangling. Le flag --volumes inclut les volumes orphelins.

Attention : cette commande est destructive. Si tu as des images que tu veux garder mais qui ne sont attachees a aucun conteneur actif, elles disparaissent. Sur mon poste de dev, je la lance sans hesiter. Sur un serveur de prod, jamais.

Gerer le build cache

Le build cache est souvent le plus gros consommateur. Pour voir son contenu :

bashdocker builder prune --verbose

Pour limiter le cache a une taille :

bashdocker builder prune --keep-storage=5GB

Ca supprime les entrees les plus anciennes pour rester sous 5 Go.

Tu peux aussi configurer BuildKit pour limiter le cache globalement. Dans /etc/docker/daemon.json :

json{
  "builder": {
    "gc": {
      "enabled": true,
      "defaultKeepStorage": "10GB"
    }
  }
}

Ca déclenché un garbage collection automatique quand le cache dépassé 10 Go. C'est la méthode que je recommande. Tu gardes les avantages du cache sans l'accumulation infinie.

Supprimer les vieilles images par date

Pour supprimer les images créées il y a plus de 30 jours :

bashdocker image prune -a --filter "until=720h"

720 heures = 30 jours. Cette commande est parfaite pour un cron. Sur paltemps.fr, je l'utilise sur le serveur de staging ou les images des branches de feature s'accumulent.

Automatiser avec cron

Cree un cron qui nettoie chaque semaine :

bashcrontab -e
# Nettoyage Docker tous les dimanches a 3h du matin
0 3 * * 0 docker system prune -f --filter "until=168h" >> /var/log/docker-cleanup.log 2>&1
0 3 * * 0 docker builder prune -f --keep-storage=5GB >> /var/log/docker-cleanup.log 2>&1

Le flag -f évité la confirmation interactive. Le filtre until=168h (7 jours) protégé les images recentes.

Pour les volumes, sois plus prudent. Un docker volume prune automatique peut supprimer des donnees. Je préféré le faire manuellement apres vérification.

Lifecycle policies pour les registries

Si tu utilises un registry prive, les images s'accumulent la-bas aussi. La plupart des registries supportent des lifecycle policies :

  • Docker Hub : pas de politique automatique sur le plan gratuit
  • GitHub Container Registry : suppression via l'API ou les Actions
  • AWS ECR : lifecycle policies natives (garder les N dernières images, supprimer apres X jours)

La stratégie que j'applique : garder les 10 derniers tags de chaque image, et les tags correspondant aux branches main/develop. Tout le reste est supprime apres 30 jours.

Résumé

  • Docker ne nettoie rien automatiquement : images, conteneurs, volumes et cache s'accumulent
  • docker system df montre ce qui prend de la place
  • docker system prune -a --volumes libéré le maximum d'espace (avec prudence)
  • Le build cache est souvent le plus gros consommateur : configure un garbage collection
  • Automatise le nettoyage avec un cron sur les serveurs de staging et CI

Precedent : 28 - Healthchecks | Suivant : 30 - Registries

Sources

Réservez un audit gratuit de 30 minutes. Je vous montre concrètement ce qu'on peut automatiser.