Articles · 03
Diagnostic et résolution d'un problème de saturation disque causé par des images Docker dangling sur un VPS de production.
Sur un VPS de production hébergeant plusieurs services Docker, le disque principal s'est retrouvé saturé à 99% d'utilisation, causant des erreurs et des ralentissements sur l'ensemble des services.
Cet article retrace le diagnostic complet et la résolution du problème.
Avant de plonger dans le diagnostic, il est important de comprendre la terminologie :
<none>. Cela arrive typiquement quand on rebuild une image avec le même tag — l'ancienne version perd son tag et devient dangling.df -h
Résultat : le disque principal est à 99% d'utilisation sur 155 Go.
sudo du -h --max-depth=1 / | sort -hr | head -n 20
Résultat : /var pèse 137 Go, bien plus que les autres dossiers.
/varsudo du -h --max-depth=1 /var | sort -hr
Résultat : /var/lib occupe 136 Go.
/var/libsudo du -h --max-depth=1 /var/lib | sort -hr
Résultat : /var/lib/docker utilise 135 Go. Le coupable est identifié.
docker ps -a
Plusieurs containers en production, tous actifs — on ne peut pas simplement tout supprimer.
Différentes commandes utiles pour analyser les images :
# Lister toutes les images
docker images
# Lister les images par nom/tag
docker images <nom_image>
# Lister uniquement les images dangling
docker images --filter "dangling=true"
# Lister les images dangling d'un service spécifique
docker images nginx --filter "dangling=true"
Résultat : de nombreuses images anciennes, obsolètes et dangling (tag <none>).
Pour chaque service, on supprime les images dangling :
# Exemple pour un service de cache
docker rmi $(docker images redis -f "dangling=true" -q)
# Exemple pour un service web (nginx)
docker rmi $(docker images nginx -f "dangling=true" -q)
# Exemple pour un service applicatif (PHP)
docker rmi $(docker images php -f "dangling=true" -q)
Cette commande supprime uniquement les images dangling du service ciblé. Les images utilisées par des containers existants (même arrêtés) ne seront pas supprimées.
On répète l'opération pour chaque service (PHP, Nginx, Redis, MySQL, etc.), en distinguant les variantes si nécessaire (par exemple php et php_prod).
Docker propose aussi une commande de nettoyage global des images dangling :
docker image prune
Pour supprimer également les images non utilisées par aucun container :
docker image prune -a
Attention : prune -a supprime toutes les images non utilisées, pas seulement les dangling. À utiliser avec précaution sur un serveur de production.
docker image prune -flatest pour mieux identifier les versions