Cómo usar el comando docker compose down para detener y eliminar recursos

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 eficazmente el comando docker compose down para detener y eliminar los recursos definidos en un archivo Docker Compose. Comenzaremos preparando un archivo Compose simple con dos servicios y una red.

Después de la configuración, practicarás el inicio de estos servicios usando docker compose up. El núcleo del laboratorio se centrará en usar docker compose down para detener y eliminar los recursos predeterminados, y posteriormente explorarás las opciones -v para eliminar volúmenes y --rmi all para eliminar imágenes, demostrando diferentes niveles de limpieza de recursos.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/VolumeOperationsGroup(["Volume Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/NetworkOperationsGroup(["Network Operations"]) 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/ImageOperationsGroup -.-> docker/rmi("Remove Image") docker/ImageOperationsGroup -.-> docker/images("List Images") docker/VolumeOperationsGroup -.-> docker/volume("Manage Volumes") docker/NetworkOperationsGroup -.-> docker/network("Manage Networks") subgraph Lab Skills docker/run -.-> lab-555077{{"Cómo usar el comando docker compose down para detener y eliminar recursos"}} docker/ps -.-> lab-555077{{"Cómo usar el comando docker compose down para detener y eliminar recursos"}} docker/stop -.-> lab-555077{{"Cómo usar el comando docker compose down para detener y eliminar recursos"}} docker/rm -.-> lab-555077{{"Cómo usar el comando docker compose down para detener y eliminar recursos"}} docker/pull -.-> lab-555077{{"Cómo usar el comando docker compose down para detener y eliminar recursos"}} docker/rmi -.-> lab-555077{{"Cómo usar el comando docker compose down para detener y eliminar recursos"}} docker/images -.-> lab-555077{{"Cómo usar el comando docker compose down para detener y eliminar recursos"}} docker/volume -.-> lab-555077{{"Cómo usar el comando docker compose down para detener y eliminar recursos"}} docker/network -.-> lab-555077{{"Cómo usar el comando docker compose down para detener y eliminar recursos"}} end

Preparar un archivo Compose simple con servicios y una red

En este paso, prepararemos un archivo Compose simple para definir dos servicios y una red. Antes de comenzar, necesitamos instalar Docker Compose ya que no viene preinstalado en el entorno.

Primero, descargaremos el binario de Docker Compose. Utilizaremos la versión 1.29.2, que es compatible con la versión de Docker preinstalada.

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

Este comando descarga el binario de Docker Compose desde la página oficial de releases en GitHub y lo guarda en /usr/local/bin/docker-compose. Las partes $(uname -s) y $(uname -m) detectan automáticamente tu sistema operativo y arquitectura para descargar el binario correcto.

A continuación, debemos aplicar permisos de ejecución al binario descargado para poder ejecutarlo como comando.

sudo chmod +x /usr/local/bin/docker-compose

Ahora, verifiquemos la instalación comprobando la versión de Docker Compose.

docker-compose --version

Deberías ver la información de versión impresa en la consola, lo que confirma que Docker Compose está instalado correctamente.

Ahora que Docker Compose está instalado, creemos un directorio para nuestro proyecto y accedamos a él. Crearemos un directorio llamado my-compose-app en el directorio ~/project.

mkdir ~/project/my-compose-app
cd ~/project/my-compose-app

Dentro de este directorio, crearemos un archivo llamado docker-compose.yml. Este archivo definirá nuestros servicios y red. Usaremos el editor nano para crear y editar este archivo.

nano docker-compose.yml

Ahora, pega el siguiente contenido en el archivo docker-compose.yml. Este archivo define dos servicios: web y redis, y una red llamada app-network.

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    networks:
      - app-network
  redis:
    image: redis:latest
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

Analicemos este archivo docker-compose.yml:

  • version: '3.8' especifica la versión del formato del archivo Docker Compose.
  • services: define los diferentes servicios que componen tu aplicación.
    • web: define un servicio llamado web.
      • image: nginx:latest especifica que este servicio usará la imagen más reciente de nginx. Descargaremos esta imagen más adelante.
      • ports: - "80:80" mapea el puerto 80 en la máquina host al puerto 80 en el contenedor web.
      • networks: - app-network conecta el servicio web a la app-network.
    • redis: define un servicio llamado redis.
      • image: redis:latest especifica que este servicio usará la imagen más reciente de redis. Descargaremos esta imagen más adelante.
      • networks: - app-network conecta el servicio redis a la app-network.
  • networks: define las redes utilizadas por los servicios.
    • app-network: define una red llamada app-network.
      • driver: bridge especifica que esta red usará el controlador bridge predeterminado.

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

Antes de iniciar los servicios, necesitamos descargar las imágenes de Docker necesarias. Descargaremos las imágenes nginx:latest y redis:latest.

docker pull nginx:latest
docker pull redis:latest

Estos comandos descargan las imágenes especificadas desde Docker Hub a tu máquina local.

Iniciar los servicios usando docker compose up

En este paso, iniciaremos los servicios definidos en nuestro archivo docker-compose.yml usando el comando docker compose up. Este comando construye, (re)crea, inicia y se conecta a los contenedores de un servicio.

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

cd ~/project/my-compose-app

Ahora, ejecuta el siguiente comando para iniciar los servicios. Usaremos el flag -d para ejecutar los contenedores en modo detached (desacoplado), lo que significa que se ejecutarán en segundo plano sin bloquear tu terminal.

docker-compose up -d

Cuando ejecutes este comando por primera vez, Docker Compose:

  1. Creará la red app-network como está definida en el archivo docker-compose.yml.
  2. Creará un contenedor para el servicio web usando la imagen nginx:latest.
  3. Creará un contenedor para el servicio redis usando la imagen redis:latest.
  4. Conectará ambos contenedores a la red app-network.
  5. Iniciará ambos contenedores.

Deberías ver una salida que indica que la red y los contenedores están siendo creados e iniciados.

Para verificar que los contenedores están en ejecución, puedes usar el comando docker ps.

docker ps

Este comando lista todos los contenedores en ejecución. Deberías ver dos contenedores listados, uno para el servicio web (basado en la imagen nginx) y otro para el servicio redis (basado en la imagen redis). Los nombres de los contenedores normalmente tendrán como prefijo el nombre del directorio (my-compose-app en este caso) y el nombre del servicio (ej. my-compose-app_web_1, my-compose-app_redis_1).

También puedes verificar las redes creadas por Docker Compose usando el comando docker network ls.

docker network ls

Deberías ver una red llamada my-compose-app_app-network en la lista, que fue creada basada en la definición de app-network en tu archivo docker-compose.yml.

Finalmente, como mapeamos el puerto 80 del servicio web al puerto 80 del host, puedes acceder a la página de bienvenida predeterminada de Nginx abriendo un navegador web y accediendo a la dirección IP de tu VM LabEx. Alternativamente, puedes usar curl desde la terminal.

curl localhost

Deberías ver el contenido HTML de la página de bienvenida predeterminada de Nginx en la salida. Esto confirma que el servicio web está en ejecución y accesible.

Detener y eliminar recursos predeterminados usando docker compose down

En este paso, detendremos y eliminaremos los contenedores y redes creados por docker compose up usando el comando docker compose down. Por defecto, docker compose down elimina los contenedores y la red predeterminada creada por up.

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

cd ~/project/my-compose-app

Ahora, ejecuta el siguiente comando para detener y eliminar los servicios.

docker-compose down

Cuando ejecutes este comando, Docker Compose:

  1. Detendrá los contenedores en ejecución (web y redis).
  2. Eliminará los contenedores detenidos.
  3. Eliminará la red (my-compose-app_app-network) que fue creada por docker compose up.

Deberías ver una salida que indica que los contenedores y la red están siendo detenidos y eliminados.

Para verificar que los contenedores han sido eliminados, puedes usar el comando docker ps -a. El flag -a muestra todos los contenedores, incluyendo los detenidos.

docker ps -a

Ya no deberías ver los contenedores my-compose-app_web_1 y my-compose-app_redis_1 en la salida.

También puedes verificar que la red ha sido eliminada usando el comando docker network ls.

docker network ls

La red my-compose-app_app-network ya no debería aparecer en la lista.

Nota que docker compose down por defecto no elimina volúmenes ni imágenes. Exploraremos cómo eliminarlos en los siguientes pasos.

Detener y eliminar volúmenes usando docker compose down -v

En el paso anterior, vimos que docker compose down elimina contenedores y redes pero no volúmenes. En este paso, aprenderemos cómo eliminar volúmenes junto con otros recursos usando el flag -v con docker compose down.

Primero, volvamos a iniciar los servicios para tener recursos que eliminar. Asegúrate de estar en el directorio ~/project/my-compose-app.

cd ~/project/my-compose-app

Ejecuta el comando docker compose up -d para iniciar los servicios en modo detached (desacoplado).

docker-compose up -d

Esto recreará los contenedores y la red.

Ahora, verifiquemos si se crearon volúmenes. En nuestro docker-compose.yml, no definimos volúmenes explícitamente. Sin embargo, algunas imágenes como redis pueden crear volúmenes anónimos por defecto para persistir datos. Podemos verificar los volúmenes usando el comando docker volume ls.

docker volume ls

Es posible que veas un volumen listado con un nombre como my-compose-app_redisdata (el nombre exacto puede variar ligeramente según la versión y configuración de Docker Compose, pero probablemente tendrá como prefijo el nombre del proyecto y del servicio). Este es un volumen anónimo creado por el contenedor redis.

Ahora, detengamos y eliminemos los servicios, la red y también los volúmenes usando docker compose down -v.

docker-compose down -v

El flag -v le indica a Docker Compose que elimine todos los volúmenes declarados en la sección volumes del archivo docker-compose.yml y cualquier volumen anónimo asociado a los contenedores.

Deberías ver una salida que indica que los contenedores, la red y el volumen están siendo detenidos y eliminados.

Para verificar que los contenedores han sido eliminados, usa docker ps -a.

docker ps -a

Los contenedores web y redis no deberían aparecer en la lista.

Para verificar que la red ha sido eliminada, usa docker network ls.

docker network ls

La red my-compose-app_app-network no debería aparecer en la lista.

Finalmente, para verificar que el volumen ha sido eliminado, usa docker volume ls.

docker volume ls

El volumen que aparecía anteriormente (ej. my-compose-app_redisdata) ya no debería estar en la salida.

Detener y eliminar imágenes usando docker compose down --rmi all

En los pasos anteriores, aprendimos cómo detener y eliminar contenedores, redes y volúmenes usando docker compose down. Por defecto, docker compose down no elimina las imágenes Docker que se usaron para crear los contenedores. En este paso, aprenderemos cómo eliminar imágenes usando el flag --rmi all con docker compose down.

Primero, volvamos a iniciar los servicios. Asegúrate de estar en el directorio ~/project/my-compose-app.

cd ~/project/my-compose-app

Ejecuta el comando docker compose up -d para iniciar los servicios en modo detached (desacoplado).

docker-compose up -d

Esto recreará los contenedores y la red.

Ahora, verifiquemos las imágenes Docker en tu sistema usando el comando docker images.

docker images

Deberías ver las imágenes nginx y redis listadas, junto con cualquier otra imagen que puedas tener en tu sistema.

Ahora, detengamos y eliminemos los servicios, red, volúmenes y también las imágenes usando docker compose down --rmi all.

docker-compose down --rmi all -v

Incluimos nuevamente el flag -v para asegurarnos de que los volúmenes también se eliminen. El flag --rmi all le indica a Docker Compose que elimine todas las imágenes usadas por cualquier servicio en el archivo docker-compose.yml, incluso si no están etiquetadas.

Deberías ver una salida que indica que los contenedores, red, volúmenes e imágenes están siendo detenidos y eliminados.

Para verificar que los contenedores han sido eliminados, usa docker ps -a.

docker ps -a

Los contenedores web y redis no deberían aparecer en la lista.

Para verificar que la red ha sido eliminada, usa docker network ls.

docker network ls

La red my-compose-app_app-network no debería aparecer en la lista.

Para verificar que los volúmenes han sido eliminados, usa docker volume ls.

docker volume ls

Ningún volumen relacionado con este proyecto debería aparecer listado.

Finalmente, para verificar que las imágenes han sido eliminadas, usa docker images.

docker images

Las imágenes nginx y redis que eran usadas por los servicios ya no deberían aparecer en la salida, a menos que estén siendo usadas por otros contenedores o tengan otras etiquetas. docker compose down --rmi all elimina imágenes que no están siendo usadas por ningún otro contenedor.

Resumen

En este laboratorio, aprendimos a usar el comando docker compose down para detener y eliminar los recursos definidos en un archivo Docker Compose. Comenzamos preparando un archivo Compose simple con dos servicios y una red, lo que implicó instalar Docker Compose y crear el archivo docker-compose.yml.

Después de iniciar los servicios usando docker compose up, exploramos diferentes formas de utilizar docker compose down. Primero usamos el comando básico para detener y eliminar los recursos predeterminados (contenedores y redes). Posteriormente, aprendimos cómo eliminar volúmenes usando el flag -v y cómo eliminar imágenes usando el flag --rmi all, demostrando la flexibilidad del comando docker compose down para gestionar el ciclo de vida de nuestras aplicaciones Docker Compose.