Libérer de l'espace disque en nettoyant les images Docker
Contexte
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.
Qu'est-ce qu'une image Docker « dangling » ?
Avant de plonger dans le diagnostic, il est important de comprendre la terminologie :
- Image dangling (pendante) : une image qui n'est plus taguée, c'est-à-dire dont le tag apparaît comme
<none>. Cela arrive typiquement quand on rebuild une image avec le même tag — l'ancienne version perd son tag et devient dangling. - Image unused (inutilisée) : une image qui n'est référencée par aucun container (ni running, ni stopped). Une image dangling est toujours unused, mais une image unused n'est pas forcément dangling.
Diagnostic pas à pas
1. Analyse de l'espace disque global
df -h
Résultat : le disque principal est à 99% d'utilisation sur 155 Go.
2. Identification du dossier le plus volumineux
sudo du -h --max-depth=1 / | sort -hr | head -n 20
Résultat : /var pèse 137 Go, bien plus que les autres dossiers.
3. Investigation dans /var
sudo du -h --max-depth=1 /var | sort -hr
Résultat : /var/lib occupe 136 Go.
4. Exploration de /var/lib
sudo du -h --max-depth=1 /var/lib | sort -hr
Résultat : /var/lib/docker utilise 135 Go. Le coupable est identifié.
5. Vérification des containers actifs
docker ps -a
Plusieurs containers en production, tous actifs — on ne peut pas simplement tout supprimer.
6. Lister les images Docker
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>).
Résolution
Nettoyer les images dangling par service
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).
Alternative : nettoyage global
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.
Résultat
- Dizaines de Go libérés sur la partition racine
- Disque redevenu stable et disponible pour les opérations courantes
- Meilleure visibilité sur les images Docker présentes sur le serveur
Bonnes pratiques pour éviter la récurrence
- Mettre en place un cron job de nettoyage périodique :
docker image prune -f - Utiliser des tags explicites plutôt que
latestpour mieux identifier les versions - Intégrer le nettoyage dans les pipelines CI/CD après chaque déploiement
- Monitorer l'espace disque avec des alertes (par exemple via le monitoring du provider VPS)