Cómo usar el comando docker container prune para eliminar contenedores detenidos

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ás a gestionar eficazmente tu entorno Docker eliminando contenedores detenidos mediante el comando docker container prune. Comenzaremos creando y deteniendo varios contenedores para simular un escenario real. Luego, explorarás diferentes formas de limpiar estos contenedores detenidos, incluyendo la eliminación de todos ellos, la eliminación de los creados antes de un tiempo específico y la eliminación selectiva basada en etiquetas (labels). Esta experiencia práctica te proporcionará las habilidades necesarias para mantener tu sistema Docker limpio y optimizado.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/SystemManagementGroup(["System Management"]) docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/stop("Stop Container") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/SystemManagementGroup -.-> docker/prune("Remove Unused Docker Objects") subgraph Lab Skills docker/run -.-> lab-555117{{"Cómo usar el comando docker container prune para eliminar contenedores detenidos"}} docker/ps -.-> lab-555117{{"Cómo usar el comando docker container prune para eliminar contenedores detenidos"}} docker/stop -.-> lab-555117{{"Cómo usar el comando docker container prune para eliminar contenedores detenidos"}} docker/rm -.-> lab-555117{{"Cómo usar el comando docker container prune para eliminar contenedores detenidos"}} docker/pull -.-> lab-555117{{"Cómo usar el comando docker container prune para eliminar contenedores detenidos"}} docker/prune -.-> lab-555117{{"Cómo usar el comando docker container prune para eliminar contenedores detenidos"}} end

Crear y detener algunos contenedores

En este paso, aprenderemos cómo crear y detener contenedores Docker. Los contenedores Docker son unidades ligeras, portátiles y autosuficientes que contienen todo lo necesario para ejecutar una aplicación.

Primero, descarguemos una imagen de Docker que usaremos para crear contenedores. Utilizaremos la imagen ubuntu, que es un sistema operativo Ubuntu mínimo.

docker pull ubuntu

Deberías ver una salida que indica que la imagen se está descargando.

Using default tag: latest
latest: Pulling from library/ubuntu
...
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

Ahora que tenemos la imagen, creemos y ejecutemos un contenedor a partir de ella. Usaremos el comando docker run. La bandera -d ejecuta el contenedor en modo desatendido (en segundo plano), y la bandera --name asigna un nombre al contenedor.

docker run -d --name my-ubuntu-container ubuntu sleep infinity

Este comando crea un contenedor llamado my-ubuntu-container a partir de la imagen ubuntu y ejecuta el comando sleep infinity dentro de él. El comando sleep infinity mantiene el contenedor ejecutándose indefinidamente.

Deberías ver una cadena larga de caracteres como salida, que es el ID del contenedor.

<container_id>

Para verificar que el contenedor está en ejecución, podemos usar el comando docker ps.

docker ps

Este comando lista todos los contenedores en ejecución. Deberías ver tu my-ubuntu-container en la lista.

CONTAINER ID   IMAGE          COMMAND            CREATED         STATUS         PORTS     NAMES
<container_id>   ubuntu         "sleep infinity"   X seconds ago   Up X seconds             my-ubuntu-container

Ahora, creemos otro contenedor, pero esta vez no le asignaremos un nombre específico. Docker generará automáticamente un nombre para él.

docker run -d ubuntu sleep infinity

Nuevamente, verás el ID del contenedor como salida.

<container_id>

Ejecuta docker ps nuevamente para ver ambos contenedores en ejecución.

docker ps

Ahora deberías ver dos contenedores listados.

CONTAINER ID   IMAGE          COMMAND            CREATED         STATUS         PORTS     NAMES
<container_id>   ubuntu         "sleep infinity"   X seconds ago   Up X seconds             my-ubuntu-container
<container_id>   ubuntu         "sleep infinity"   X seconds ago   Up X seconds             <random_name>

Ahora, detengamos el contenedor llamado my-ubuntu-container. Podemos usar el comando docker stop seguido del nombre o ID del contenedor.

docker stop my-ubuntu-container

Deberías ver el nombre del contenedor como salida, indicando que se ha detenido.

my-ubuntu-container

Ejecuta docker ps nuevamente. Verás que my-ubuntu-container ya no aparece en la lista, ya que docker ps solo muestra contenedores en ejecución.

