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.
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:
- Eliminar todos los contenedores detenidos
- Remover contenedores detenidos creados antes de un tiempo específico usando la opción
--filter until - 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.



