Comment utiliser la commande docker volume prune pour supprimer les volumes inutilisés

DockerDockerBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce laboratoire, vous apprendrez à gérer efficacement les volumes Docker, en mettant l'accent sur la commande docker volume prune. Nous commencerons par créer et inspecter différents types de volumes, notamment les volumes nommés et les volumes avec des étiquettes (labels), afin de comprendre leurs propriétés et la façon dont Docker les gère.

Ensuite, nous montrerons comment les volumes sont utilisés avec les conteneurs en créant puis en supprimant un conteneur qui utilise un volume. Cela mettra en évidence la persistance des données stockées dans les volumes. Enfin, le laboratoire vous guidera à travers l'utilisation de la commande docker volume prune pour supprimer les volumes inutilisés, couvrant la suppression des volumes anonymes, de tous les volumes inutilisés (y compris les volumes nommés) et l'utilisation de filtres d'étiquettes (labels) pour supprimer sélectivement les volumes.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/VolumeOperationsGroup(["Volume Operations"]) docker(("Docker")) -.-> docker/SystemManagementGroup(["System Management"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ls("List Containers") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/VolumeOperationsGroup -.-> docker/volume("Manage Volumes") docker/SystemManagementGroup -.-> docker/prune("Remove Unused Docker Objects") subgraph Lab Skills docker/run -.-> lab-555261{{"Comment utiliser la commande docker volume prune pour supprimer les volumes inutilisés"}} docker/ls -.-> lab-555261{{"Comment utiliser la commande docker volume prune pour supprimer les volumes inutilisés"}} docker/rm -.-> lab-555261{{"Comment utiliser la commande docker volume prune pour supprimer les volumes inutilisés"}} docker/inspect -.-> lab-555261{{"Comment utiliser la commande docker volume prune pour supprimer les volumes inutilisés"}} docker/pull -.-> lab-555261{{"Comment utiliser la commande docker volume prune pour supprimer les volumes inutilisés"}} docker/volume -.-> lab-555261{{"Comment utiliser la commande docker volume prune pour supprimer les volumes inutilisés"}} docker/prune -.-> lab-555261{{"Comment utiliser la commande docker volume prune pour supprimer les volumes inutilisés"}} end

Créer et inspecter des volumes

Dans cette étape, nous apprendrons à créer et inspecter des volumes Docker. Les volumes sont la méthode préférée pour conserver les données générées et utilisées par les conteneurs Docker. Alors que les montages liés (bind mounts) dépendent de la structure de répertoires de la machine hôte, les volumes sont entièrement gérés par Docker.

Tout d'abord, créons un volume nommé en utilisant la commande docker volume create. Nous nommerons ce volume myvolume.

docker volume create myvolume

Vous devriez voir le nom du volume affiché dans la console, confirmant sa création.

Maintenant, inspectons le volume que nous venons de créer en utilisant la commande docker volume inspect. Cette commande fournit des informations détaillées sur le volume, telles que son nom, son pilote (driver) et son point de montage (mountpoint) sur la machine hôte.

docker volume inspect myvolume

La sortie sera un tableau JSON contenant des informations sur le volume. Recherchez le champ "Mountpoint", qui indique l'emplacement sur l'hôte où les données du volume sont stockées. Docker gère cet emplacement, et vous devriez généralement éviter de modifier directement les fichiers dans ce répertoire.

Ensuite, créons un autre volume, cette fois avec une étiquette (label). Les étiquettes sont utiles pour organiser et filtrer les objets Docker. Nous allons créer un volume nommé labeled_volume et ajouter une étiquette app=web.

docker volume create --label app=web labeled_volume

Encore une fois, le nom du volume sera affiché en cas de création réussie.

Enfin, inspectons le labeled_volume pour voir l'étiquette que nous avons ajoutée.

docker volume inspect labeled_volume

Dans la sortie JSON, vous devriez trouver un champ "Labels" contenant l'étiquette app=web.

Créer et supprimer un conteneur utilisant un volume

Dans cette étape, nous allons créer un conteneur Docker et attacher le volume myvolume que nous avons créé à l'étape précédente. Cela démontrera comment les données peuvent persister même après la suppression du conteneur.

Tout d'abord, téléchargeons l'image ubuntu que nous utiliserons pour notre conteneur.

docker pull ubuntu

Cette commande télécharge l'image ubuntu depuis Docker Hub.

Maintenant, nous allons exécuter un conteneur basé sur l'image ubuntu et monter le volume myvolume sur le répertoire /app à l'intérieur du conteneur. Nous allons également exécuter une commande qui écrit des données dans un fichier à l'intérieur du volume monté.

