Limpieza de Docker: Una guía completa con ejemplos prácticos

Si trabajas con Docker a diario, sabes lo rápido que puede consumir espacio en disco.

Con el tiempo, tu sistema acumula imágenes, contenedores, volúmenes y redes no utilizados. Estos en su mayoría permanecen inactivos, ocupando un valioso espacio de almacenamiento y potencialmente impidiéndote trabajar en tu proyecto actual. Afortunadamente, Docker proporciona comandos de limpieza incorporados que eliminan fácilmente los recursos innecesarios.

Estos comandos de limpieza forman parte de la familia de docker prune, y hoy aprenderás todo sobre ellos. Rápidamente se convertirán en tu solución preferida para liberar espacio en disco.

Comencemos con una breve descripción antes de sumergirnos en ejemplos prácticos.

¿Eres nuevo en Docker? Consulta nuestra guía sobre aprender Docker desde cero para profesionales de datos para ponerte al día rápidamente.

¿Qué es Docker Prune?

El término “Docker Prune” suele referirse a un conjunto de comandos diseñados para ayudarte a eliminar recursos de Docker no utilizados e innecesarios.

Con el tiempo, especialmente si trabajas en múltiples proyectos, crearás innumerables imágenes, ejecutarás contenedores y configurarás volúmenes y redes. Todo esto se acumula en tu sistema, ocupando una cantidad significativa de espacio en disco. El propósito de docker prune es limpiar ese desorden y recuperar almacenamiento.

Dicho esto, hay más en docker prune de lo que parece a simple vista.

No es solo un comando que puedes ejecutar. Bueno, podrías hacerlo, pero a veces necesitas control detallado sobre lo que se elimina. Ahí es donde entra este artículo. Te mostrará cómo gestionar la poda de manera efectiva, asegurando que elimines solo lo que pretendes, y cómo practicar en un entorno seguro para evitar eliminar accidentalmente datos importantes.

También vale la pena señalar que los comandos de poda solo eliminan los recursos que no se están utilizando activamente. Las imágenes, volúmenes y redes referenciadas por contenedores en ejecución no se eliminarán. En otras palabras, la poda no interferirá con las cargas de trabajo activas.  

En la siguiente sección, te guiaremos a través de los diferentes tipos de comandos de poda y explicaremos cómo encajan en tu flujo de trabajo.  

¿Quieres añadir Docker a tu CV o portafolio? Estas 10 ideas de proyectos Docker te prepararán para el trabajo.

Todos los Comandos de Poda de Docker con Ejemplos Prácticos

Docker proporciona múltiples comandos prune que te permiten limpiar los recursos no utilizados individualmente o todos a la vez. En esta sección, aprenderás sobre ellos, tanto a través de teoría y ejemplos prácticos.  

docker system prune  

Este es el comando más completo para recuperar espacio en disco. Elimina todos los contenedores, redes, imágenes y caché de compilación no utilizados en una sola operación.  

Si buscas una forma rápida de liberar espacio en disco con un solo comando, este es el que debes usar.  

Puedes pasar opciones al comando docker system prune:  

  • -a o --all elimina todas las imágenes no utilizadas en lugar de solo las que están sueltas (imágenes que no tienen etiqueta o no son referenciadas por ningún contenedor).  
  • --filter te permite especificar valores de filtro.  
  • -f o --force omite la confirmación.  
  • --volumes también elimina los volúmenes anónimos junto con los contenedores, redes, imágenes y caché de construcción.  

De forma predeterminada, docker system prune te solicita confirmación ya que es una operación potencialmente destructiva:  

Imagen 1 – Confirmación de eliminación de Docker system prune

Para omitir la solicitud y eliminar todas las imágenes, contenedores, redes y volúmenes no utilizados con un solo comando, ejecuta:  

docker system prune -a -f --volumes

Imagen 2 – Elimina todo con un solo comando de poda del sistema de Docker

Pero, ¿y si necesitas un control más granular? Vamos a ver eso a continuación.

docker container prune

En pocas palabras, este comando elimina todos los contenedores detenidos.

Los contenedores detenidos permanecen en su sistema hasta que se eliminan manualmente. Pueden ocupar espacio en disco y ser difíciles de detectar a menos que utilice una herramienta como Docker Desktop Dashboard.

Al igual que docker system prune, este comando admite opciones:

  • --filter le permite especificar pares de clave-valor para controlar qué contenedores se eliminan.
  • -f o --force omite la confirmación.

