Cómo usar el comando docker volume prune para eliminar volúmenes no utilizados

DockerDockerBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderá cómo gestionar eficazmente los volúmenes de Docker, centrándose en el comando docker volume prune. Comenzaremos creando e inspeccionando varios tipos de volúmenes, incluyendo volúmenes con nombre y volúmenes con etiquetas, para entender sus propiedades y cómo Docker los gestiona.

A continuación, demostraremos cómo se utilizan los volúmenes con contenedores creando y luego eliminando un contenedor que utiliza un volumen. Esto resaltará la persistencia de los datos almacenados en los volúmenes. Finalmente, el laboratorio lo guiará a través del uso del comando docker volume prune para eliminar los volúmenes no utilizados, cubriendo la eliminación de volúmenes anónimos, todos los volúmenes no utilizados (incluidos los volúmenes con nombre) y el uso de filtros de etiquetas para eliminar selectivamente los volúmenes.


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{{"Cómo usar el comando docker volume prune para eliminar volúmenes no utilizados"}} docker/ls -.-> lab-555261{{"Cómo usar el comando docker volume prune para eliminar volúmenes no utilizados"}} docker/rm -.-> lab-555261{{"Cómo usar el comando docker volume prune para eliminar volúmenes no utilizados"}} docker/inspect -.-> lab-555261{{"Cómo usar el comando docker volume prune para eliminar volúmenes no utilizados"}} docker/pull -.-> lab-555261{{"Cómo usar el comando docker volume prune para eliminar volúmenes no utilizados"}} docker/volume -.-> lab-555261{{"Cómo usar el comando docker volume prune para eliminar volúmenes no utilizados"}} docker/prune -.-> lab-555261{{"Cómo usar el comando docker volume prune para eliminar volúmenes no utilizados"}} end

Crear e inspeccionar algunos volúmenes

En este paso, aprenderemos cómo crear e inspeccionar volúmenes de Docker. Los volúmenes son la forma preferida de persistir los datos generados y utilizados por los contenedores de Docker. Mientras que los bind mounts (montajes directos) dependen de la estructura de directorios de la máquina host, los volúmenes son completamente gestionados por Docker.

Primero, creemos un volumen con nombre utilizando el comando docker volume create. Nombraremos este volumen myvolume.

docker volume create myvolume

Debería ver el nombre del volumen impreso en la consola, lo que confirma su creación.

Ahora, inspeccionemos el volumen que acabamos de crear utilizando el comando docker volume inspect. Este comando proporciona información detallada sobre el volumen, como su nombre, controlador (driver) y punto de montaje en la máquina host.

docker volume inspect myvolume

La salida será una matriz JSON que contiene información sobre el volumen. Busque el campo "Mountpoint", que muestra la ubicación en la máquina host donde se almacenan los datos del volumen. Docker gestiona esta ubicación y, en general, debe evitar modificar archivos directamente en este directorio.

A continuación, creemos otro volumen, esta vez con una etiqueta. Las etiquetas son útiles para organizar y filtrar objetos de Docker. Crearemos un volumen llamado labeled_volume y agregaremos una etiqueta app=web.

docker volume create --label app=web labeled_volume

Nuevamente, el nombre del volumen se imprimirá al crearlo con éxito.

Finalmente, inspeccionemos el labeled_volume para ver la etiqueta que agregamos.

docker volume inspect labeled_volume

En la salida JSON, debería encontrar un campo "Labels" que contiene la etiqueta app=web.

Crear y eliminar un contenedor utilizando un volumen

En este paso, crearemos un contenedor de Docker y adjuntaremos el myvolume que creamos en el paso anterior a él. Esto demostrará cómo los datos pueden persistir incluso después de que se elimine el contenedor.

Primero, descarguemos la imagen ubuntu, que usaremos para nuestro contenedor.

docker pull ubuntu

Este comando descarga la imagen ubuntu de Docker Hub.

Ahora, ejecutaremos un contenedor basado en la imagen ubuntu y montaremos myvolume en el directorio /app dentro del contenedor. También ejecutaremos un comando que escriba algunos datos en un archivo dentro del volumen montado.

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