docker ps

Para ver todos los contenedores, incluidos los detenidos, usa el comando docker ps -a.

docker ps -a

Ahora deberías ver ambos contenedores, con my-ubuntu-container mostrando un estado de Exited.

CONTAINER ID   IMAGE          COMMAND            CREATED         STATUS                      PORTS     NAMES
<container_id>   ubuntu         "sleep infinity"   X minutes ago   Exited (0) X seconds ago              my-ubuntu-container
<container_id>   ubuntu         "sleep infinity"   X minutes ago   Up X minutes                          <random_name>

Finalmente, detengamos el segundo contenedor usando su ID. Puedes obtener el ID de la salida de docker ps -a. Reemplaza <container_id> con el ID real del segundo contenedor.

docker stop <container_id>

Deberías ver el ID del contenedor como salida.

<container_id>

Ejecuta docker ps -a una última vez para confirmar que ambos contenedores están detenidos.

docker ps -a

Ambos contenedores deberían mostrar ahora un estado de Exited.

CONTAINER ID   IMAGE          COMMAND            CREATED         STATUS                      PORTS     NAMES
<container_id>   ubuntu         "sleep infinity"   X minutes ago   Exited (0) X seconds ago              my-ubuntu-container
<container_id>   ubuntu         "sleep infinity"   X minutes ago   Exited (0) X seconds ago              <random_name>

Eliminar todos los contenedores detenidos

En el paso anterior, creamos y detuvimos dos contenedores. Los contenedores detenidos siguen consumiendo espacio en disco y recursos. En este paso, aprenderemos cómo eliminar todos los contenedores detenidos usando el comando docker container prune.

Primero, listemos todos los contenedores, incluyendo los detenidos, para ver los contenedores que eliminaremos.

docker ps -a

Deberías ver los dos contenedores que detuvimos en el paso anterior.

CONTAINER ID   IMAGE          COMMAND            CREATED         STATUS                      PORTS     NAMES
<container_id>   ubuntu         "sleep infinity"   X minutes ago   Exited (0) X minutes ago              my-ubuntu-container
<container_id>   ubuntu         "sleep infinity"   X minutes ago   Exited (0) X minutes ago              <random_name>

Ahora, eliminemos todos los contenedores detenidos. El comando docker container prune remueve todos los contenedores detenidos.

docker container prune

Docker pedirá confirmación antes de eliminar los contenedores. Escribe y y presiona Enter para continuar.

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

Deberías ver una salida que indica los contenedores eliminados y el espacio total recuperado.

Deleted Containers:
<container_id>
<container_id>

Total reclaimed space: XMB

Para verificar que los contenedores detenidos han sido eliminados, lista todos los contenedores nuevamente.

docker ps -a

Esta vez, no deberías ver ninguna salida, lo que indica que no quedan contenedores (ni en ejecución ni detenidos).

CONTAINER ID   IMAGE          COMMAND            CREATED         STATUS         PORTS     NAMES

Eliminar contenedores detenidos creados antes de un tiempo específico

En el paso anterior, aprendimos cómo eliminar todos los contenedores detenidos. A veces, es posible que desees eliminar solo los contenedores detenidos que se crearon antes de un momento determinado. Esto puede ser útil para limpiar contenedores antiguos mientras se mantienen los más recientes. En este paso, aprenderemos cómo eliminar contenedores detenidos creados antes de un tiempo específico usando el flag --filter con el filtro until.

Primero, creemos algunos contenedores y detengámoslos para tener algo que eliminar.

docker run -d --name container-old-1 ubuntu sleep infinity
docker run -d --name container-old-2 ubuntu sleep infinity

Espera unos segundos, luego crea otro contenedor. Este será nuestro contenedor "más nuevo".

sleep 5
docker run -d --name container-new-1 ubuntu sleep infinity

Ahora, detengamos todos los contenedores.

docker stop container-old-1 container-old-2 container-new-1

Lista todos los contenedores para ver su estado y hora de creación.

docker ps -a --format "{{.Names}}\t{{.Status}}\t{{.CreatedAt}}"

Deberías ver una salida similar a esta, con diferentes horas de creación:

