Offre Durée limitée : -10% sur tout le site* avec le code WELCOME10

Nettoyer Docker sur un VPS Linux : récupérer l'espace disque avec docker prune

Mis à jour le 24 octobre 2026 15 min de lecture 12 sections

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 :

TypeDescriptionCommande de suppression
DanglingImage sans tag (souvent des couches intermédiaires de build ou d'anciennes versions remplacées par un nouveau pull)docker image prune
UnusedImage 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 --all et --volumes sans avoir vérifié les deux listes précédentes. La commande docker system prune -a --volumes est 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/volumes cré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 until dans vos automatisations plutôt qu'un prune -a brut. 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/containers peuvent aussi saturer l'espace disque. Configurez la rotation des logs Docker dans /etc/docker/daemon.json pour 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

CommandeCe qu'elle supprimeVolumes touchés
docker system pruneConteneurs arrêtés, réseaux inutilisés, images dangling, cache de buildNon
docker system prune -aIdem + toutes les images non utilisées (taguées ou non)Non
docker system prune --volumesIdem que prune + volumes anonymes inutilisésAnonymes uniquement
docker system prune -a --volumesTout : images, conteneurs, réseaux, cache, volumes anonymesAnonymes uniquement
docker container pruneConteneurs arrêtés uniquementNon
docker image pruneImages dangling uniquementNon
docker image prune -aToutes les images non utiliséesNon
docker volume pruneVolumes anonymes non rattachésAnonymes uniquement
docker volume prune -aTous les volumes non rattachés (anonymes et nommés)Tous les inutilisés
docker network pruneRéseaux inutilisés (sauf bridge, host, none)Non
docker buildx pruneCache de build du builder actifNon

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.

FAQ

docker system prune supprime-t-il les volumes de données ?

Non. Par défaut, docker system prune ne touche pas aux volumes. Il supprime les conteneurs arrêtés, les réseaux inutilisés, les images dangling et le cache de build. Pour inclure les volumes anonymes (non nommés) dans le nettoyage, ajoutez l'option --volumes. Les volumes nommés (ceux déclarés dans un fichier compose.yaml) ne sont supprimés que par docker volume prune -a.

Quelle est la différence entre images dangling et images unused ?

Une image dangling est une image sans tag, souvent créée lors d'un rebuild ou d'un pull qui remplace une version existante. Elle apparait avec le nom et le tag none dans docker images. Une image unused est une image (taguée ou non) qui n'est référencée par aucun conteneur, ni actif ni arrêté. docker image prune supprime les dangling, docker image prune -a supprime toutes les unused.

docker prune supprime-t-il les conteneurs en cours d'exécution ?

Non. Les commandes prune ne suppriment jamais les conteneurs en cours d'exécution ni les images, réseaux ou volumes qu'ils utilisent. Seuls les objets Docker non rattachés à un conteneur actif sont ciblés. Un conteneur à l'état exited ou dead est considéré comme arrêté et sera supprimé par docker container prune ou docker system prune.

Comment automatiser le nettoyage Docker sur un VPS ?

Ajoutez une tâche cron ou créez un timer systemd qui exécute docker system prune -af --filter until=168h chaque semaine. Le flag -f évite la demande de confirmation interactive. Le filtre until=168h ne supprime que les objets de plus de 7 jours, ce qui laisse une fenêtre de rollback. Un timer systemd avec Persistent=true rattrape les exécutions manquées si le VPS était éteint.

Comment protéger certains volumes ou images du nettoyage ?

Utilisez le filtre label : ajoutez un label (par exemple keep) à vos conteneurs, images ou volumes dans le fichier compose.yaml, puis lancez docker system prune avec --filter label!=keep. Seuls les objets sans ce label seront supprimés. C'est la méthode la plus fiable pour protéger les données de production lors d'un nettoyage automatisé.

Combien d'espace disque peut-on récupérer avec docker prune ?

Cela dépend de l'usage. Un VPS qui héberge plusieurs services Docker depuis quelques mois accumule facilement 5 à 15 Go d'images inutilisées, de couches de build en cache et de conteneurs arrêtés. La commande docker system df affiche l'espace total occupé par Docker et la part récupérable avant de lancer le nettoyage.

Faut-il arrêter les conteneurs avant de lancer docker prune ?

Non. docker system prune et les commandes prune ciblées ne touchent pas aux conteneurs en cours d'exécution ni aux objets qu'ils utilisent. Le nettoyage peut s'exécuter pendant que vos services tournent. En revanche, si vous prévoyez d'utiliser docker volume prune -a, arrêtez d'abord les conteneurs dont vous voulez conserver les volumes pour qu'ils ne soient pas considérés comme orphelins.

docker prune fonctionne-t-il de la même manière sur Ubuntu et Debian ?

Oui. Les commandes docker prune sont identiques sur toutes les distributions Linux et Unix (Ubuntu, Debian, CentOS, etc.) car elles font partie du client Docker, indépendant du système d'exploitation. La seule différence concerne l'installation de Docker elle-même (dépôt APT différent entre Ubuntu et Debian), mais une fois Docker installé, toutes les commandes de nettoyage de disque sont identiques.

Comment vérifier l'espace de stockage récupérable avant un docker prune ?

Lancez docker system df pour afficher un résumé par catégorie (images, conteneurs, volumes, cache de build). La colonne RECLAIMABLE indique l'espace de stockage récupérable pour chaque catégorie. Pour un détail par objet, ajoutez -v. Pour connaître l'espace libre restant sur la partition du serveur virtuel, utilisez df -h / en ligne de commande.

Comment limiter la taille des logs Docker pour libérer de l'espace disque ?

Configurez la rotation des logs dans le fichier /etc/docker/daemon.json avec les options log-driver json-file, max-size (taille maximale par fichier) et max-file (nombre de fichiers temporaires conservés). Après modification, redémarrez Docker avec sudo systemctl restart docker. Les conteneurs existants doivent être recréés avec docker compose up -d pour appliquer la nouvelle configuration.