Desglosemos este comando:

  • docker run: Este comando se utiliza para ejecutar un nuevo contenedor.
  • -d: Esta bandera ejecuta el contenedor en modo desatendido (detached mode), lo que significa que se ejecuta en segundo plano.
  • --name mycontainer: Esto asigna el nombre mycontainer al contenedor, lo que lo hace más fácil de referenciar.
  • -v myvolume:/app: Esta es la parte crucial para usar el volumen. Monta el volumen con nombre myvolume en el directorio /app dentro del contenedor.
  • ubuntu: Esto especifica la imagen a utilizar para el contenedor.
  • /bin/bash -c "echo 'Hello from the container!' > /app/data.txt; sleep 30": Este es el comando ejecutado dentro del contenedor. Utiliza bash para ejecutar dos comandos: primero, escribe la cadena "Hello from the container!" en un archivo llamado data.txt dentro del directorio /app (que es el volumen montado), y luego hace que el contenedor se detenga durante 30 segundos para mantenerlo en ejecución durante un corto período.

Puedes comprobar si el contenedor está en ejecución utilizando el comando docker ps.

docker ps

Deberías ver mycontainer enumerado en la salida con un estado de "Up".

Ahora, eliminemos el contenedor. Aunque eliminemos el contenedor, los datos escritos en el volumen deben persistir.

docker rm -f mycontainer

La bandera -f fuerza la eliminación del contenedor, incluso si todavía está en ejecución.

Para verificar que los datos persisten en el volumen, podemos ejecutar un nuevo contenedor y montar el mismo volumen, luego comprobar el contenido del archivo.

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

Desglosemos este comando:

  • docker run: Ejecuta un nuevo contenedor.
  • --rm: Esta bandera elimina automáticamente el contenedor cuando sale.
  • -v myvolume:/app: Monta el myvolume en /app en este nuevo contenedor.
  • ubuntu: Utiliza la imagen ubuntu.
  • cat /app/data.txt: Este es el comando ejecutado dentro del contenedor. Utiliza cat para mostrar el contenido del archivo data.txt ubicado en el directorio /app.

Deberías ver "Hello from the container!" impreso en la consola, lo que confirma que los datos persistieron en el volumen incluso después de que se eliminó el contenedor original.

Eliminar volúmenes anónimos no utilizados

En este paso, aprenderemos cómo eliminar volúmenes anónimos no utilizados. Los volúmenes anónimos se crean cuando no se nombra explícitamente un volumen al montarlo en un contenedor. Por lo general, se eliminan cuando se elimina el contenedor que los creó, pero a veces pueden persistir. La limpieza (pruning) ayuda a eliminar estos volúmenes no utilizados.

Primero, creemos un contenedor con un volumen anónimo. Ejecutaremos un contenedor simple que se cierra inmediatamente.

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

Desglosemos este comando:

  • docker run: Ejecuta un nuevo contenedor.
  • --rm: Esta bandera elimina automáticamente el contenedor cuando sale.
  • -v /data: Esto crea un volumen anónimo y lo monta en el directorio /data dentro del contenedor. Dado que no proporcionamos un nombre antes de los dos puntos, Docker genera un nombre aleatorio para el volumen.
  • ubuntu: Utiliza la imagen ubuntu.
  • ls /data: El comando ejecutado dentro del contenedor, que lista el contenido del directorio /data.

Aunque el contenedor se elimina debido a la bandera --rm, el volumen anónimo puede seguir existiendo si Docker no lo ha limpiado explícitamente.

Para ver todos los volúmenes, incluyendo los anónimos, puedes usar el comando docker volume ls.

docker volume ls

Deberías ver myvolume y labeled_volume de los pasos anteriores, y posiblemente uno o más volúmenes con nombres largos y que parecen aleatorios. Estos son los volúmenes anónimos.

Ahora, eliminemos los volúmenes anónimos no utilizados utilizando el comando docker volume prune. Por defecto, este comando solo elimina los volúmenes anónimos que no están siendo utilizados actualmente por ningún contenedor.

docker volume prune

Docker solicitará confirmación antes de continuar. Escribe y y presiona Enter.

La salida mostrará qué volúmenes se eliminaron. Deberías ver que se eliminan el o los volúmenes anónimos que no estaban en uso.

Listemos los volúmenes de nuevo para confirmar que se han eliminado los volúmenes anónimos.

