Cómo usar el comando docker image prune para eliminar imágenes no utilizadas

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 el espacio en disco eliminando imágenes de Docker no utilizadas mediante el comando docker image prune. Comenzaremos por entender el propósito de este comando y los diferentes tipos de imágenes no utilizadas que aborda, específicamente las imágenes huérfanas (dangling images) y todas las imágenes no utilizadas.

A través de ejercicios prácticos, practicarás la eliminación de imágenes huérfanas y luego extenderás esto para eliminar todas las imágenes no utilizadas. Además, explorarás cómo utilizar opciones de filtrado con docker image prune para eliminar selectivamente imágenes según criterios como la fecha de creación y las etiquetas (labels), lo que te brindará un control detallado sobre el proceso de limpieza de imágenes.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/SystemManagementGroup(["System Management"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/ImageOperationsGroup -.-> docker/rmi("Remove Image") docker/ImageOperationsGroup -.-> docker/images("List Images") docker/SystemManagementGroup -.-> docker/prune("Remove Unused Docker Objects") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/pull -.-> lab-555158{{"Cómo usar el comando docker image prune para eliminar imágenes no utilizadas"}} docker/rmi -.-> lab-555158{{"Cómo usar el comando docker image prune para eliminar imágenes no utilizadas"}} docker/images -.-> lab-555158{{"Cómo usar el comando docker image prune para eliminar imágenes no utilizadas"}} docker/prune -.-> lab-555158{{"Cómo usar el comando docker image prune para eliminar imágenes no utilizadas"}} docker/build -.-> lab-555158{{"Cómo usar el comando docker image prune para eliminar imágenes no utilizadas"}} end

Comprender el propósito de docker image prune

En este paso, comprenderemos el propósito del comando docker image prune. A medida que trabajes con Docker, inevitablemente acumularás imágenes no utilizadas en tu sistema. Estas imágenes pueden ocupar una cantidad significativa de espacio en disco. El comando docker image prune se utiliza para eliminar estas imágenes no utilizadas, ayudándote a liberar espacio en disco.

Hay dos tipos principales de imágenes no utilizadas que aborda docker image prune:

  1. Imágenes huérfanas (Dangling images): Son imágenes que no tienen etiqueta (tag) y no son referenciadas por ningún contenedor. En esencia, son capas intermedias que ya no son necesarias.
  2. Todas las imágenes no utilizadas: Esto incluye las imágenes huérfanas, así como imágenes que no son referenciadas por ningún contenedor, incluso si tienen una etiqueta (tag).

Comencemos por crear algunas imágenes huérfanas para ver cómo funciona docker image prune. Descargaremos (pull) algunas versiones diferentes de la imagen ubuntu y luego construiremos una nueva imagen basada en una de ellas. Este proceso a menudo deja atrás imágenes huérfanas.

Primero, descarga las imágenes ubuntu:latest y ubuntu:18.04.

docker pull ubuntu:latest
docker pull ubuntu:18.04

Deberías ver una salida que indique que las imágenes se están descargando.

Ahora, construyamos una imagen simple basada en ubuntu:latest. Crea un archivo llamado Dockerfile en tu directorio ~/project con el siguiente contenido:

FROM ubuntu:latest
RUN echo "Hello, Docker!" >/app/hello.txt

Este Dockerfile simplemente comienza con la imagen ubuntu:latest y agrega un archivo llamado hello.txt al directorio /app.

Ahora, construye la imagen utilizando el comando docker build. No le pondremos etiqueta (tag) a esta imagen, lo que ayudará a crear una imagen huérfana.

docker build -t my-ubuntu-app ~/project

Deberías ver una salida que indique el proceso de construcción. Después de que la construcción se complete, listemos todas las imágenes, incluyendo las intermedias, para ver si tenemos alguna imagen huérfana.

docker images -a

Busca imágenes con <none> en las columnas REPOSITORY y TAG. Estas son imágenes huérfanas.

El comando docker image prune está diseñado para eliminar estas imágenes huérfanas por defecto. En el siguiente paso, usaremos este comando para limpiar las imágenes huérfanas que acabamos de crear.

Eliminar imágenes huérfanas (dangling images) utilizando docker image prune

En el paso anterior, creamos algunas imágenes huérfanas construyendo una imagen sin una etiqueta (tag) específica. En este paso, utilizaremos el comando docker image prune para eliminar estas imágenes huérfanas.

Por defecto, docker image prune solo elimina las imágenes huérfanas. Esta es la forma más segura de limpiar las capas de imágenes no utilizadas sin eliminar accidentalmente imágenes que aún puedas necesitar, incluso si actualmente no están asociadas con un contenedor en ejecución.

Para eliminar las imágenes huérfanas, simplemente ejecuta el comando docker image prune:

docker image prune

Cuando ejecutes este comando, Docker mostrará una lista de las imágenes huérfanas que eliminará y solicitará confirmación.

WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N]

Escribe y y presiona Enter para continuar con la eliminación.

Después de que el comando finalice, informará la cantidad total de espacio recuperado.

Ahora, listemos todas las imágenes nuevamente, incluyendo las intermedias, para confirmar que las imágenes huérfanas se han eliminado.

docker images -a

Ya no deberías ver imágenes con <none> en las columnas REPOSITORY y TAG que estaban presentes antes de ejecutar docker image prune. Las imágenes ubuntu:latest, ubuntu:18.04 y my-ubuntu-app deberían seguir estando presentes, ya que no son huérfanas.

Esto demuestra el uso básico de docker image prune para eliminar imágenes huérfanas. Esta es una buena práctica que se debe realizar periódicamente para liberar espacio en disco en tu host de Docker.

Eliminar todas las imágenes no utilizadas utilizando docker image prune -a

En el paso anterior, aprendimos cómo eliminar imágenes huérfanas (dangling images) utilizando docker image prune. Si bien eliminar las imágenes huérfanas es útil, es posible que haya otras imágenes en tu sistema que no estén siendo utilizadas actualmente por ningún contenedor, pero que no sean huérfanas (es decir, tienen una etiqueta o tag). Para eliminar también estas imágenes, puedes utilizar la bandera -a (o --all) con docker image prune.

El comando docker image prune -a elimina todas las imágenes no utilizadas, no solo las huérfanas. Esta es una limpieza más agresiva y se debe utilizar con precaución, ya que eliminará cualquier imagen que no esté actualmente asociada con un contenedor en ejecución.

Veamos cómo funciona esto. Primero, listemos las imágenes que actualmente tenemos.

docker images

Deberías ver ubuntu:latest, ubuntu:18.04 y my-ubuntu-app. Estas imágenes no están siendo utilizadas actualmente por ningún contenedor en ejecución, pero no son huérfanas porque tienen etiquetas (tags).

Ahora, ejecuta el comando docker image prune -a:

docker image prune -a

Similar al paso anterior, Docker mostrará una lista de las imágenes que eliminará y solicitará confirmación.

WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N]