Aquí hay una lista de contenedores no en ejecución:

Imagen 3 – Lista de contenedores no en ejecución

Para eliminar code-server (y cualquier otro contenedor detenido), ejecuta:

docker container prune -f

Esto no te pedirá confirmación, y en cuestión de segundos, verás una salida como esta:

Imagen 4 – Mensaje de salida del podado de contenedores

Y así, ya no hay más contenedores detenidos:

Imagen 5 – Lista de contenedores no ejecutados (2)

Ahora, ocupémonos de las imágenes no utilizadas.

docker image prune

Similar al comando anterior, docker image prune elimina las imágenes no utilizadas.

De forma predeterminada, elimina solo las imágenes colgantes, es decir, las imágenes sin etiqueta y no asociadas a un contenedor. Puedes usar una bandera opcional para eliminar todas las imágenes no utilizadas, no solo las colgantes.

Aquí tienes una lista de opciones disponibles

  • -a o --all elimina todas las imágenes no utilizadas en lugar de solo las colgantes.
  • --filter te permite especificar pares clave-valor para controlar qué imágenes se eliminan.
  • -f o --force salta la confirmación.

¡Ahora, veámoslo en acción!

Aquí tienes una lista de imágenes actualmente en el sistema:

Imagen 6 – Lista de imágenes de Docker

Para eliminar todas ellas con un solo comando, ejecuta:

docker image prune -a -f

Verás una salida como esta en la terminal:

Imagen 7 – Mensaje de salida de poda de imágenes

Después, no quedan imágenes en Docker Desktop:

Imagen 8 – Lista de imágenes de Docker (2)

A continuación, vamos a manejar los volúmenes no utilizados.

docker volume prune

Como su nombre indica, el comando docker volume prune elimina todos los volúmenes locales no utilizados. En otras palabras, elimina los volúmenes que no están referenciados por ningún contenedor.

De forma predeterminada, el comando elimina solo volúmenes anónimos – volúmenes sin nombre creados por Docker cuando se inicia un contenedor. Para eliminar volúmenes explícitamente nombrados, necesitas pasar una opción adicional.

Estas son las opciones disponibles:

  • -a o --all elimina todos los volúmenes no utilizados en lugar de solo los anónimos.
  • --filter te permite especificar pares de clave-valor para controlar qué volúmenes se eliminan.
  • -f o --force omite la confirmación.

En nuestro sistema, tenemos un volumen creado por el usuario a partir de un archivo docker-compose.yml:

Imagen 9 – Lista de volúmenes de Docker

El siguiente comando elimina todos los volúmenes locales:

docker volume prune -a -f

Después de ejecutarlo, verás una salida similar a esto:

Imagen 10 – Mensaje de salida de poda de volumen

Ahora, no quedan volúmenes:

Imagen 11 – Lista de volúmenes de Docker (2)

Finalmente, veamos cómo eliminar las redes no utilizadas.

docker network prune

Cuando los contenedores de Docker se comunican entre sí, a menudo utilizan redes definidas por el usuario. Sin embargo, esas redes suelen permanecer en su sistema una vez que se eliminan esos contenedores.

El comando docker network prune elimina las redes que ya no están en uso por ningún contenedor.

Al igual que los otros comandos de poda, incluye algunas opciones:

  • --filter te permite especificar pares clave-valor para controlar qué redes se eliminan.
  • -f o --force omite el aviso de confirmación.

A diferencia de las imágenes, contenedores o volúmenes, no puedes inspeccionar visualmente las redes a través de Docker Desktop, así que deberás trabajar desde la línea de comandos. Aquí tienes una lista de las redes disponibles:

Imagen 12 – Lista de redes de Docker

Para eliminar todas las redes no asociadas con la instalación predeterminada de Docker, ejecuta:

docker network prune -a -f

Después de ejecutar el comando, verás una salida como esta:

Imagen 13 – Mensaje de salida de poda de red

Cualquier red asociada con contenedores que se ejecutaron anteriormente ahora ha desaparecido:

Imagen 14 – Lista de redes de Docker

Sin embargo, ten en cuenta que las tres redes restantes son esenciales para que Docker funcione correctamente y no se pueden eliminar.

¡Y eso es todo para el uso básico de los comandos docker prune! A continuación, cubriremos temas avanzados como el uso seguro de estos comandos y las mejores prácticas para entornos de producción y sensibles.

