Contactez-nous

Nettoyer régulièrement les conteneurs et images inutilisés (`docker system prune`)

Apprenez l'importance de nettoyer régulièrement les objets Docker inutilisés (conteneurs arrêtés, images orphelines, etc.) avec `docker system prune` pour libérer de l'espace disque.

L'hygiène Docker : pourquoi le nettoyage est essentiel

Au fur et à mesure que vous utilisez Docker, vous allez inévitablement accumuler des ressources qui ne sont plus activement utilisées. Chaque build d'image peut créer des couches intermédiaires, chaque `docker run` crée un conteneur (qui reste présent même après son arrêt), et des réseaux ou volumes peuvent devenir orphelins. Avec le temps, ces objets inutilisés peuvent consommer une quantité significative d'espace disque et potentiellement ralentir certaines opérations Docker.

Maintenir un environnement Docker propre n'est pas seulement une question d'ordre, c'est une pratique essentielle pour garantir l'efficacité et la performance de votre système. Un nettoyage régulier permet de récupérer de l'espace disque précieux, de réduire l'encombrement qui peut rendre la gestion plus difficile (par exemple, lors du listage des objets), et d'assurer que les ressources système sont utilisées de manière optimale.

Heureusement, Docker fournit des outils pour faciliter ce processus de nettoyage, la commande la plus globale et la plus utile pour un nettoyage rapide étant `docker system prune`.

Les objets ciblés par le nettoyage

Quels sont exactement ces "objets inutilisés" que nous cherchons à éliminer ? Principalement :

1. Conteneurs arrêtés : Lorsque vous arrêtez un conteneur avec `docker stop`, il n'est pas automatiquement supprimé. Il reste sur votre système (visible avec `docker ps -a`) et occupe de l'espace disque (sa couche d'écriture). Ces conteneurs arrêtés s'accumulent rapidement, surtout lors des phases de test et de débogage.

2. Images "Dangling" (orphelines) : Ce sont des couches d'images qui ne sont associées à aucun tag et ne sont utilisées par aucun conteneur. Elles apparaissent souvent comme `:` dans la sortie de `docker images -a`. Elles résultent généralement de builds d'images où une nouvelle version remplace une ancienne sans que l'ancienne soit explicitement supprimée, ou de builds interrompus.

3. Réseaux non utilisés : Si vous créez des réseaux personnalisés (`docker network create`) et que vous supprimez ensuite tous les conteneurs qui y étaient attachés, le réseau lui-même persiste mais devient inutilisé.

4. Cache de build : Docker utilise un cache pour accélérer les builds d'images. Bien qu'utile, ce cache peut devenir volumineux avec le temps et contenir des couches pour des étapes qui ne sont plus pertinentes.

Tous ces éléments peuvent être ciblés par les commandes de nettoyage de Docker.

La commande `docker system prune` : le grand ménage

La commande `docker system prune` est conçue pour effectuer un nettoyage global de ces ressources inutilisées en une seule opération. C'est la commande la plus simple et la plus directe pour une maintenance régulière.

Syntaxe de base :

docker system prune

Par défaut, cette commande supprime :

  • Tous les conteneurs à l'état arrêté (`exited`).
  • Tous les réseaux qui ne sont utilisés par aucun conteneur.
  • Toutes les images dangling (celles sans tag et non référencées).
  • Tout le cache de build non utilisé.

Avant d'effectuer la suppression, la commande affiche généralement un avertissement et demande une confirmation (Y/n), listant ce qui sera supprimé et l'espace disque potentiellement récupéré. Lisez attentivement cet avertissement avant de confirmer.

WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - all build cache

Are you sure you want to continue? [y/N] y

Options de nettoyage avancées et précautions

La commande `docker system prune` dispose de quelques options importantes à connaître :

1. Nettoyage agressif (`-a` ou `--all`) : Si vous ajoutez l'option `-a`, `docker system prune` devient plus agressif. En plus de tout ce qui est supprimé par défaut, il supprime également toutes les images non utilisées, c'est-à-dire toutes les images qui ne sont associées à aucun conteneur (même celles qui ont un tag valide, comme `ubuntu:latest` ou `votre-app:v1`, si aucun conteneur ne les utilise actuellement).

# ATTENTION TRES DANGEREUX : supprime TOUTES les images non utilisées
docker system prune -a
Utilisez cette option `-a` avec une extrême prudence ! Vous pourriez supprimer des images que vous vouliez conserver pour une utilisation future, vous forçant à les télécharger ou les reconstruire ultérieurement.

2. Nettoyage des volumes (`--volumes`) : Par défaut, pour des raisons de sécurité (ne pas supprimer accidentellement des données importantes), `docker system prune` ne supprime pas les volumes nommés non utilisés. Si vous souhaitez également nettoyer les volumes qui ne sont attachés à aucun conteneur (ni démarré, ni arrêté), vous devez ajouter explicitement l'option `--volumes`.

# ATTENTION : supprime les volumes non attachés
docker system prune --volumes
Là encore, soyez prudent. Assurez-vous de ne pas avoir de volumes contenant des données importantes qui ne sont temporairement attachés à aucun conteneur avant d'utiliser cette option. Il peut être judicieux de lister vos volumes (`docker volume ls`) et d'inspecter ceux qui vous semblent suspects (`docker volume inspect `) avant de lancer ce nettoyage.

Il existe également des commandes de nettoyage plus ciblées si vous ne souhaitez supprimer qu'un type spécifique d'objet :

  • `docker container prune` (supprime les conteneurs arrêtés)
  • `docker image prune` (supprime les images dangling, ou toutes les images non utilisées avec `-a`)
  • `docker volume prune` (supprime les volumes non utilisés)
  • `docker network prune` (supprime les réseaux non utilisés)
Cependant, pour un nettoyage régulier et global, `docker system prune` (sans `-a` et sans `--volumes` initialement) est souvent suffisant et plus pratique.

Intégrer `docker system prune` à votre routine de maintenance (par exemple, l'exécuter une fois par semaine ou après des sessions intensives de build/test) est une excellente habitude pour garder votre environnement Docker léger, rapide et bien géré.