Cómo eliminar imágenes de Docker, contenedores y volúmenes

Aprendemos a eliminar imágenes de Docker, contenedores y volúmenes. La tecnología de contenedores o microservicios ya hace años que la tenemos en nuestros entornos productivos en empresas y también en muchos domésticos. De hecho en la web ya hemos hablado largo y tendido de ellos. Ya sea con Docker u otras tecnologías como podman.

Con Docker es fácil acumular una cantidad excesiva de imágenes, contenedores y volúmenes de datos no utilizados, que saturan el host con la consiguiente ocupación de disco. Por ello Docker nos brinda todas las herramientas que necesitamos para limpiar nuestro sistema desde la línea de comandos. La intención de esta entrada es ofrecer una guía rápida de los comandos que son útiles para liberar espacio en el disco y mantener el sistema organizado, al eliminar imágenes, contenedores y volúmenes no utilizados

Purga de todas las imágenes, contenedores, volúmenes y redes sin usar o colgados

Docker proporciona un solo comando que limpiará los recursos (imágenes, contenedores, volúmenes y redes) que estén colgados, esto es, no vinculados a un contenedor:

sudo docker system prune

De manera adicional para eliminar los contenedores detenidos y todas las imágenes no utilizadas (no solo las colgadas), debemos agregar la marca -a al comando:

sudo docker system prune -a

Eliminar las imágenes de Docker

Eliminar una o más imágenes específicas

Debemos utilizar el comando docker images con el parámetro -a para localizar el ID de las imágenes que deseamos eliminar. Esto nos mostrará todas las imágenes, incluidas las capas de imágenes intermedias. Cuando hayamos localizado las imágenes que deseamos eliminar, podemos pasar su ID o etiqueta a docker rmi:

#Para listar
sudo docker images -a

En cambio, para eliminar:

sudo docker rmi "imagen1" "imagen2"
Eliminar imágenes colgadas

Las imágenes de Docker constan de varias capas. Las imágenes colgaadas son capas que no tienen relación con ninguna imagen etiquetada. Ya no tienen un propósito y consumen espacio en disco. Se pueden ubicar agregando el paráemtro -f con un valor de dandling = true al comando de imágenes. Cuando estamos seguro de que deseamos eliminarlos, podemos usar el comando docker image prune:

Para listarlos:

docker images -f dangling=true

Para eliminarlos:

docker image prune
Borrar imágenes que cumplan con un patrón

Podemos encontrar todas las imágenes que coinciden con un patrón utilizando una combinación de imágenes de docker y grep. Una vez que esté satisfecho, podemos eliminarlos usando awk para pasar los ID a docker rmi.

Para listar:

#Añadimos el parámetro -i para que ignore mayúsculas y minúsculas
docker images -a |  grep -i "nombre"

Para eliminar:

sudo docker rmi $(docker images -a | grep "nombre" | awk '{print $3}')
# O
sudo docker images -a | grep "pattern" | awk '{print $3}' | xargs docker rmi
Borrar todas las imágenes

Todas las imágenes de Docker en un sistema se pueden enumerar agregando -a al comando de imágenes de Docker. Una vez que estamos seguros de que deseamos eliminarlos todos, podemos agregar el parámetro -q para pasar el ID de imagen a docker rmi:

Para listar:

docker images -a

Para eliminar:

docker rmi $(docker images -a -q)

Eliminar contenedores en Docker

Eliminar uno o más contenedores específicos

Usamos el comando docker ps con el parámetro -a para ubicar el nombre o ID de los contenedores que deseamos eliminar:

Listar contenedores:

sudo docker ps -a

Eliminarlos:

sudo docker rm ID_o_nombre ID_o_nombre
Eliminar contenedores en estado exit

Si sabemos cuando estamos creando un contenedor que no querremos conservarlo una vez que haya terminado, podemos ejecutar docker dun --rm para eliminarlo automáticamente cuando acabe.

Ejecutar y eliminar

docker run --rm nombre_imagen
Eliminar todos los contenedores en estado exit

Podemos ubicar contenedores usando docker ps -a y filtrarlos por su estado: creado, reiniciando, en ejecución, en pausa o salido, esto es «exit». Para revisar la lista de contenedores en estado «exit», usamos el parámetro -f para filtrar según el estado. Cuando hayamos verificado que deseamos eliminar esos contenedores, usamos -q para pasar los ID al comando docker rm.