Escribe y y presiona Enter para continuar.

Después de que el comando finalice, informará la cantidad total de espacio recuperado.

Ahora, lista las imágenes nuevamente para ver cuáles quedan.

docker images

Deberías ver que se han eliminado todas las imágenes que no estaban asociadas con un contenedor en ejecución. Si tuvieras algún contenedor en ejecución, las imágenes utilizadas por esos contenedores no se eliminarían.

Utilizar docker image prune -a es una forma poderosa de liberar una cantidad significativa de espacio en disco, pero recuerda que elimina todas las imágenes que no se están utilizando actualmente.

Filtrar imágenes para eliminar según la fecha de creación

Además de eliminar todas las imágenes no utilizadas, docker image prune te permite filtrar qué imágenes se consideran para la eliminación (pruning) basándote en varios criterios. Un filtro útil se basa en la fecha de creación de la imagen. Esto te permite eliminar imágenes que se crearon antes de un momento específico.

La bandera --filter se utiliza para aplicar filtros. Para filtrar por fecha de creación, se utiliza el filtro until. El filtro until toma una marca de tiempo (timestamp) o una duración como valor. Las imágenes creadas después del tiempo especificado se conservarán, mientras que aquellas creadas antes o en el tiempo especificado se considerarán para la eliminación.

Primero, descarguemos algunas imágenes con diferentes fechas de creación. Descargaremos alpine:latest y centos:latest.

docker pull alpine:latest
docker pull centos:latest

Ahora, listemos las imágenes y observemos sus fechas de creación.

docker images

Observa la columna CREATED de cada imagen.

Para demostrar el filtrado por tiempo, necesitamos un punto de referencia. Digamos que queremos eliminar las imágenes creadas hace más de 5 minutos. Podemos especificar el filtro until con una duración como 5m.

docker image prune -a --filter "until=5m"

Este comando considerará la eliminación de todas las imágenes no utilizadas que se crearon hace más de 5 minutos. Docker solicitará confirmación antes de continuar.

WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N]

Escribe y y presiona Enter para confirmar.

Después de la eliminación, lista las imágenes nuevamente:

docker images

