Pourquoi Docker consomme autant d'espace disque sur un VPS
Sur un serveur virtuel (VPS) Linux au stockage limité, Docker accumule silencieusement des fichiers inutiles dans /var/lib/docker : images obsolètes, conteneurs arrêtés, volumes orphelins, couches de build en cache, réseaux inutilisés. Chaque docker pull ou docker build empile des couches d'images sur le disque. Chaque conteneur arrêté conserve son système de fichiers en écriture, même s'il ne tourne plus. Après quelques semaines d'utilisation sur Ubuntu ou Debian, ces résidus peuvent occuper plusieurs gigaoctets sur la partition du serveur.
Le problème est d'autant plus critique sur un VPS : contrairement à un serveur dédié avec plusieurs téraoctets d'espace de stockage, un serveur virtuel dispose souvent de 20 à 80 Go de disque. Quand la partition / est pleine, Docker ne peut plus créer de conteneurs, les services tombent, les logs système cessent de s'écrire et les bases de données risquent de se corrompre. Contrairement à la RAM, qui se libère quand un processus s'arrête, l'espace disque occupé par Docker persiste : les fichiers temporaires de build, les images sans tag et les couches intermédiaires restent stockés sur le disque tant qu'un nettoyage explicite n'est pas lancé.
Ce tutoriel couvre le diagnostic de l'espace occupé par Docker, le nettoyage de disque avec docker system prune et ses options (--all, --volumes, --filter), le nettoyage ciblé par type d'objet, l'automatisation via des scripts cron ou systemd timer, et les précautions pour protéger vos données actives. Il s'adresse aux administrateurs de VPS Linux (Ubuntu, Debian) qui utilisent Docker pour héberger des services, serveurs de jeu ou applications web sur un serveur fourni par leur hébergeur.
Où Docker stocke ses fichiers sur le disque
Avant de vider les données inutilisées, il est utile de comprendre ce que Docker stocke sur le disque et dans quels répertoires. Sur un système Unix (Ubuntu, Debian ou toute autre distribution Linux), Docker place toutes ses données dans /var/lib/docker, avec les sous-répertoires suivants :
/var/lib/docker/overlay2: les couches d'images et les systèmes de fichiers des conteneurs. C'est le répertoire le plus volumineux, où sont stockées les couches en lecture (images) et en écriture (conteneurs actifs et arrêtés)./var/lib/docker/volumes: les volumes Docker, qui contiennent les données persistantes de vos services (bases de données, fichiers de configuration, sauvegardes)./var/lib/docker/image: les métadonnées des images (index, distribution, manifestes)./var/lib/docker/containers: les fichiers de configuration et les logs JSON de chaque conteneur. Les logs des conteneurs sans rotation de fichiers peuvent aussi saturer l'espace de stockage./var/lib/docker/buildkit: le cache de build utilisé par BuildKit lors de la construction d'images. Les fichiers temporaires de compilation s'y accumulent au fil des builds.
Pour mesurer la taille de chaque répertoire en ligne de commande, utilisez du :
sudo du -sh /var/lib/docker/overlay2
sudo du -sh /var/lib/docker/volumes
sudo du -sh /var/lib/docker/buildkit
Cette vue par répertoire complète les informations de docker system df et permet d'identifier précisément où l'espace de stockage est consommé sur votre serveur virtuel.
Diagnostiquer l'espace disque occupé par Docker
Avant de nettoyer, mesurez l'espace occupé. La commande docker system df est l'utilitaire de diagnostic principal : elle affiche la consommation disque par type d'objet Docker :
docker system df
La sortie affiche quatre catégories : Images (couches téléchargées ou construites), Containers (système de fichiers en écriture des conteneurs arrêtés et actifs), Local Volumes (données persistantes stockées dans les volumes) et Build Cache (couches de compilation cachées). La colonne RECLAIMABLE indique l'espace récupérable par un nettoyage de disque.
Pour un détail par objet, ajoutez l'option -v (verbose) :
docker system df -v
Cette vue détaillée liste chaque image avec sa taille, le nombre de conteneurs qui l'utilisent, et l'espace partagé entre couches. Elle permet d'identifier les images les plus volumineuses et celles qui ne sont référencées par aucun conteneur.
Pour vérifier l'espace libre restant sur la partition du VPS, utilisez df -h en SSH. Si le répertoire /var/lib/docker est sur la partition racine, c'est le pourcentage d'utilisation de / qui compte. L'utilitaire ncdu offre une vue interactive de la consommation disque par répertoire (installez-le avec sudo apt install ncdu sur Ubuntu ou Debian) :
sudo ncdu /var/lib/docker
Pour un suivi continu de l'espace libre sur votre serveur virtuel, consultez notre guide surveiller l'espace disque d'un VPS Linux.
docker system prune : le nettoyage global
La commande docker system prune est l'utilitaire de nettoyage principal de Docker. Elle supprime en une seule opération tous les objets inutilisés du disque. Par défaut, elle retire :
- Tous les conteneurs arrêtés (stopped) ;
- Tous les réseaux non utilisés par au moins un conteneur ;
- Toutes les images dangling (images sans tag et sans conteneur associé) ;
- Tout le cache de build inutilisé.
docker system prune
Docker affiche un avertissement et demande confirmation avant de supprimer. La sortie indique l'espace total récupéré en octets.
Pour supprimer sans demander confirmation (utile dans un script automatisé) :
docker system prune -f
Option --all : supprimer toutes les images inutilisées
Par défaut, docker system prune ne supprime que les images dangling (sans tag). L'option --all (-a) va plus loin : elle supprime toutes les images non utilisées par au moins un conteneur en cours d'exécution, y compris les images taguées :
docker system prune -a
C'est la commande la plus efficace pour récupérer de l'espace disque sur un serveur virtuel. Les images supprimées seront retéléchargées automatiquement lors du prochain docker pull ou docker compose up. La combinaison docker system prune -af est la plus courante dans les scripts de nettoyage automatisé.
Option --volumes : inclure les volumes anonymes
Par défaut, docker system prune ne touche pas aux volumes. Cette protection existe pour éviter la perte de données : les volumes contiennent souvent des bases de données, des fichiers de configuration ou des copies de sauvegarde. Pour inclure les volumes anonymes (non nommés) inutilisés dans le nettoyage :
docker system prune --volumes
Les volumes nommés (ceux déclarés dans un fichier compose.yaml avec un nom explicite) ne sont pas supprimés par cette commande. Seuls les volumes anonymes, créés implicitement par Docker et non rattachés à un conteneur actif, sont ciblés.
Attention : vérifiez toujours avec docker volume ls avant d'utiliser --volumes. Un volume qui semble orphelin peut contenir les données d'un conteneur temporairement arrêté.
Nettoyage ciblé par type d'objet
Si vous préférez contrôler précisément ce que vous supprimez, Docker fournit une commande prune dédiée pour chaque type d'objet. Cette approche ciblée est plus prudente qu'un docker system prune global : vous pouvez vider les fichiers inutiles d'une catégorie sans toucher aux autres.
Conteneurs arrêtés
docker container prune
Supprime tous les conteneurs à l'état exited ou dead. Les conteneurs en cours d'exécution ou en pause ne sont pas touchés. Un conteneur temporairement arrêté pour maintenance sera supprimé : vérifiez la liste avec docker ps -a avant de vider les conteneurs arrêtés.
Images inutilisées
docker image prune
Supprime les images dangling (sans tag). Ajoutez -a pour inclure toutes les images non référencées par un conteneur :
docker image prune -a
Volumes orphelins
docker volume prune
Supprime les volumes anonymes non rattachés à un conteneur. Pour inclure aussi les volumes nommés inutilisés, ajoutez -a :
docker volume prune -a
Cette commande est la plus risquée. Un volume nommé peut contenir la base de données d'un service temporairement arrêté (MariaDB, PostgreSQL, Redis). Listez d'abord vos volumes avec docker volume ls et inspectez les suspects avec docker volume inspect nom_du_volume avant de les supprimer.
Réseaux inutilisés
docker network prune
Supprime les réseaux non utilisés par un conteneur. Les réseaux par défaut (bridge, host, none) ne sont jamais supprimés. Les réseaux personnalisés créés par Docker Compose sont ciblés s'ils ne sont rattachés à aucun conteneur actif.
Cache de build
docker buildx prune
Supprime le cache de construction accumulé par les builds Docker. Sur un VPS où vous construisez des images régulièrement, les fichiers temporaires de compilation et les couches intermédiaires cachées dans ce cache peuvent occuper plusieurs gigaoctets d'espace de stockage. Ajoutez -a pour vider aussi les images internes du builder.
Filtrer le nettoyage avec --filter
L'option --filter permet de configurer précisément les objets à supprimer lors du nettoyage de disque. Deux filtres sont disponibles : until (basé sur l'âge) et label (basé sur les métadonnées).
Filtre until : supprimer les objets anciens
Le filtre until ne supprime que les objets créés avant une date ou une durée donnée. Il accepte les durées Go (24h, 168h, 720h) et les timestamps RFC 3339 :
docker system prune -a --filter "until=168h"
Cette commande supprime les conteneurs arrêtés, images inutilisées, réseaux et cache de build datant de plus de 7 jours (168 heures). Les objets récents sont conservés, ce qui laisse une fenêtre de rollback. C'est le filtre le plus adapté pour un script de nettoyage automatisé régulier.
docker image prune -a --filter "until=720h"
Supprime les images inutilisées de plus de 30 jours, en gardant les images récentes disponibles pour un éventuel rollback.
Filtre label : protéger ou cibler par étiquette
Le filtre label cible les objets Docker portant (ou ne portant pas) une étiquette spécifique. Il permet de protéger certains objets du nettoyage :
docker system prune -a --filter "label!=keep"
Supprime tout sauf les objets portant le label keep. Pour étiqueter un conteneur ou un volume à protéger, configurez un label dans votre fichier compose.yaml :
services:
db:
image: mariadb:11
labels:
- "keep"
volumes:
- db-data:/var/lib/mysql
volumes:
db-data:
labels:
keep: ""
Quand plusieurs filtres sont spécifiés avec des clés différentes, ils se combinent en ET logique : un objet doit satisfaire toutes les conditions pour être supprimé.
Images dangling et images unused : quelle différence
Docker distingue deux catégories d'images récupérables :
| Type | Description | Commande de suppression |
|---|---|---|
| Dangling | Image sans tag (souvent des couches intermédiaires de build ou d'anciennes versions remplacées par un nouveau pull) | docker image prune |
| Unused | Image avec ou sans tag, non référencée par aucun conteneur (ni actif, ni arrêté) | docker image prune -a |
Les images dangling apparaissent avec <none> comme nom et tag dans docker images. Elles s'accumulent à chaque reconstruction d'une image existante : l'ancienne version perd son tag au profit de la nouvelle. Sur un VPS qui héberge des services reconstruits régulièrement via Docker Compose, ces images dangling consomment rapidement plusieurs gigaoctets d'espace de stockage.
Automatiser le nettoyage avec cron ou systemd timer
Sur un VPS en production, le nettoyage manuel est vite oublié. Deux méthodes permettent d'automatiser docker system prune sur un système Unix : une tâche cron classique ou un timer systemd. Dans les deux cas, un script de nettoyage tourne en arrière-plan et libère l'espace de stockage sans intervention.
Méthode 1 : tâche cron
Ajoutez une ligne dans le crontab de root pour exécuter le nettoyage chaque dimanche à 4 h du matin. Ouvrez le crontab pour configurer la planification :
sudo crontab -e
Ajoutez la ligne suivante :
0 4 * * 0 /usr/bin/docker system prune -af --filter "until=168h" >> /var/log/docker-prune.log 2>&1
Cette commande supprime les images, conteneurs, réseaux et cache de build inutilisés de plus de 7 jours, sans demander confirmation (-f), et écrit le résultat dans un fichier de log. Le flag -a inclut les images taguées non utilisées. Les volumes ne sont pas touchés (pas de --volumes), ce qui protège vos données persistantes et vos sauvegardes.
Pour un guide complet sur la planification de tâches, consultez notre guide planifier des tâches automatiques sur un VPS Linux avec cron et systemd timers.
Méthode 2 : timer systemd
Créez un service systemd qui exécute le nettoyage. Cette méthode est recommandée sur les distributions modernes (Ubuntu 22.04+, Debian 12+) :
sudo nano /etc/systemd/system/docker-prune.service
[Unit]
Description=Nettoyage Docker - suppression des objets inutilises
[Service]
Type=oneshot
ExecStart=/usr/bin/docker system prune -af --filter "until=168h"
Créez le timer associé pour configurer la planification hebdomadaire :
sudo nano /etc/systemd/system/docker-prune.timer
[Unit]
Description=Timer hebdomadaire pour le nettoyage Docker
[Timer]
OnCalendar=Sun *-*-* 04:00:00
Persistent=true
[Install]
WantedBy=timers.target
Activez et démarrez le timer :
sudo systemctl daemon-reload
sudo systemctl enable --now docker-prune.timer
Vérifiez que le timer est bien programmé :
sudo systemctl list-timers docker-prune.timer
L'avantage du timer systemd sur cron : la directive Persistent=true rattrape les exécutions manquées si le VPS était éteint au moment prévu. Cron ne le fait pas. Pour aller plus loin dans la gestion des journaux systemd et limiter leur empreinte sur l'espace de stockage, consultez notre guide gérer la taille des journaux systemd.
Script de nettoyage complet
Pour un nettoyage plus fin, créez un script shell qui combine diagnostic et suppression. Ce script vérifie l'espace libre avant et après le nettoyage et conserve un historique dans un fichier de log :
#!/bin/bash
# Script de nettoyage Docker hebdomadaire
# Enregistre l'espace libre avant et apres dans le log
LOG="/var/log/docker-prune.log"
echo "=== Nettoyage Docker $(date) ===" >> "$LOG"
echo "Espace libre avant :" >> "$LOG"
df -h / >> "$LOG"
echo "Espace Docker avant :" >> "$LOG"
docker system df >> "$LOG"
# Nettoyage des objets de plus de 7 jours
docker system prune -af --filter "until=168h" >> "$LOG" 2>&1
echo "Espace libre apres :" >> "$LOG"
df -h / >> "$LOG"
echo "" >> "$LOG"
Enregistrez ce script dans /usr/local/bin/docker-prune.sh, rendez-le exécutable avec chmod +x, puis référencez-le dans votre crontab ou votre service systemd à la place de la commande directe.
Précautions : ne pas supprimer de données actives
Les commandes prune ne suppriment jamais les conteneurs en cours d'exécution ni les images qu'ils utilisent. Le risque principal concerne les volumes et les conteneurs temporairement arrêtés.
Avant tout nettoyage, suivez cette checklist :
- Listez les conteneurs arrêtés avec
docker ps -a --filter "status=exited". Un conteneur arrêté peut être un service en maintenance que vous prévoyez de redémarrer. - Listez les volumes avec
docker volume ls. Identifiez ceux qui portent un nom explicite (ex.mariadb_data,vaultwarden_data) : ce sont les données stockées par vos services actifs. - Ne combinez jamais
--allet--volumessans avoir vérifié les deux listes précédentes. La commandedocker system prune -a --volumesest la plus agressive : elle supprime tout objet Docker non rattaché à un conteneur actif. - Faites une sauvegarde avant un nettoyage massif. Un backup rsync vers un serveur distant du répertoire
/var/lib/docker/volumescrée des copies de vos données en cas d'erreur. Sur un VPS fourni par un hébergeur, vous pouvez aussi créer un snapshot du serveur virtuel avant d'intervenir. - Utilisez le filtre
untildans vos automatisations plutôt qu'unprune -abrut. Garder les images de moins de 7 jours permet de redémarrer un service ou de faire un rollback sans retélécharger les images depuis le registre. - Surveillez les logs des conteneurs : les fichiers de log JSON stockés dans
/var/lib/docker/containerspeuvent aussi saturer l'espace disque. Configurez la rotation des logs Docker dans/etc/docker/daemon.jsonpour limiter leur taille.
Configurer la rotation des logs Docker
Les logs des conteneurs sont des fichiers temporaires stockés par Docker dans les répertoires de chaque conteneur. Sans limite configurée, un conteneur actif peut générer des gigaoctets de logs. Pour configurer une limite globale, créez ou modifiez le fichier /etc/docker/daemon.json :
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
Redémarrez Docker pour appliquer la configuration :
sudo systemctl restart docker
Cette configuration limite chaque conteneur à 3 fichiers de log de 10 Mo maximum (30 Mo par conteneur). Les conteneurs existants ne sont pas affectés : la limite s'applique aux conteneurs créés après la modification. Pour désactiver cette limite sur un conteneur spécifique, ajoutez logging.options dans son fichier compose.yaml.
Tableau récapitulatif des commandes docker prune
| Commande | Ce qu'elle supprime | Volumes touchés |
|---|---|---|
docker system prune | Conteneurs arrêtés, réseaux inutilisés, images dangling, cache de build | Non |
docker system prune -a | Idem + toutes les images non utilisées (taguées ou non) | Non |
docker system prune --volumes | Idem que prune + volumes anonymes inutilisés | Anonymes uniquement |
docker system prune -a --volumes | Tout : images, conteneurs, réseaux, cache, volumes anonymes | Anonymes uniquement |
docker container prune | Conteneurs arrêtés uniquement | Non |
docker image prune | Images dangling uniquement | Non |
docker image prune -a | Toutes les images non utilisées | Non |
docker volume prune | Volumes anonymes non rattachés | Anonymes uniquement |
docker volume prune -a | Tous les volumes non rattachés (anonymes et nommés) | Tous les inutilisés |
docker network prune | Réseaux inutilisés (sauf bridge, host, none) | Non |
docker buildx prune | Cache de build du builder actif | Non |
Exemple complet : nettoyer un VPS Docker saturé
Voici la séquence complète pour reprendre le contrôle d'un serveur virtuel dont le disque est saturé par Docker. Ces commandes fonctionnent sur Ubuntu, Debian et les autres distributions Linux courantes :
# 1. Verifier l'espace libre restant sur le disque
df -h /
# 2. Mesurer ce que Docker occupe
docker system df
# 3. Lister les conteneurs arretes
docker ps -a --filter "status=exited" --format "table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Size}}"
# 4. Lister les volumes et identifier ceux a conserver
docker volume ls
# 5. Nettoyer les objets inutilises (sans toucher aux volumes)
docker system prune -af --filter "until=168h"
# 6. Verifier l'espace recupere
docker system df
df -h /
Si l'espace récupéré est insuffisant, identifiez les images les plus volumineuses encore présentes :
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}" | sort -k3 -h -r | head -20
Supprimez manuellement les images inutiles identifiées :
docker rmi nom_image:tag
Si Docker est déjà installé sur votre VPS et que vous avez besoin de gérer vos conteneurs via une interface graphique, consultez notre guide Portainer, Dockge et Cosmos pour gérer Docker sur un VPS Linux. Pour l'installation initiale de Docker, suivez notre guide installer Docker sur un VPS. Et si votre serveur virtuel présente des problèmes de performances au-delà du stockage, consultez notre guide optimiser les performances d'un VPS Linux.
Conclusion
Les commandes docker system prune, docker image prune et docker volume prune sont les utilitaires de base pour récupérer l'espace disque consommé par Docker sur un VPS Linux. Le réflexe essentiel : automatiser un nettoyage hebdomadaire avec le filtre until via un script cron ou un timer systemd, configurer la rotation des logs, et ne jamais inclure --volumes sans avoir vérifié la liste des volumes actifs. Pensez aussi à faire une sauvegarde de vos volumes avant tout nettoyage agressif. Sur un serveur virtuel au stockage limité, quelques gigaoctets récupérés chaque semaine font la différence entre un serveur stable et un service en panne.
FiveM
Minecraft
Rust
RedM
Hytale