docker run -d --name mycontainer -v myvolume:/app ubuntu /bin/bash -c "echo 'Hello from the container!' > /app/data.txt; sleep 30"

Décortiquons cette commande :

  • docker run : Cette commande est utilisée pour exécuter un nouveau conteneur.
  • -d : Ce flag exécute le conteneur en mode détaché, c'est-à-dire qu'il s'exécute en arrière-plan.
  • --name mycontainer : Cela attribue le nom mycontainer au conteneur, ce qui le rend plus facile à référencer.
  • -v myvolume:/app : C'est la partie cruciale pour utiliser le volume. Elle monte le volume nommé myvolume sur le répertoire /app à l'intérieur du conteneur.
  • ubuntu : Cela spécifie l'image à utiliser pour le conteneur.
  • /bin/bash -c "echo 'Hello from the container!' > /app/data.txt; sleep 30" : C'est la commande exécutée à l'intérieur du conteneur. Elle utilise bash pour exécuter deux commandes : tout d'abord, elle écrit la chaîne "Hello from the container!" dans un fichier nommé data.txt à l'intérieur du répertoire /app (qui est le volume monté), puis elle fait dormir le conteneur pendant 30 secondes pour le maintenir en cours d'exécution pendant une courte période.

Vous pouvez vérifier si le conteneur est en cours d'exécution en utilisant la commande docker ps.

docker ps

Vous devriez voir mycontainer répertorié dans la sortie avec un statut "Up".

Maintenant, supprimons le conteneur. Même si nous supprimons le conteneur, les données écrites dans le volume devraient persister.

docker rm -f mycontainer

Le flag -f force la suppression du conteneur, même s'il est toujours en cours d'exécution.

Pour vérifier que les données persistent dans le volume, nous pouvons exécuter un nouveau conteneur et monter le même volume, puis vérifier le contenu du fichier.

docker run --rm -v myvolume:/app ubuntu cat /app/data.txt

Décortiquons cette commande :

  • docker run : Exécute un nouveau conteneur.
  • --rm : Ce flag supprime automatiquement le conteneur lorsqu'il se termine.
  • -v myvolume:/app : Monte le volume myvolume sur /app dans ce nouveau conteneur.
  • ubuntu : Utilise l'image ubuntu.
  • cat /app/data.txt : C'est la commande exécutée à l'intérieur du conteneur. Elle utilise cat pour afficher le contenu du fichier data.txt situé dans le répertoire /app.

Vous devriez voir "Hello from the container!" affiché dans la console, confirmant que les données ont persisté dans le volume même après la suppression du conteneur d'origine.

Supprimer les volumes anonymes inutilisés

Dans cette étape, nous apprendrons à supprimer les volumes anonymes inutilisés. Les volumes anonymes sont créés lorsque vous ne nommez pas explicitement un volume lors de son montage sur un conteneur. Ils sont généralement supprimés lorsque le conteneur qui les a créés est supprimé, mais parfois ils peuvent persister. La suppression (pruning) permet de nettoyer ces volumes inutilisés.

Tout d'abord, créons un conteneur avec un volume anonyme. Nous allons exécuter un simple conteneur qui se termine immédiatement.

docker run --rm -v /data ubuntu ls /data

Décortiquons cette commande :

  • docker run : Exécute un nouveau conteneur.
  • --rm : Ce flag supprime automatiquement le conteneur lorsqu'il se termine.
  • -v /data : Cela crée un volume anonyme et le monte sur le répertoire /data à l'intérieur du conteneur. Comme nous n'avons pas fourni de nom avant les deux points, Docker génère un nom aléatoire pour le volume.
  • ubuntu : Utilise l'image ubuntu.
  • ls /data : La commande exécutée à l'intérieur du conteneur, qui liste le contenu du répertoire /data.

Même si le conteneur est supprimé en raison du flag --rm, le volume anonyme peut toujours exister s'il n'a pas été explicitement nettoyé par Docker.

Pour voir tous les volumes, y compris les anonymes, vous pouvez utiliser la commande docker volume ls.

docker volume ls

Vous devriez voir myvolume et labeled_volume des étapes précédentes, et éventuellement un ou plusieurs volumes avec de longs noms qui semblent aléatoires. Ce sont les volumes anonymes.

Maintenant, supprimons les volumes anonymes inutilisés en utilisant la commande docker volume prune. Par défaut, cette commande ne supprime que les volumes anonymes qui ne sont pas actuellement utilisés par aucun conteneur.

docker volume prune

Docker demandera confirmation avant de procéder. Tapez y puis appuyez sur Entrée.

La sortie vous montrera quels volumes ont été supprimés. Vous devriez voir le ou les volumes anonymes inutilisés être supprimés.