Dependiendo de cuánto tiempo ha pasado desde que descargaste las imágenes y ejecutaste el comando de eliminación, es posible que se hayan eliminado algunas imágenes. Las imágenes creadas en los últimos 5 minutos deberían permanecer.

También puedes especificar una marca de tiempo específica en varios formatos. Por ejemplo, para eliminar las imágenes creadas antes de una fecha y hora específicas, podrías utilizar un formato como "2023-10-27T10:00:00".

Filtrar por fecha de creación es útil para automatizar tareas de limpieza, asegurando que solo se mantengan en tu sistema las imágenes relativamente recientes.

Filtrar imágenes para eliminar según etiquetas (labels)

En este último paso, exploraremos otra poderosa opción de filtrado para docker image prune: filtrar según etiquetas (labels). Las etiquetas son pares clave-valor que puedes adjuntar a objetos de Docker, incluyendo imágenes, para agregar metadatos. Luego, puedes utilizar estas etiquetas para filtrar y gestionar tus recursos de Docker.

La bandera --filter con la clave label te permite especificar qué imágenes incluir o excluir del proceso de eliminación (pruning) según sus etiquetas.

Primero, creemos un par de imágenes con diferentes etiquetas. Utilizaremos un simple Dockerfile y construiremos dos imágenes con diferentes etiquetas.

Crea un archivo llamado Dockerfile.labeled en tu directorio ~/project con el siguiente contenido:

FROM alpine:latest
LABEL environment="development"
LABEL version="1.0"
RUN echo "This is a labeled image" >/app/info.txt

Ahora, construye dos imágenes a partir de este Dockerfile, aplicando diferentes etiquetas durante el proceso de construcción utilizando la bandera --label.

docker build -t my-labeled-app:dev --label project=myapp --label stage=dev ~/project -f Dockerfile.labeled
docker build -t my-labeled-app:prod --label project=myapp --label stage=prod ~/project -f Dockerfile.labeled

Ahora hemos construido dos imágenes, my-labeled-app:dev y my-labeled-app:prod, ambas basadas en el mismo Dockerfile pero con diferentes etiquetas stage.

Listemos las imágenes e inspeccionemos sus etiquetas.

docker images --filter reference="my-labeled-app*" --format "{{.Repository}}:{{.Tag}} {{.Labels}}"

Deberías ver una salida que muestra las imágenes y sus etiquetas asociadas.

Ahora, usemos docker image prune para eliminar imágenes según sus etiquetas. Supongamos que queremos eliminar todas las imágenes no utilizadas que tienen la etiqueta stage=dev. Podemos usar la bandera --filter con label=stage=dev. También usaremos la bandera -a para considerar todas las imágenes no utilizadas, no solo las huérfanas (dangling).

docker image prune -a --filter "label=stage=dev"

Docker mostrará las imágenes que coinciden con el filtro y se eliminarán. Confirma escribiendo y.

Después de la eliminación, lista las imágenes nuevamente:

docker images --filter reference="my-labeled-app*" --format "{{.Repository}}:{{.Tag}} {{.Labels}}"

Deberías ver que la imagen my-labeled-app:dev se ha eliminado, mientras que my-labeled-app:prod permanece porque no coincidió con el filtro.

También puedes usar la sintaxis label!=key=value para eliminar imágenes que no tienen una etiqueta o valor de etiqueta específico. Por ejemplo, para eliminar todas las imágenes no utilizadas que no tienen la etiqueta stage=prod:

docker image prune -a --filter "label!=stage=prod"

Este comando eliminaría my-labeled-app:dev (si aún existiera) y cualquier otra imagen no utilizada que no tenga la etiqueta stage=prod.

Filtrar por etiquetas proporciona una forma flexible de gestionar y limpiar tus imágenes según tus propios metadatos definidos.

Resumen

En este laboratorio, aprendimos cómo usar el comando docker image prune para gestionar el espacio en disco eliminando imágenes de Docker no utilizadas. Comenzamos por entender el propósito del comando y los tipos de imágenes no utilizadas que aborda: imágenes huérfanas (sin etiqueta y no referenciadas) y todas las imágenes no utilizadas (incluidas las etiquetadas pero no referenciadas). Luego, practicamos la identificación y eliminación de imágenes huérfanas utilizando el comando básico docker image prune.

Exploramos aún más las capacidades de docker image prune al aprender cómo eliminar todas las imágenes no utilizadas utilizando la bandera -a. Finalmente, descubrimos cómo usar opciones de filtrado para eliminar selectivamente imágenes según criterios como la fecha de creación y las etiquetas (labels), lo que proporciona un control más detallado sobre la limpieza de imágenes.