container-old-1	Exited (0) X seconds ago	YYYY-MM-DD HH:MM:SS +0000 UTC
container-old-2	Exited (0) X seconds ago	YYYY-MM-DD HH:MM:SS +0000 UTC
container-new-1	Exited (0) X seconds ago	YYYY-MM-DD HH:MM:SS +0000 UTC

Ahora, eliminemos los contenedores detenidos que se crearon antes de un tiempo específico. Usaremos el filtro until con el comando docker container prune. El filtro until acepta una marca de tiempo o una duración. Para este ejemplo, usaremos una duración, especificando que queremos eliminar contenedores creados hace más de 10 segundos.

docker container prune --filter "until=10s"

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

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

Deberías ver una salida que indica que los contenedores más antiguos fueron eliminados. El contenedor más nuevo no debería aparecer como eliminado.

Deleted Containers:
<container_id_old_1>
<container_id_old_2>

Total reclaimed space: XMB

Para verificar que solo se eliminaron los contenedores más antiguos, lista todos los contenedores nuevamente.

docker ps -a --format "{{.Names}}\t{{.Status}}"

Solo deberías ver el container-new-1 listado con estado Exited.

container-new-1	Exited (0) X seconds ago

Eliminar contenedores detenidos con una etiqueta específica

En los pasos anteriores, aprendimos cómo eliminar todos los contenedores detenidos y contenedores detenidos según su tiempo de creación. En este paso, exploraremos otra forma útil de filtrar contenedores para su eliminación: usando etiquetas (labels). Las etiquetas son pares clave-valor que puedes adjuntar a objetos Docker, incluyendo contenedores, para organizarlos y gestionarlos.

Primero, creemos algunos contenedores con diferentes etiquetas.

docker run -d --name container-label-app --label app=frontend ubuntu sleep infinity
docker run -d --name container-label-env --label env=development ubuntu sleep infinity
docker run -d --name container-no-label ubuntu sleep infinity

Ahora, detengamos todos los contenedores.

docker stop container-label-app container-label-env container-no-label

Listemos todos los contenedores y sus etiquetas para ver las que hemos aplicado.

docker ps -a --format "{{.Names}}\t{{.Labels}}"

Deberías ver una salida similar a esta:

container-label-app	app=frontend
container-label-env	env=development
container-no-label

Ahora, eliminemos solo los contenedores detenidos que tienen la etiqueta app=frontend. Usaremos el flag --filter con el filtro label.

docker container prune --filter "label=app=frontend"

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

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

Deberías ver una salida indicando que el contenedor con la etiqueta app=frontend fue eliminado.

Deleted Containers:
<container_id_app_frontend>

Total reclaimed space: XMB

Para verificar que solo se eliminó el contenedor con la etiqueta app=frontend, lista todos los contenedores nuevamente.

docker ps -a --format "{{.Names}}\t{{.Labels}}"

Ahora solo deberías ver los contenedores con la etiqueta env=development y sin etiqueta.

container-label-env	env=development
container-no-label

También puedes eliminar contenedores que no tengan una etiqueta específica usando el prefijo ! con el filtro de etiqueta. Eliminemos el contenedor que no tiene la etiqueta env=development.

docker container prune --filter "label!=env=development"

Confirma la eliminación escribiendo y y presionando Enter.

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

Deberías ver una salida indicando que el contenedor sin la etiqueta env=development fue eliminado.

Deleted Containers:
<container_id_no_label>

Total reclaimed space: XMB

Lista todos los contenedores una última vez para confirmar que solo queda el contenedor con la etiqueta env=development.

docker ps -a --format "{{.Names}}\t{{.Labels}}"

Solo deberías ver el container-label-env listado.

container-label-env	env=development

Resumen

En este laboratorio, aprendimos cómo crear y detener contenedores Docker utilizando los comandos docker run y docker stop, y cómo listar contenedores en ejecución con docker ps. Luego exploramos el comando docker container prune para eliminar eficientemente contenedores detenidos. Específicamente, practicamos:

  1. Eliminar todos los contenedores detenidos
  2. Remover contenedores detenidos creados antes de un tiempo específico usando la opción --filter until
  3. Eliminar selectivamente contenedores detenidos basados en etiquetas usando la opción --filter label

Estos pasos demostraron métodos prácticos para gestionar y limpiar contenedores detenidos en un entorno Docker.