docker volume ls

Ahora solo deberías ver los volúmenes con nombre (myvolume y labeled_volume) en la lista.

Eliminar todos los volúmenes no utilizados, incluyendo los volúmenes con nombre

En el paso anterior, eliminamos los volúmenes anónimos no utilizados. En este paso, aprenderemos cómo eliminar todos los volúmenes no utilizados, incluyendo los volúmenes con nombre que actualmente no están adjuntos a ningún contenedor.

Primero, listemos los volúmenes existentes para ver lo que tenemos.

docker volume ls

Deberías ver myvolume y labeled_volume enumerados. Estos son volúmenes con nombre y no fueron eliminados por el comando docker volume prune por defecto porque tienen nombre.

Para eliminar todos los volúmenes no utilizados, incluyendo los con nombre, necesitamos usar la bandera --all o -a con el comando docker volume prune.

docker volume prune --all

Docker solicitará confirmación nuevamente. Escribe y y presiona Enter.

La salida mostrará qué volúmenes se están eliminando. Dado que myvolume y labeled_volume no están siendo utilizados actualmente por ningún contenedor, se eliminarán.

Listemos los volúmenes de nuevo para confirmar que se han eliminado todos los volúmenes no utilizados.

docker volume ls

Ahora deberías ver una lista vacía, lo que indica que se han eliminado todos los volúmenes no utilizados, tanto anónimos como con nombre.

Eliminar volúmenes utilizando filtros de etiquetas (labels)

En este último paso, aprenderemos cómo eliminar volúmenes basados en etiquetas (labels). Esta es una forma poderosa de eliminar selectivamente volúmenes que coincidan con criterios específicos, sin afectar a otros volúmenes.

Primero, creemos un par de nuevos volúmenes con diferentes etiquetas para poder aplicar filtros.

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

Hemos creado tres nuevos volúmenes: dev_volume con la etiqueta env=dev, prod_volume con la etiqueta env=prod y data_volume con la etiqueta type=data.

Listemos los volúmenes para ver los recién creados.

docker volume ls

Deberías ver dev_volume, prod_volume y data_volume en la lista.

Ahora, eliminemos solo los volúmenes que tengan la etiqueta env=dev. Podemos usar la bandera --filter con la clave label.

docker volume prune --filter label=env=dev

Docker solicitará confirmación. Escribe y y presiona Enter.

La salida mostrará que se eliminó dev_volume.

Listemos los volúmenes de nuevo para confirmar que solo se eliminó dev_volume.

docker volume ls

Ahora deberías ver que quedan prod_volume y data_volume.

También podemos filtrar por etiquetas que no estén presentes. Por ejemplo, eliminemos los volúmenes que no tengan la etiqueta type=data.

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

Docker solicitará confirmación. Escribe y y presiona Enter.

La salida mostrará que se eliminó prod_volume.

Listemos los volúmenes una última vez para ver qué queda.

docker volume ls

Ahora solo deberías ver que queda data_volume.

Esto demuestra cómo se pueden usar filtros de etiquetas para eliminar selectivamente volúmenes según tus necesidades.

Resumen

En este laboratorio (lab), aprendimos cómo gestionar volúmenes de Docker (Docker volumes), que son el método preferido para persistir datos de contenedores. Comenzamos creando e inspeccionando tanto volúmenes con nombre como volúmenes con etiquetas (labels) utilizando docker volume create y docker volume inspect. Esto nos permitió entender cómo se crean los volúmenes y ver sus detalles, incluyendo sus puntos de montaje (mountpoints) y las etiquetas asociadas.

Posteriormente, demostramos la persistencia de datos creando un contenedor que utilizaba un volumen con nombre y luego eliminando el contenedor. Esto resaltó que el volumen y sus datos permanecían intactos después de la eliminación del contenedor. Finalmente, exploramos el comando docker volume prune, aprendiendo cómo eliminar por defecto los volúmenes anónimos no utilizados, cómo eliminar todos los volúmenes no utilizados (incluyendo los volúmenes con nombre) utilizando la bandera --all y cómo eliminar selectivamente volúmenes basados en etiquetas utilizando la opción --filter. Estos pasos brindaron experiencia práctica en la limpieza de volúmenes no utilizados para liberar espacio en disco.