Published on

Comment "nettoyer" proprement les images, conteneurs, volumes, réseaux docker ?

 5 mins
Authors
  • avatar
    Name
    Léo Delpon
    Twitter

Docker permet de regrouper des logiciels dans un système de fichiers complet, contenant tout le nécessaire pour leur exécution. Cependant, travailler avec Docker peut conduire à accumuler des images et des conteneurs inutilisés, ce qui peut encombrer la sortie et occuper de l'espace disque. Heureusement, Docker propose des outils pour nettoyer votre système et rester organisé. Ce tutoriel rapide explique comment supprimer les fichiers inutiles de Docker pour améliorer les performances du système.

Docker possède une commande qui permet d’éliminer toutes les ressources en suspens comme les images, les contenuers ou encore les volumes et les réseaux du conteneur associé qui est la commande docker system prune

debian@vps-e0a96a5e:~$ docker system prune
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - all dangling build cache

Are you sure you want to continue? [y/N] y
Deleted Containers:
d92e8ba0e543439cc108421f2dca9f0a63a7363768b6c8aab709dbf2b35361be
0532ce2c1ba9bff1e4e89a727323d73dfcf2b60cd89620cc63aef6f9bc8e0be6
f53c6522d0e126ecad2123cdfbac9156eb8a45f36d7f3f26eb5b52484619c4b1
8e422803a2427b842c0665e0faa2f95ccf6f2a8fb0a0f386b0e8dcf549ab055a
03615018f98b3de38727bb100ac351b725f4897cac8e47f0c26b24ad31eeda21
4e8a8b57f9741c5e8e1f15ce330e444a3109239a462634008c70c82610f06794
d6ef61beb2b65a2ef103fb153d25be0e62c1fff0dea40853af78ed0bddaea229
fe2cc0fb1d07956ae538cba6f46955d7d946f24f818f0099010bb487bb555ba0

Deleted Networks:
complete-solution_database
broker-user_default
taskforce_database
complete-solution-nossl_default
taskforce_default
taskforce-new-architecture_default
taskforce-ssl-client_default
backend_database
backend_default
complete-solution-nossl_database
broker-ssl-no-user_default
taskforce-ssl_default
broker-ssl-complete_default
complete-solution_default
no-secure-broker_default
taskforce-new-architecture_database

Deleted Images:
deleted: sha256:dce2f006b033a76207d8decf7bcc51a073c63464f2627aa2b75d6aedcacf8431
deleted: sha256:bc3ab9208740fdf662f0fc4e01546d5d62a9c45a4e4c4ed6a962d2d3e075aa70
deleted: sha256:02fb9e8b9687cceb3693b8e0c15db8882593de825ad185ee6718d6e0f08699c8
deleted: sha256:9214fa085de57abfbf5590c5faef3adc84baca92149e29a835e2efd6777b4b15
deleted: sha256:b740615260ebce90f371ab1ea25aa2c31b994991c67b14a4623c6fcc0ebf1928
deleted: sha256:22200d6ef7deeea49f80f010664bbdac10a256501abc8565aad200f016c70d45
deleted: sha256:d357070ed91bdef4c77d900cf2289726ed31a92a0b618c36a5da90d3f074c912
...

Si vous utilisez Docker pour le développement, vous pouvez facilement accumuler des conteneurs et des images inutiles qui prennent de l'espace disque et peuvent causer des problèmes de performance système. Il est important de nettoyer régulièrement pour éviter les violations de données et les interruptions d'activité. Pour nettoyer Docker, vous aurez besoin d'un système compatible avec Docker, d'un accès à un terminal ou à une ligne de commande, et d'un compte utilisateur avec des capacités sudo. En suivant ces étapes simples, vous pourrez facilement nettoyer votre système Docker et améliorer ses performances.

1. Stopper les images

Pour supprimer les images, nous allons d’abord utiliser la commande docker images -a cela nous permet de visualiser l’ensemble des images présente sur le serveur

On peut ensuite supprimer les images:

debian@vps-e0a96a5e:~$ docker rmi $(docker images -q)
Untagged: complete-solution_nodejs-client:latest
Deleted: sha256:28929ea5e810070115e78aa1e3397b89fc9315adba8401a5c87452c3132234e2
Untagged: complete-solution_broker-mqtt:latest
Deleted: sha256:3456960d3c9b5c5525e46e48a51cd088dac7b0a0f79d7c86201ffbf439f32fb6
Untagged: broker-ssl-complete_nodejs-client:latest
Deleted: sha256:e13b43df2ba728827176a076e095536b1d7dcf43ed41b0fefbb7ba6f70ea8ce6
Untagged: broker-ssl-no-user_broker-mqtt:latest
Deleted: sha256:ec07b6009cf84f297d8e6da5c95257a764f93a455a83d32fae88277b9c7ee5f3
Untagged: broker-ssl-no-user_nodejs-client:latest
Deleted: sha256:60b664fd8ea42126b5d656368732981884c744c68f919a0b970a0d8ba990cfb3
Untagged: complete-solution-nossl_nodejs-client-nossl:latest
...

2. Stopper les conteneurs

Pour stoper les conteneurs qui sont exécuté, nous utilisons la commande docker stop $(docker ps -a -q)

debian@vps-e0a96a5e:~$ docker stop $(docker ps -a -q)
c61cb28919bd
1c84542a6e5a
e6addaac2617
493687367e63
cda5120aed79
...

