Docker est devenu incontournable dans les environnements de développement et de production sous Linux. Son modèle de couches superposées pour les images, sa gestion des volumes persistants et son cache de compilation sont des atouts indéniables — mais ils ont un coût : l’espace disque s’accumule silencieusement jusqu’au jour où le serveur refuse de démarrer un nouveau conteneur avec l’erreur redoutée no space left on device.
Sur une machine active, Docker peut facilement consommer plusieurs dizaines de gigaoctets : images obsolètes accumulées au fil des builds, conteneurs arrêtés mais jamais supprimés, volumes orphelins, et cache de compilation qui grossit après chaque docker build. Sans hygiène régulière, la situation dégénère rapidement.
Dans cet article, nous allons passer en revue toutes les méthodes disponibles pour diagnostiquer et récupérer l’espace disque consommé par Docker sur Debian et Ubuntu — des commandes de base aux stratégies d’automatisation avancées.
Diagnostiquer l’utilisation disque de Docker
Avant de supprimer quoi que ce soit, commencez par mesurer précisément ce que Docker consomme. La commande dédiée est docker system df :
docker system df
La sortie ressemble à ceci :
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 24 3 8.234GB 6.891GB (83%)
Containers 7 2 142MB 98MB (68%)
Local Volumes 12 4 3.1GB 1.8GB (58%)
Build Cache 156 0 4.2GB 4.2GB
La colonne RECLAIMABLE est la plus importante : elle indique exactement combien d’espace vous pouvez récupérer sans affecter les conteneurs actifs. Pour un rapport détaillé avec la liste de chaque objet et sa taille individuelle :
docker system df -v
Identifier les images encombrantes
Les dangling images (images orphelines) sont des couches sans tag et sans référence — elles apparaissent sous le nom <none> dans la liste des images. Elles sont généralement le résidu de builds successifs :
# Lister les images orphelines
docker images -f dangling=true
# Lister toutes les images avec leur taille
docker images --format "table {{.Repository}}t{{.Tag}}t{{.Size}}t{{.CreatedAt}}"
Nettoyage ciblé par type de ressource
Supprimer les conteneurs arrêtés
Les conteneurs arrêtés conservent leur couche d’écriture sur le disque. Sur une machine de CI/CD ou de développement, ils peuvent représenter plusieurs centaines de mégaoctets :
# Lister les conteneurs arrêtés
docker ps -a --filter status=exited
# Supprimer tous les conteneurs arrêtés
docker container prune -f
# Alternative : supprimer un conteneur spécifique
docker rm <container_id>
Nettoyer les images inutilisées
# Supprimer uniquement les images orphelines (dangling)
docker image prune -f
# Supprimer toutes les images non attachées à un conteneur actif
docker image prune -a -f
# Supprimer les images créées il y a plus de 72 heures
docker image prune -a --filter "until=72h" -f
L’option -a (--all) est plus agressive : elle supprime également les images taguées qui ne sont référencées par aucun conteneur en cours d’exécution. À utiliser avec précaution en production.
Supprimer les volumes inutilisés
Les volumes sont le point sensible du nettoyage Docker : ils peuvent contenir des données de bases de données, des fichiers de configuration ou des sauvegardes. Docker ne les supprime jamais automatiquement pour éviter toute perte accidentelle.
# Lister tous les volumes
docker volume ls
# Lister les volumes non référencés par un conteneur
docker volume ls -f dangling=true
# Supprimer les volumes inutilisés (ATTENTION : perte de données irréversible)
docker volume prune -f
# Docker 25.0+ : supprimer aussi les volumes nommés inutilisés
docker volume prune -a -f
Vérifiez toujours la liste des volumes avant de les supprimer. Un volume nommé mysql_data ou postgres_data contient vraisemblablement des données importantes.
Purger les réseaux inutilisés
Les réseaux Docker personnalisés consomment peu d’espace, mais ils peuvent entraîner des conflits d’adresses IP si ils s’accumulent :
docker network prune -f
Vider le cache de compilation (build cache)
Le cache de build est souvent le plus gros consommateur d’espace, notamment sur les machines de CI/CD où chaque pipeline ajoute des couches. Il peut facilement atteindre 10 à 20 Go sur une machine active :
# Supprimer le cache de build inutilisé
docker builder prune -f
# Vider intégralement le cache (ralentit les builds suivants)
docker builder prune -a -f
# Conserver uniquement les 5 derniers Go de cache récent
docker builder prune --keep-storage 5g -f
# Supprimer uniquement le cache de plus de 48 heures
docker builder prune --filter "until=48h" -f
Nettoyage global avec docker system prune
La commande docker system prune regroupe en une seule opération le nettoyage des conteneurs arrêtés, des images orphelines, des réseaux inutilisés et du cache de build :
# Nettoyage standard (sans les volumes ni les images taguées)
docker system prune -f
# Nettoyage complet incluant toutes les images inutilisées
docker system prune -a -f
# Nettoyage complet incluant les volumes (DESTRUCTIF)
docker system prune -a --volumes -f
Par défaut, docker system prune ne touche pas aux volumes pour éviter toute perte de données. L’option --volumes doit être utilisée explicitement et avec une grande prudence.
Gérer les logs des conteneurs
Les logs des conteneurs sont stockés dans /var/lib/docker/containers/ et peuvent grossir indéfiniment si aucune limite n’est configurée. Pour vérifier la taille des logs d’un conteneur spécifique :
# Trouver les fichiers de logs volumineux
find /var/lib/docker/containers/ -name "*.log" -exec ls -lh {} ; | sort -k5 -rh | head -20
Pour limiter la taille des logs à la création du conteneur :
docker run --log-opt max-size=10m --log-opt max-file=3 mon_image
Pour configurer cette limite globalement dans /etc/docker/daemon.json :
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
Après modification, rechargez le démon Docker :
sudo systemctl reload docker
Utiliser des filtres temporels pour un nettoyage sélectif
Le drapeau --filter until= permet de ne supprimer que les ressources créées avant une certaine durée, ce qui est idéal pour préserver les ressources récentes :
# Supprimer les images inutilisées de plus d'une semaine
docker image prune -a --filter "until=168h" -f
# Supprimer les conteneurs arrêtés depuis plus de 24 heures
docker container prune --filter "until=24h" -f
# Conserver les ressources labellisées "keep"
docker image prune -a --filter "label!=keep" -f
Automatiser le nettoyage avec cron
Sur un serveur de production, une tâche cron hebdomadaire permet d’éviter l’accumulation progressive. Ajoutez cette entrée dans /etc/cron.d/docker-cleanup :
# Nettoyage Docker tous les dimanches à 3h du matin
0 3 * * 0 root /usr/bin/docker system prune -f --filter "until=168h" >> /var/log/docker-cleanup.log 2>&1
Pour un environnement de CI/CD, intégrez le nettoyage après chaque pipeline :
# Dans votre script de post-build
docker system prune -f
docker builder prune --filter "until=24h" -f
Optimiser les Dockerfiles pour réduire la taille des images
La meilleure façon de récupérer de l’espace disque est de ne pas le consommer inutilement. Quelques bonnes pratiques à intégrer dès la rédaction des Dockerfiles :
# Mauvaise pratique : couches multiples
RUN apt-get update
RUN apt-get install -y curl wget
RUN apt-get clean
# Bonne pratique : une seule couche, nettoyage inclus
RUN apt-get update && apt-get install -y
curl
wget
&& apt-get clean
&& rm -rf /var/lib/apt/lists/*
Les builds multi-étapes permettent de ne conserver dans l’image finale que les binaires nécessaires, en éliminant les outils de compilation :
FROM golang:1.22 AS builder
WORKDIR /app
COPY . .
RUN go build -o monapp .
FROM debian:bookworm-slim
COPY --from=builder /app/monapp /usr/local/bin/monapp
CMD ["monapp"]
Récapitulatif des commandes essentielles
Voici une synthèse ordonnée des commandes à utiliser lors d’une session de nettoyage :
# 1. Diagnostic
docker system df
docker system df -v
# 2. Nettoyage des conteneurs arrêtés
docker container prune -f
# 3. Nettoyage des images orphelines
docker image prune -f
# 4. Nettoyage du cache de build
docker builder prune --filter "until=48h" -f
# 5. Vérifier les volumes avant de les supprimer
docker volume ls -f dangling=true
docker volume prune -f
# 6. Nettoyage global (sans volumes)
docker system prune -a -f
À lire également
- Docker sur Debian/Ubuntu : Installation, Configuration et Utilisation
- Podman : alternative rootless à Docker — installation et migration
- LXD 6.x : orchestration de conteneurs Linux avec profils et clustering
- Btrfs sur Linux — snapshots, sous-volumes et compression en pratique