Listons à nouveau les volumes pour confirmer que les volumes anonymes ont été supprimés.

docker volume ls

Vous ne devriez maintenant voir que les volumes nommés (myvolume et labeled_volume) dans la liste.

Supprimer tous les volumes inutilisés, y compris les volumes nommés

Dans l'étape précédente, nous avons supprimé les volumes anonymes inutilisés. Dans cette étape, nous apprendrons à supprimer tous les volumes inutilisés, y compris les volumes nommés qui ne sont pas actuellement attachés à un conteneur.

Tout d'abord, listons les volumes existants pour voir ce que nous avons.

docker volume ls

Vous devriez voir myvolume et labeled_volume répertoriés. Ce sont des volumes nommés et n'ont pas été supprimés par la commande par défaut docker volume prune car ils sont nommés.

Pour supprimer tous les volumes inutilisés, y compris les volumes nommés, nous devons utiliser le flag --all ou -a avec la commande docker volume prune.

docker volume prune --all

Docker demandera à nouveau confirmation. Tapez y puis appuyez sur Entrée.

La sortie vous montrera quels volumes sont en train d'être supprimés. Étant donné que myvolume et labeled_volume ne sont pas actuellement utilisés par un conteneur, ils seront supprimés.

Listons à nouveau les volumes pour confirmer que tous les volumes inutilisés ont été supprimés.

docker volume ls

Vous devriez maintenant voir une liste vide, indiquant que tous les volumes inutilisés, tant anonymes que nommés, ont été supprimés.

Supprimer des volumes en utilisant un filtre par étiquette (label)

Dans cette étape finale, nous apprendrons à supprimer des volumes en fonction de leurs étiquettes (labels). C'est un moyen puissant de supprimer sélectivement les volumes qui correspondent à des critères spécifiques, sans affecter les autres volumes.

Tout d'abord, créons quelques nouveaux volumes avec différentes étiquettes afin d'avoir des éléments à filtrer.

docker volume create --label env=dev dev_volume
docker volume create --label env=prod prod_volume
docker volume create --label type=data data_volume

Nous avons créé trois nouveaux volumes : dev_volume avec l'étiquette env=dev, prod_volume avec l'étiquette env=prod et data_volume avec l'étiquette type=data.

Listons les volumes pour voir les nouveaux créés.

docker volume ls

Vous devriez voir dev_volume, prod_volume et data_volume dans la liste.

Maintenant, supprimons uniquement les volumes qui ont l'étiquette env=dev. Nous pouvons utiliser le flag --filter avec la clé label.

docker volume prune --filter label=env=dev

Docker demandera confirmation. Tapez y puis appuyez sur Entrée.

La sortie montrera que dev_volume a été supprimé.

Listons les volumes à nouveau pour confirmer que seul dev_volume a été supprimé.

docker volume ls

Vous devriez maintenant voir prod_volume et data_volume restants.

Nous pouvons également filtrer par les étiquettes qui ne sont pas présentes. Par exemple, supprimons les volumes qui n'ont pas l'étiquette type=data.

docker volume prune --filter label!=type=data

Docker demandera confirmation. Tapez y puis appuyez sur Entrée.

La sortie montrera que prod_volume a été supprimé.

Listons les volumes une dernière fois pour voir ce qui reste.

docker volume ls

Vous devriez maintenant ne voir que data_volume restant.

Cela démontre comment vous pouvez utiliser des filtres d'étiquettes pour supprimer sélectivement des volumes en fonction de vos besoins.

Résumé

Dans ce laboratoire (lab), nous avons appris à gérer les volumes Docker, qui sont la méthode préférée pour conserver les données des conteneurs. Nous avons commencé par créer et inspecter à la fois des volumes nommés et des volumes avec des étiquettes (labels) en utilisant docker volume create et docker volume inspect. Cela nous a permis de comprendre comment les volumes sont créés et de visualiser leurs détails, y compris leurs points de montage et les étiquettes associées.

Ensuite, nous avons démontré la persistance des données en créant un conteneur qui utilisait un volume nommé, puis en supprimant le conteneur. Cela a mis en évidence que le volume et ses données restaient intacts après la suppression du conteneur. Enfin, nous avons exploré la commande docker volume prune, en apprenant comment supprimer par défaut les volumes anonymes inutilisés, comment supprimer tous les volumes inutilisés (y compris les volumes nommés) en utilisant le flag --all, et comment supprimer sélectivement des volumes en fonction de leurs étiquettes en utilisant l'option --filter. Ces étapes ont fourni une expérience pratique pour nettoyer les volumes inutilisés afin de libérer de l'espace disque.