Cómo usar el comando docker compose rm 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 utilizar el comando docker compose rm para eliminar contenedores detenidos. Comenzaremos preparando un proyecto simple de Docker Compose, que implica instalar Docker Compose y crear un archivo docker-compose.yml para definir un servicio web básico.

Después de configurar el proyecto, practicarás deteniendo los contenedores del servicio. El núcleo del laboratorio se centra en usar docker compose rm para eliminar estos contenedores detenidos, cubriendo escenarios sin volúmenes, con volúmenes anónimos y, finalmente, demostrando cómo forzar la eliminación de contenedores.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/VolumeOperationsGroup(["Volume Operations"]) docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) 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/VolumeOperationsGroup -.-> docker/volume("Manage Volumes") subgraph Lab Skills docker/ps -.-> lab-555090{{"Cómo usar el comando docker compose rm para eliminar contenedores detenidos"}} docker/stop -.-> lab-555090{{"Cómo usar el comando docker compose rm para eliminar contenedores detenidos"}} docker/rm -.-> lab-555090{{"Cómo usar el comando docker compose rm para eliminar contenedores detenidos"}} docker/pull -.-> lab-555090{{"Cómo usar el comando docker compose rm para eliminar contenedores detenidos"}} docker/volume -.-> lab-555090{{"Cómo usar el comando docker compose rm para eliminar contenedores detenidos"}} end

Preparar un proyecto simple de Docker Compose

En este paso, prepararemos un proyecto simple de Docker Compose. Como Docker Compose no viene preinstalado en el entorno de LabEx, primero lo instalaremos. Docker Compose es una herramienta para definir y ejecutar aplicaciones multi-contenedor de Docker. Con Compose, usas un archivo YAML para configurar los servicios de tu aplicación. Luego, con un solo comando, creas e inicias todos los servicios desde tu configuración.

Primero, instalemos Docker Compose. Descargaremos la última versión estable y la haremos ejecutable.

sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

Después de la instalación, verifícala comprobando la versión.

docker-compose --version

Deberías ver el número de versión en la salida, lo que confirma que Docker Compose está instalado correctamente.

Ahora, creemos un proyecto simple de Docker Compose. Crearemos un directorio para nuestro proyecto y luego un archivo docker-compose.yml dentro. Este archivo definirá un servicio web simple usando la imagen nginx.

Navega al directorio del proyecto.

cd ~/project

Crea un nuevo directorio para nuestro proyecto, por ejemplo, my-web-app.

mkdir my-web-app
cd my-web-app

Ahora, crea el archivo docker-compose.yml usando el editor nano.

nano docker-compose.yml

Añade el siguiente contenido al archivo docker-compose.yml:

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"

Este archivo docker-compose.yml define un servicio llamado web. Este servicio usa la imagen Docker nginx:latest y mapea el puerto 80 del host al puerto 80 del contenedor.

Guarda el archivo presionando Ctrl + X, luego Y, y Enter.

Ahora, podemos iniciar los servicios definidos en el archivo docker-compose.yml usando el comando docker-compose up. La bandera -d ejecuta los contenedores en modo detached, lo que significa que correrán en segundo plano.

docker-compose up -d

Este comando descargará la imagen nginx:latest (si no está presente) e iniciará un contenedor para el servicio web.

Puedes verificar el estado de los contenedores en ejecución con el comando docker ps.

docker ps

Deberías ver un contenedor llamado my-web-app_web_1 (o similar, dependiendo del nombre del directorio) en ejecución y redirigiendo el puerto 80.

Para verificar que el servidor web está funcionando, puedes usar curl para acceder a él.

curl http://localhost

Deberías ver el HTML de la página de bienvenida predeterminada de Nginx en la salida. Esto confirma que nuestro proyecto simple de Docker Compose está configurado y funcionando correctamente.

Detener los contenedores del servicio