Listarlos:

sudo docker ps -a -f status=exited

Eliminarlos:

sudo docker rm $(docker ps -a -f status=exited -q)
Elininar contenedores utilizando más de un filtro

Los filtros de Docker se pueden combinar repitiendo la marca de filtro con un valor adicional. Esto da como resultado una lista de contenedores que cumplen con cualquiera de las condiciones. Por ejemplo, si deseamos eliminar todos los contenedores marcados como Creado, esto es «created» (un estado que puede resultar cuando ejecutamos un contenedor con un comando no válido) o Salido, esto es «exited2, podemos usar dos filtros:

Listamos:

sudo docker ps -a -f status=exited -f status=created

Eliminamos:

docker rm $(docker ps -a -f status=exited -f status=created -q)
Eliminar contenedores que coinciden con un patrón

Podemos encontrar todos los contenedores que coincidan con un patrón utilizando una combinación de docker ps y grep. Cuando tenemos la lista de los contenedores que queremos eliminar, podemos utilizar awk y xargs para proporcionar el ID a docker rm. Hay que tener en cuenta que Docker no proporciona estas utilidades y no están necesariamente disponibles en todos los sistemas:

Listamos:

#Utilizamos el parámetro -i para que ignore mayúsculas y minúsculas
sudo docker ps -a |  grep -i "patrón"

Eliminamos:

docker rm $(docker ps -a | grep "patrón" | awk '{print $1}')
#O
docker ps -a | grep "patrón" | awk '{print $1}' | xargs docker rm
Parar y eliminar todos los contenedores

Podemos revisar los contenedores en nuestro sistema con docker ps. Agregando el parámetro -a mostrará todos los contenedores. Cuando estemos seguro de que deseamos eliminarlos, podemos agregar la marca -q para proporcionar los ID a los comandos docker stop y docker rm:

Listamos:

sudo docker ps -a

Paramos y eliminamos:

sudo docker stop $(docker ps -a -q)
sudo docker rm $(docker ps -a -q)

Eliminar volúmenes en Docker

Eliminar uno o más volúmenes en docker

Debemos usar el comando docker volume ls para ubicar el nombre o los nombres del volumen que deseamos eliminar. Más tarde podemos eliminar uno o más volúmenes con el comando docker volume rm:

Para listarlos:

sudo docker volume ls

Para eliminarlos:

sudo docker volume rm nombre_volumen nombre_volumen
Eliminar volúmenes colgados

Dado que el objetivo de los volúmenes es existir independientemente de los contenedores, cuando se retira un contenedor, un volumen no se elimina automáticamente al mismo tiempo. Cuando existe un volumen y ya no está conectado a ningún contenedor, se denomina volumen colgado. Para ubicarlos y confirmar que deseamos eliminarlos, podemos utilizar el comando docker volume ls con un filtro para limitar los resultados a volúmenes colgantes. Cuando lo creamos conveniente, podemos eliminarlos todos.

Para listarlos:

sudo docker volume ls -f dangling=true

Para eliminarlos:

docker volume prune
Eliminar un contenedor y sus volúmenes

Si hemos creado un volumen sin nombre, podemos eliminarlo al mismo tiempo que el contenedor con el parámetro -v. Hemos de tener en cuenta que esto solo funciona con volúmenes sin nombre. Cuando el contenedor se retira con éxito, se muestra su ID. Por lo que hemos de tener en cuenta también que no se hace ninguna referencia a la eliminación del volumen. Si no tiene nombre, se elimina silenciosamente del sistema. Si recibe un nombre, permanece presente.

Eliminamos:

sudo docker rm -v nombre_contenedor

Conclusiones

Hemos visto las principales formas de eliminar imágenes, contenedores y volúmenes en entornos que utilicen microservicios con Docker. Espero que esta entrada os sea de utilidad en algún momento.

Para saber más

En el portal del proyecto Colaboratorio.net escribí una serie de entradas introductorias a esta tecnología:

Docker una guía no convencional

O bien este libro que os recomiendo, además si utilizáis este enlace al portal de Amazon podéis contribuir con este proyecto:

Enlace al producto: DOCKER. Guía práctica