On vérifie que tout s’est bien stoppé !

debian@vps-e0a96a5e:~$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

Lorsque l’on a bien tout stoppé, on va pouvoir supprimer tout les Docker containers avec la commande suivante docker container stop $(docker container ls -aq) && docker system prune --af --volumes

Suppression des volumes Dockers

On commence par visualiser les volumes qui ne sont pas utilisés avec la commande docker volume ls -f dangling=true. Ensuite, on va supprimer avec la commande suivante:

debian@vps-e0a96a5e:~$ docker volume prune
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] yes
Total reclaimed space: 0B

Suppression des réseaux Docker

Normalement, l’ensemble des réseaux qui étaient utilisés sont supprimés. Mais si des reseaux subsistent et que vous souhaitez les supprimer, il est possible de le faire via la commande suivante:

docker network rm [networkID]

Bilan

On regarde si tout a bien été supprimé :

debian@vps-e0a96a5e:~$ docker container ls
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
debian@vps-e0a96a5e:~$ docker images ls
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
debian@vps-e0a96a5e:~$ docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
f5709498fd0f   bridge    bridge    local
bb0027333362   host      host      local
38f221888f14   none      null      local
debian@vps-e0a96a5e:~$ docker volume ls
DRIVER    VOLUME NAME
local     0c8ed9094a71272116748b15344147ac6845f07a2f12064343fe2d60659b07db
...

Bonus : Ecriture d’un script bash pour nettoyer tout seul ton serveur avec docker

#!/bin/bash

# Vérifier si Docker est installé
if [ -x "$(command -v docker)" ]; then
  echo "[+] Docker is installed in your system"
  docker system prune -a -f --volumes
  echo "[+] All stopped containers / networks / dangling images / dandling build cache have been deleted"
  echo "[+] Stopping used images from docker"
  images=$(docker images -q)
  if [-n "$images" ]; then
    echo "[+] There are images, deleting them"
    docker rmi $(docker images -q) --force
    echo "[+] All images has been deleted"
  else
    echo "[+] No images found"
  fi
  echo "[+] Trying to clean all unused images"
  docker images -f dangling=true
  docker image prune
  echo "[+] Images not used has been cleaned"
  if docker ps > /dev/bull 2>&1; then
    echo "[+] Stopping all used containers"
    docker stop $(docker ps -a -q)
    docker system prune --af --volumes
    echo "[+] All containers has been deleted"
  else
    echo "[+] There are no containers running"
  fi
  echo "[+] Deleting volumes"
  docker volume prune
  echo "[+] Volumes deleted"
else
  echo "[-] Docker is not installed in your system"
fi

Ce script de suppression est très simple et non structuré, voici un autre exemple plus structuré :

#!/bin/bash

# Fonction pour vérifier si Docker est installé
check_docker_installed() {
  if [ -x "$(command -v docker)" ]; then
    echo "[+] Docker is installed into your system"
  else
    echo "[-] Docker has not been installed into your system"
    exit 1
  fi
}

# Fonction pour supprimer les conteneurs, réseaux et images Docker inutilisés
cleanup_docker_system() {
  echo "[+] Cleaning docker system..."
  docker system prune -a -f --volumes
  echo "[+] All your unused containers, images, volumes, network have been deleted"
}

# Fonction pour supprimer les images Docker inutilisées
cleanup_docker_images() {
  echo "[+] Cleaning all used images from docker..."
  images=$(docker images -q)
  if [ -n "$images" ]; then
    echo "[+] Cleaning all used images from docker..."
    docker rmi $(docker images -q) --force
    echo "[+] All used images from docker have been deleted"
  else
    echo "[+] No docker images to be deleted"
  fi
}

# Fonction pour supprimer les volumes Docker inutilisés
cleanup_docker_volumes() {
  echo "[+] Deleting all unused volume..."
  docker volume prune -f
  echo "[+] All volumes have been deleted"
}

# Fonction pour arrêter tous les conteneurs Docker en cours d'exécution
stop_docker_containers() {
  if [ -n "$(docker ps -a -q)" ]; then
    echo "[+] Stoping all running containers..."
    docker stop $(docker ps -a -q)
    docker system prune --af --volumes
    echo "[+] All used containers have been stoped"
  else
    echo "[+] No docker containers running"
  fi
}

# Arrêter tous les conteneurs Docker en cours d'exécution
stop_docker_containers

# Vérifier si Docker est installé
check_docker_installed

# Nettoyer le système Docker
cleanup_docker_system

# Supprimer les images Docker inutilisées
cleanup_docker_images

# Supprimer les volumes Docker inutilisés
cleanup_docker_volumes

echo "[+] All cleaning has been done completely"

Après avoir crée le script, il faut lui donner des droits :

debian@vps-e0a96a5e:~$ sudo chmod 755 docker_cleaner.sh

On peut ensuite exécuter le script !

debian@vps-e0a96a5e:~$ ./docker_cleaner.sh
[+] Docker is installed into your system
[+] Cleaning docker system...
Total reclaimed space: 0B
[+] All your unused containers, images, volumes, network have been deleted
[+] Cleaning all used images from docker...
[+] No docker images to be deleted
[+] Deleting all unused volume...
Total reclaimed space: 0B
[+] All volumes have been deleted
[+] No docker containers running
[+] All cleaning has been done completely