En el paso anterior, iniciamos nuestro servicio web simple usando docker-compose up -d. El contenedor ahora se está ejecutando en segundo plano. En este paso, aprenderemos cómo detener los contenedores de servicio en ejecución usando Docker Compose.

Para detener los contenedores en ejecución definidos en el archivo docker-compose.yml, usamos el comando docker-compose stop. Este comando enviará una señal SIGTERM a los contenedores, permitiéndoles apagarse correctamente.

Asegúrate de estar en el directorio ~/project/my-web-app donde se encuentra tu archivo docker-compose.yml.

cd ~/project/my-web-app

Ahora, ejecuta el comando docker-compose stop.

docker-compose stop

Verás una salida que indica que el contenedor se está deteniendo.

Después de ejecutar el comando stop, los contenedores se detendrán pero no se eliminarán. Puedes verificar esto listando todos los contenedores, incluidos los detenidos, usando el comando docker ps -a.

docker ps -a

Deberías ver el contenedor my-web-app_web_1 listado con un estado de Exited. Esto confirma que el contenedor se ha detenido correctamente.

Si intentas acceder al servidor web usando curl nuevamente, debería fallar porque el contenedor está detenido.

curl http://localhost

Deberías ver un error de conexión rechazada, lo que indica que el servicio web ya no se está ejecutando.

Detener contenedores es útil cuando necesitas detener temporalmente tus servicios sin eliminar su configuración o datos. En los siguientes pasos, exploraremos cómo eliminar estos contenedores detenidos.

Eliminar contenedores de servicio detenidos sin volúmenes

En el paso anterior, detuvimos el contenedor en ejecución usando docker-compose stop. El contenedor ahora está en estado Exited. En este paso, aprenderemos cómo eliminar estos contenedores detenidos usando Docker Compose.

Para eliminar los contenedores detenidos definidos en el archivo docker-compose.yml, usamos el comando docker-compose rm. Por defecto, este comando solo elimina los contenedores de servicio detenidos. No elimina volúmenes ni redes.

Asegúrate de estar en el directorio ~/project/my-web-app donde se encuentra tu archivo docker-compose.yml.

cd ~/project/my-web-app

Ahora, ejecuta el comando docker-compose rm. Se te pedirá que confirmes la eliminación. Escribe y y presiona Enter.

docker-compose rm

Verás una salida que indica que el contenedor está siendo eliminado.

Después de ejecutar el comando rm, el contenedor debería eliminarse. Puedes verificar esto listando todos los contenedores, incluidos los detenidos, usando el comando docker ps -a.

docker ps -a

Ya no deberías ver el contenedor my-web-app_web_1 en la lista. Esto confirma que el contenedor se ha eliminado correctamente.

Eliminar contenedores detenidos ayuda a limpiar tu sistema y liberar recursos. En los siguientes pasos, exploraremos cómo manejar volúmenes al eliminar contenedores.

Eliminar contenedores de servicio detenidos con volúmenes anónimos

En el paso anterior, eliminamos el contenedor detenido. Ahora, exploremos cómo eliminar contenedores junto con sus volúmenes anónimos asociados. Los volúmenes anónimos son aquellos que no tienen un nombre explícito en el archivo docker-compose.yml. Docker les asigna automáticamente un nombre aleatorio.

Primero, modifiquemos nuestro archivo docker-compose.yml para incluir un volumen anónimo. Añadiremos un volumen al servicio web.

Asegúrate de estar en el directorio ~/project/my-web-app.

cd ~/project/my-web-app

Edita el archivo docker-compose.yml.

nano docker-compose.yml

Añade la sección volumes a la definición del servicio web. Montaremos un volumen anónimo en /usr/share/nginx/html dentro del contenedor. Este es el directorio donde Nginx sirve su contenido por defecto.

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - /usr/share/nginx/html

Guarda el archivo presionando Ctrl + X, luego Y, y Enter.

Ahora, iniciemos el servicio nuevamente. Esto creará un nuevo contenedor y un volumen anónimo.

docker-compose up -d