Uso seguro de Docker Prune

Los comandos docker prune ayudan a recuperar rápidamente espacio en disco, pero deben ser usados con precaución, especialmente en entornos de producción.

Eliminar accidentalmente contenedores, imágenes o volúmenes importantes puede provocar la pérdida de datos y interrumpir flujos de trabajo críticos. Para evitar esto, es mejor entender qué se eliminará antes de ejecutar cualquier comando de poda.

Esta sección explica las precauciones clave a tomar al ejecutar de forma segura docker prune.

Entendiendo qué se eliminará

Los comandos de prune están diseñados para eliminar solo recursos que no se están utilizando activamente.

Por ejemplo, docker image prune elimina solo las imágenes no utilizadas, y docker volume prune elimina solo los volúmenes no vinculados a ningún contenedor. Sin embargo, agregar opciones como -a -f eliminará todas las imágenes o volúmenes sin pedir confirmación.  

Además, en entornos complejos, las dependencias pueden ser fáciles de pasar por alto, por lo que es siempre una buena práctica verificar dos veces antes de podar.  

Antes de ejecutar cualquier comando prune, debes inspeccionar tu sistema para ver qué recursos se están utilizando actualmente. Hay varias formas de hacerlo, y exploraremos las más comunes en esta sección.  

Utiliza este comando para ver todos los contenedores, incluidos los detenidos:  

docker ps -a

Deberías ver una salida similar a esta:

Imagen 15 – Lista de todos los contenedores de Docker

De manera similar, usa este comando para listar todas las imágenes, incluyendo las no utilizadas:  

docker images

La salida estará estructurada de manera similar a la anterior:  

Imagen 16 – Lista de todas las imágenes de Docker

Para verificar los volúmenes, ejecute este comando para listar todos los volúmenes:

docker volume ls

Imagen 17 – Lista de todos los volúmenes de Docker

Revise cuidadosamente estas salidas para asegurarse de que no se eliminarán recursos críticos por error.

Simulación para seguridad

Desafortunadamente, Docker aún no tiene una opción incorporada para una simulación del comando de limpieza, a pesar de que fue solicitada hace años.

Por lo tanto, debes inspeccionar manualmente los recursos utilizando los comandos enumerados en la sección anterior antes de ejecutar un comando de poda.  

Si estás trabajando en un entorno sensible donde la persistencia de datos es crítica, siempre debes crear una copia de seguridad antes de ejecutar comandos de poda que afecten a los volúmenes.  

Por supuesto, estas son solo medidas de precaución, pero esperamos ver implementada pronto una opción de simulación.

Mejores prácticas para Docker Prune

Para mantener tu entorno de Docker libre de desorden innecesario, es importante ejecutar regularmente comandos de prune, quizás incluso automatizarlos.

Esta sección te guía a través de las mejores prácticas para ejecutar comandos de docker prune en entornos de producción.

Usa docker prune regularmente

Con el tiempo, Docker acumula imágenes no utilizadas, contenedores detenidos y volúmenes innecesarios, todos los cuales consumen un espacio significativo en disco.

Ejecutar comandos de poda de forma regular mantiene limpio tu entorno y evita el uso excesivo de disco. Deberías incluirlos como parte de tu programación de mantenimiento

Cada pocas semanas es un buen punto de partida, pero si tu configuración implica la creación y eliminación frecuente de contenedores, considera una programación más frecuente. 

Sé cauteloso en producción 

Cualquier trabajo en un entorno de producción requiere precaución adicional, y la poda de Docker no es una excepción. 

Un momento de desatención puede provocar tiempo de inactividad o pérdida de datos, y no quieres ser responsable de eso. Antes de ejecutar comandos docker prune en un entorno de producción, siempre inspecciona los recursos del sistema usando docker ps -a, docker images y docker volume ls, como se explica en la sección anterior.  

Además, es buena idea utilizar comandos específicos de poda en lugar del todo incluido docker system prune, ya que puede ser más fácil recuperarse de eliminaciones no deseadas.  

Automatizar la poda de docker  

Otra buena práctica es optimizar los esfuerzos de limpieza automatizando los comandos de docker prune mediante tareas programadas.  

En Linux, puedes configurar una tarea cron para ejecutar comandos a intervalos regulares, mientras que en Windows, puedes utilizar Programador de tareas para una automatización similar. Esto ayuda a mantener un sistema ordenado sin necesidad de intervención manual. Sin embargo, en un entorno de producción, asegúrate de que el recorte automatizado no interfiera con las cargas de trabajo críticas.

