Tu déploies, tu rebuildes, tu testes des choses. Et un jour, tu regardes ton serveur et t’as plus que 2 Go de libre. Félicitations, Docker a tout mangé.
Ton disque dur Docker te déteste. Et c’est de ta faute.
C’est quoi le problème exactement ?
Docker accumule des images au fil du temps. À chaque docker build,
si quelque chose change, il crée de nouvelles couches et garde les anciennes.
Ces vieilles couches sans tag, sans nom, sans utilité, on les appelle des images dangling.
Elles ne servent à rien. Elles prennent de la place. Et Docker ne les supprime pas tout seul.
Voir où t’en es
Avant de supprimer quoi que ce soit, une seule chose à faire :
docker system df
Ça t’affiche en quelques lignes combien d’espace est utilisé, et surtout combien est récupérable. C’est le point de départ.
Tu veux voir les images précisément ?
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.ID}}\t{{.Size}}"
Supprimer les images dangling
Les images dangling, ce sont les couches intermédiaires qui traînent. Elles n’ont ni tag ni nom. Pour les supprimer :
docker image prune
Docker te demande confirmation, t’affiche ce qu’il va supprimer, tu valides. Propre, rapide, sans risque.
Aller plus loin
Si t’as des images entières qui ne sont plus utilisées par aucun conteneur (même arrêté), tu peux les virer aussi :
docker image prune -a
Le -a change tout : là, il ne cible plus juste les dangling, mais toutes les images non référencées. C’est ce que tu veux dans la majorité des cas sur un serveur de prod ou de staging.
Tu peux filtrer par âge si tu veux garder les images récentes :
docker image prune -a --filter "until=720h"
Ça supprime uniquement ce qui a plus de 30 jours. Pratique si t’as des déploiements réguliers.
Tout remettre à zéro
Si tu veux tout remettre à zéro : images, conteneurs arrêtés, volumes orphelins, réseaux inutilisés :
docker system prune -a --volumes
Je le déconseille sur un serveur en prod sans vérifier avant ce qui tourne. Mais sur une machine de dev ou un VPS que tu rebuildes régulièrement, c’est parfait.
Automatiser tout ça
Plutôt que d’y penser manuellement, tu peux ajouter une cron job hebdomadaire :
# crontab -e
0 3 * * 0 docker image prune -a -f >> /var/log/docker-prune.log 2>&1
Tous les dimanches à 3h du matin, ça nettoie sans te demander confirmation (-f), et ça log le résultat.
Conclusion
| Commande | Ce que ça fait |
|---|---|
docker system df | Voir l’espace utilisé |
docker image prune | Supprimer les dangling |
docker image prune -a | Supprimer tout ce qui n’est plus utilisé |
docker image prune -a --filter "until=720h" | Idem, mais seulement les vieilles images |
docker system prune -a --volumes | Tout remettre à zéro |
Commence par docker system df. Dans 90% des cas, un docker image prune -a suffit à récupérer plusieurs gigaoctets sans rien casser.