Puedes listar los volúmenes creados por Docker usando el comando docker volume ls. Deberías ver un volumen con un nombre largo generado aleatoriamente asociado a tu proyecto.

docker volume ls

Ahora, detén los contenedores del servicio nuevamente.

docker-compose stop

Verifica que el contenedor esté detenido usando docker ps -a.

docker ps -a

Deberías ver el contenedor my-web-app_web_1 en estado Exited.

Para eliminar los contenedores detenidos y sus volúmenes anónimos asociados, usamos el comando docker-compose rm con la bandera -v.

docker-compose rm -v

Se te pedirá confirmar la eliminación. Escribe y y presiona Enter.

Después de ejecutar el comando, verifica que el contenedor haya sido eliminado usando docker ps -a.

docker ps -a

El contenedor my-web-app_web_1 ya no debería aparecer en la lista.

Ahora, revisa los volúmenes nuevamente con docker volume ls.

docker volume ls

El volumen anónimo creado para el servicio web también debería haberse eliminado. Esto demuestra cómo la bandera -v elimina los volúmenes anónimos junto con los contenedores.

Forzar la eliminación de contenedores de servicio detenidos

En los pasos anteriores, detuvimos y eliminamos contenedores. En ocasiones, puede ser necesario eliminar contenedores incluso cuando aún están en ejecución. Aquí es donde resulta útil la opción de eliminación forzada.

Primero, volvamos a iniciar nuestro servicio.

Asegúrate de estar en el directorio ~/project/my-web-app.

cd ~/project/my-web-app

Inicia el servicio en modo desatendido.

docker-compose up -d

Verifica que el contenedor esté en ejecución usando docker ps.

docker ps

Deberías ver el contenedor my-web-app_web_1 listado con estado Up.

Ahora, intentemos eliminar el contenedor en ejecución sin detenerlo primero. Si intentas usar docker-compose rm en un contenedor en ejecución, fallará.

docker-compose rm

Verás un mensaje de error indicando que el contenedor está en ejecución y no puede eliminarse.

Para forzar la eliminación de contenedores en ejecución, usamos el comando docker-compose rm con la bandera -f. Esta opción fuerza la eliminación sin requerir confirmación y sin detener los contenedores de manera controlada.

docker-compose rm -f

Verás una salida indicando que el contenedor está siendo eliminado. Nota que esta vez no se solicitó confirmación.

Después de ejecutar el comando, verifica que el contenedor haya sido eliminado usando docker ps -a.

docker ps -a

El contenedor my-web-app_web_1 ya no debería aparecer en la lista. Esto confirma que el contenedor fue eliminado por la fuerza aunque estaba en ejecución.

El uso de la opción de eliminación forzada debe hacerse con precaución, ya que puede provocar pérdida de datos si el contenedor estaba escribiendo información en un volumen que no está gestionado explícitamente.

Con esto concluimos nuestra exploración sobre la eliminación de contenedores de servicio con Docker Compose. Has aprendido cómo:

  • Detener contenedores
  • Eliminar contenedores detenidos sin volúmenes
  • Eliminar contenedores detenidos con volúmenes anónimos
  • Forzar la eliminación de contenedores en ejecución

Resumen

En este laboratorio, aprendimos a utilizar el comando docker compose rm para eliminar contenedores detenidos. Comenzamos preparando un proyecto simple con Docker Compose, lo que incluyó la instalación de Docker Compose y la creación de un archivo docker-compose.yml para definir un servicio web básico utilizando la imagen de Nginx.

Luego practicamos deteniendo los contenedores del servicio y posteriormente eliminándolos usando docker compose rm. Exploramos diferentes escenarios, incluyendo:

  • Eliminar contenedores detenidos sin volúmenes
  • Eliminar contenedores detenidos con volúmenes anónimos
  • Usar la opción de fuerza para eliminar contenedores

Esta experiencia práctica demostró la aplicación del comando docker compose rm para gestionar el ciclo de vida de los contenedores dentro de un proyecto de Docker Compose.