Por ejemplo, esta tarea cron en Linux ejecuta un comando de recorte completo todos los domingos a medianoche:

0 0 * * 0 docker system prune -a -f

Solución de problemas de problemas de Docker Prune

Los comandos docker prune son una solución común para recuperar espacio en disco, pero no siempre son suficientes para garantizar espacio suficiente para descargar nuevas imágenes o ejecutar nuevos contenedores.  

Además, podrías eliminar accidentalmente recursos importantes, por lo que es crucial discutir estrategias de recuperación.  

Ambos temas se tratarán en esta sección.  

Problemas de espacio en disco  

Las imágenes de Docker pueden ser grandes, recientemente tuvimos una de más de 13GB, y estamos seguros de que hay incluso unas más grandes por ahí. Por lo tanto, incluso después de ejecutar docker prune, es posible que descubras que tu sistema aún tiene poco espacio en disco.  

Para ver exactamente cuánto espacio se está utilizando por imágenes, contenedores y volúmenes, ejecute este comando:  

docker system df

Imagen 18 – Espacio utilizado por Docker

Cuando recupere espacio en disco con comandos docker prune, agregue la bandera -a para eliminar todas imágenes, volúmenes o contenedores, no solo los que estén colgantes o anónimos. Por supuesto, tenga en cuenta las posibles desventajas de este enfoque.  

Si el problema de espacio en disco persiste, tu única opción es aumentar el espacio en disco disponible.

Recuperación de eliminaciones accidentales

Recuperarse es más fácil decirlo que hacerlo, por eso recomendamos entender qué se eliminará al podar antes de ejecutar el comando real.

Sin embargo, si te encuentras en una situación donde has podado accidentalmente contenedores, imágenes o volúmenes importantes,comienza por revisar los registros para identificar qué fue eliminado.

En macOS, esto se puede hacer ejecutando los siguientes dos comandos (opciones para Windows y Linux):

pred='process matches ".*(ocker|vpnkit).*" || (process in {"taskgated-helper", "launchservicesd", "kernel"} && eventMessage contains[c] "docker")' /usr/bin/log stream --style syslog --level=debug --color=always --predicate "$pred" /usr/bin/log show --debug --info --style syslog --last 30m --predicate "$pred" >/tmp/logs.txt

Al ejecutar estos comandos se guardarán los últimos 30 minutos de registros relacionados con Docker en /tmp/logs.txt. Debes inspeccionar estos registros para determinar qué contenedores o imágenes fueron eliminados.

Para imágenes eliminadas, probablemente puedas volver a descargarlas desde un registro como Docker Hub. Un comando como este debería hacer el truco:

docker pull <image_name>

Y para contenedores eliminados, siempre puedes recrearlos si se basaban en imágenes persistentes:

docker run --name <container_name> <image_name>

Alternativamente, puedes restaurar desde copias de seguridad si están disponibles, lo cual puede utilizarse para recuperar tanto datos de volumen como de contenedor. En el futuro, considera utilizar herramientas para instantáneas de volumen para prevenir la pérdida de datos.

Sin embargo, la mejor estrategia es inspeccionar los recursos que se eliminarán antes de ejecutar un comando de poda y proceder solo si está absolutamente seguro de que no afectará su flujo de trabajo.

Resumiendo Docker Prune

En conclusión, la familia de comandos docker prune es una forma poderosa de recuperar espacio en disco, pero con el riesgo de eliminar accidentalmente recursos que necesita, lo que puede provocar pérdida de datos. Este riesgo es aún mayor al utilizar las banderas opcionales -a -f, las cuales eliminarán todo de manera forzada.

No obstante, la poda sigue siendo un método fundamental para mantener su sistema limpio y organizado.

Solo tienes que ser cauteloso, especialmente en entornos de producción. Utiliza comandos como docker ps -a, docker images y docker volume ls antes de podar para listar todos los contenedores, imágenes y volúmenes. Ejecuta el comando de poda únicamente después de estar seguro de que estás de acuerdo con eliminar los recursos listados (asumiendo que no están siendo utilizados por un contenedor en ejecución).  

Si deseas aprender más sobre Docker, containerización y orquestación de contenedores, echa un vistazo a estos cursos en DataCamp:

Source:
https://www.datacamp.com/tutorial/docker-prune