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