Usando el Comando Docker Compose Down de Manera Efectiva

DockerBeginner
Practicar Ahora

Introducción

El comando docker-compose down es una herramienta esencial en la gestión de contenedores Docker. Este laboratorio le guiará a través del uso efectivo de docker-compose down para apagar y limpiar adecuadamente los contenedores, redes, volúmenes e imágenes de Docker. Al dominar este comando, podrá mantener un entorno Docker limpio y optimizar su flujo de trabajo de desarrollo.

Instalación de Docker Compose y Creación de un Proyecto de Ejemplo

Antes de poder usar el comando docker-compose down, necesitamos asegurarnos de que Docker Compose esté correctamente instalado y crear un proyecto de ejemplo de Docker Compose con el que trabajar.

Verificación de la Instalación de Docker Compose

Primero, comprobemos si Docker Compose se instaló correctamente durante la configuración:

docker-compose version

Debería ver una salida similar a esta:

Docker Compose version v2.18.1

Creación de un Archivo Docker Compose Simple

Ahora, creemos un archivo Docker Compose simple que usaremos a lo largo de este laboratorio. Crearemos un archivo llamado docker-compose.yml en el directorio actual con un servicio web básico basado en Nginx.

Use el editor nano para crear el archivo:

cd ~/project/docker-compose-demo
nano docker-compose.yml

Copie y pegue el siguiente contenido en el editor:

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

  db:
    image: redis:latest
    volumes:
      - db_data:/data

volumes:
  web_data:
  db_data:

Guarde el archivo presionando Ctrl+O, luego Enter, y salga con Ctrl+X.

Este archivo Docker Compose define:

  • Un servicio web que utiliza la imagen Nginx
  • Un servicio de base de datos que utiliza Redis
  • Dos volúmenes con nombre para el almacenamiento persistente de datos

Inicio de los Servicios Docker Compose

Iniciemos los servicios definidos en nuestro archivo Docker Compose:

docker-compose up -d

La bandera -d ejecuta los contenedores en modo detached (en segundo plano). Debería ver una salida similar a:

Creating network "docker-compose-demo_default" with the default driver
Creating volume "docker-compose-demo_web_data" with default driver
Creating volume "docker-compose-demo_db_data" with default driver
Creating docker-compose-demo_web_1 ... done
Creating docker-compose-demo_db_1  ... done

Verificación de los Contenedores en Ejecución

Comprobemos que nuestros contenedores se están ejecutando:

docker-compose ps

Debería ver una salida que muestra que ambos servicios están activos y en ejecución:

        Name                       Command               State          Ports
-----------------------------------------------------------------------------------
docker-compose-demo_db_1    docker-entrypoint.sh redis ...   Up      6379/tcp
docker-compose-demo_web_1   /docker-entrypoint.sh ngin ...   Up      0.0.0.0:8080->80/tcp

También puede verificar que el servidor web Nginx es accesible usando curl:

curl http://localhost:8080

Debería ver la salida HTML de la página de bienvenida predeterminada de Nginx.

Ahora que tenemos nuestros servicios en funcionamiento, estamos listos para aprender sobre el comando docker-compose down en el siguiente paso.

Comprender y Usar Docker Compose Down

Ahora que nuestros servicios de Docker Compose están en ejecución, aprendamos sobre el comando docker-compose down y cómo usarlo eficazmente.

¿Qué es Docker Compose Down?

El comando docker-compose down se utiliza para detener y eliminar contenedores, redes, volúmenes e imágenes creadas por docker-compose up. Este comando es esencial para limpiar los recursos cuando ya no los necesita o cuando desea restablecer su entorno.

Uso Básico de Docker Compose Down

La forma más simple del comando es:

docker-compose down

Ejecutemos este comando y observemos qué sucede:

cd ~/project/docker-compose-demo
docker-compose down

Debería ver una salida similar a:

Stopping docker-compose-demo_web_1 ... done
Stopping docker-compose-demo_db_1  ... done
Removing docker-compose-demo_web_1 ... done
Removing docker-compose-demo_db_1  ... done
Removing network docker-compose-demo_default

Observe que el comando:

  1. Detiene todos los contenedores en ejecución definidos en su archivo Docker Compose
  2. Elimina todos los contenedores
  3. Elimina la red creada por Docker Compose

Sin embargo, no elimina los volúmenes de forma predeterminada. Este es un punto importante a entender: los volúmenes persisten más allá del ciclo de vida de los contenedores para preservar sus datos.

Verificación de que los Recursos Fueron Eliminados

Confirmemos que los contenedores y la red han sido eliminados:

docker-compose ps

Debería ver una lista vacía, lo que indica que no hay contenedores en ejecución de este proyecto Docker Compose.

Comprobemos si los volúmenes aún existen:

docker volume ls | grep docker-compose-demo

Debería ver que los volúmenes aún existen:

local     docker-compose-demo_db_data
local     docker-compose-demo_web_data

Este comportamiento predeterminado es importante porque preserva sus datos a través de los reinicios de los contenedores. Si quisiera eliminar también estos volúmenes, necesitaría usar opciones adicionales, que cubriremos en el siguiente paso.

Inicio de los Servicios de Nuevo

Iniciemos nuestros servicios de nuevo ya que los necesitaremos para el siguiente paso:

docker-compose up -d

Debería ver:

Creating network "docker-compose-demo_default" with the default driver
Creating docker-compose-demo_web_1 ... done
Creating docker-compose-demo_db_1  ... done

Observe que Docker Compose no necesitó recrear los volúmenes ya que ya existen.

Ahora comprende el uso básico de docker-compose down. En el siguiente paso, exploraremos opciones más avanzadas para controlar exactamente qué recursos se eliminan.

Uso de Docker Compose Down con Opciones Avanzadas

El comando básico docker-compose down es útil, pero Docker Compose proporciona opciones adicionales para darle más control sobre qué recursos se eliminan. En este paso, exploraremos estas opciones.

Eliminación de Volúmenes

Como observamos en el paso anterior, docker-compose down no elimina los volúmenes de forma predeterminada. Esta es una característica de seguridad para evitar la pérdida accidental de datos. Sin embargo, hay ocasiones en las que también desea eliminar los volúmenes, como cuando está realizando una limpieza completa o cuando desea restablecer los datos de su aplicación.

Para eliminar volúmenes junto con contenedores y redes, use la bandera --volumes:

docker-compose down --volumes

Intentémoslo:

cd ~/project/docker-compose-demo
docker-compose down --volumes

Debería ver una salida similar a:

Stopping docker-compose-demo_web_1 ... done
Stopping docker-compose-demo_db_1  ... done
Removing docker-compose-demo_web_1 ... done
Removing docker-compose-demo_db_1  ... done
Removing network docker-compose-demo_default
Removing volume docker-compose-demo_web_data
Removing volume docker-compose-demo_db_data

Observe que esta vez, los volúmenes también se eliminan.

Verifiquemos que los volúmenes han sido eliminados:

docker volume ls | grep docker-compose-demo

No debería ver ninguna salida, lo que confirma que los volúmenes han sido eliminados.

Eliminación de Imágenes

Otra opción útil es eliminar imágenes al desactivar su entorno Docker Compose. Esto se puede hacer con la bandera --rmi, que acepta diferentes valores:

  • --rmi all: Elimina todas las imágenes utilizadas por cualquier servicio
  • --rmi local: Elimina solo las imágenes que no tienen una etiqueta personalizada

Iniciemos nuestros servicios de nuevo y luego usemos la bandera --rmi:

docker-compose up -d

Espere a que los servicios se inicien, luego desactívelos con la bandera --rmi:

docker-compose down --rmi local

Debería ver una salida similar a:

Stopping docker-compose-demo_web_1 ... done
Stopping docker-compose-demo_db_1  ... done
Removing docker-compose-demo_web_1 ... done
Removing docker-compose-demo_db_1  ... done
Removing network docker-compose-demo_default
Removing image redis:latest
Removing image nginx:latest

Esta vez, las imágenes también se eliminan.

Eliminación de Contenedores Huérfanos

A veces, puede tener contenedores que fueron creados por Docker Compose pero que ya no están definidos en su archivo docker-compose.yml actual. Estos se denominan "contenedores huérfanos".

Para demostrar esto, modifiquemos nuestro archivo Docker Compose para eliminar el servicio db:

nano docker-compose.yml

Edite el archivo para eliminar el servicio db y su volumen:

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

volumes:
  web_data:

Guarde y salga del editor (Ctrl+O, Enter, Ctrl+X).

Ahora, iniciemos nuestros servicios de nuevo con el archivo actualizado:

docker-compose up -d

Si tuviéramos un contenedor anterior en ejecución para el servicio db que no se detuvo correctamente, ahora se consideraría huérfano. Podemos eliminar esos huérfanos usando la bandera --remove-orphans:

docker-compose down --remove-orphans

Esto asegura que también se eliminen los contenedores que fueron creados por una versión anterior de su archivo Docker Compose pero que ya no están definidos.

Combinación de Opciones

También puede combinar estas opciones para una limpieza completa:

docker-compose down --volumes --rmi all --remove-orphans

Este comando:

  1. Detendrá y eliminará todos los contenedores
  2. Eliminará todos los volúmenes con nombre
  3. Eliminará todas las imágenes utilizadas por cualquier servicio
  4. Eliminará cualquier contenedor huérfano

Esto es particularmente útil cuando desea restablecer completamente su entorno o cuando se está preparando para realizar cambios significativos en su configuración de Docker Compose.

Exploración de Opciones Adicionales

Puede ver todas las opciones disponibles para el comando docker-compose down usando la bandera de ayuda:

docker-compose down --help

Tómese un momento para revisar las opciones disponibles y sus descripciones.

Ahora tiene una buena comprensión de cómo usar docker-compose down con varias opciones para controlar qué recursos se eliminan al apagar su entorno Docker Compose.

Mejores Prácticas y Escenarios del Mundo Real

Ahora que comprende el comando docker-compose down y sus opciones, exploremos algunas mejores prácticas y escenarios del mundo real para usar este comando de manera efectiva.

Creación de un Entorno Docker Compose Más Complejo

Para demostrar mejor el uso en el mundo real, creemos un entorno Docker Compose más complejo. Configuraremos una aplicación web simple con un frontend, backend y base de datos.

cd ~/project/docker-compose-demo
nano docker-compose.yml

Reemplace el contenido con:

version: "3"

services:
  frontend:
    image: nginx:alpine
    ports:
      - "8080:80"
    volumes:
      - frontend_data:/usr/share/nginx/html
    networks:
      - app_network

  backend:
    image: node:14-alpine
    command: sh -c "echo 'Backend service running' && sleep infinity"
    volumes:
      - backend_data:/app
    networks:
      - app_network
      - db_network

  database:
    image: postgres:13-alpine
    environment:
      POSTGRES_PASSWORD: example
      POSTGRES_USER: user
      POSTGRES_DB: appdb
    volumes:
      - db_data:/var/lib/postgresql/data
    networks:
      - db_network

networks:
  app_network:
  db_network:

volumes:
  frontend_data:
  backend_data:
  db_data:

Guarde y salga del editor.

Iniciemos este entorno más complejo:

docker-compose up -d

Debería ver una salida que muestra la creación de redes, volúmenes y contenedores para los tres servicios.

Mejor Práctica: Uso de Entornos

En escenarios del mundo real, es posible que tenga diferentes entornos como desarrollo, pruebas y producción. Docker Compose le permite usar diferentes archivos de configuración para diferentes entornos.

Cree un archivo para el entorno de desarrollo:

nano docker-compose.dev.yml

Agregue el siguiente contenido:

version: "3"

services:
  frontend:
    ports:
      - "8081:80"
    environment:
      NODE_ENV: development

  backend:
    environment:
      NODE_ENV: development
      DEBUG: "true"

  database:
    ports:
      - "5432:5432"

Guarde y salga del editor.

Para usar este archivo en combinación con el archivo base, puede usar la bandera -f:

docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d

Esto fusionará las configuraciones, aplicando la configuración específica del desarrollo.

Para desactivar este entorno, usaría:

docker-compose -f docker-compose.yml -f docker-compose.dev.yml down

Mejor Práctica: Uso de un Script de Limpieza

En las tuberías de integración/implementación continua (CI/CD) o en los flujos de trabajo de desarrollo, a menudo es útil tener un script de limpieza que elimine todos los recursos de Docker. Creemos un script de limpieza simple:

nano cleanup.sh

Agregue el siguiente contenido:

#!/bin/bash

echo "Cleaning up Docker environment..."

## Stop and remove containers, networks, volumes, and images
docker-compose down --volumes --rmi all --remove-orphans

## Remove dangling volumes
echo "Removing dangling volumes..."
docker volume prune -f

## Remove dangling images
echo "Removing dangling images..."
docker image prune -f

echo "Cleanup complete!"

Guarde y salga del editor.

Haga que el script sea ejecutable:

chmod +x cleanup.sh

Ahora puede ejecutar este script cada vez que necesite hacer una limpieza completa:

./cleanup.sh

Mejor Práctica: Eliminación Selectiva de Recursos

A veces, es posible que desee eliminar solo recursos específicos. Por ejemplo, es posible que desee conservar sus volúmenes (para preservar los datos) pero eliminar contenedores, redes e imágenes.

Así es como abordaría diferentes escenarios:

  1. Eliminar solo contenedores y redes (conservar volúmenes e imágenes):

    docker-compose down
  2. Eliminar contenedores, redes e imágenes (conservar volúmenes):

    docker-compose down --rmi all
  3. Eliminar contenedores, redes y volúmenes (conservar imágenes):

    docker-compose down --volumes
  4. Eliminar solo imágenes locales (no extraídas de un registro):

    docker-compose down --rmi local

Al eliminar selectivamente los recursos, puede optimizar su flujo de trabajo en función de sus necesidades específicas.

Mejor Práctica: Monitoreo del Uso de Recursos

Antes y después de ejecutar docker-compose down, a menudo es útil monitorear el uso de sus recursos de Docker. Esto puede ayudarlo a identificar cualquier recurso que no se esté limpiando correctamente.

Aquí hay algunos comandos útiles:

  1. Enumerar todos los contenedores (incluidos los detenidos):

    docker ps -a
  2. Enumerar todas las redes:

    docker network ls
  3. Enumerar todos los volúmenes:

    docker volume ls
  4. Enumerar todas las imágenes:

    docker image ls
  5. Obtener información de todo el sistema:

    docker system df

Intentemos el último comando para ver nuestro uso actual de recursos:

docker system df

Verá un resumen del uso de sus recursos de Docker, incluido el número de contenedores, imágenes, volúmenes y la cantidad total de espacio utilizado.

Desactivación de Nuestro Entorno Complejo

Ahora, desactivemos nuestro entorno complejo y eliminemos todos los recursos asociados:

docker-compose down --volumes --rmi all --remove-orphans

Esto detendrá y eliminará todos los contenedores, redes, volúmenes e imágenes asociados con nuestro proyecto Docker Compose.

Al seguir estas mejores prácticas, puede administrar eficazmente sus entornos Docker y garantizar un uso óptimo de los recursos.

Resumen

En este laboratorio, ha aprendido a usar eficazmente el comando docker-compose down para administrar sus contenedores y recursos de Docker. Aquí hay un resumen de lo que ha logrado:

  1. Instaló Docker Compose y creó un entorno Docker Compose simple
  2. Aprendió los conceptos básicos de docker-compose down y cómo elimina contenedores y redes de forma predeterminada
  3. Exploró opciones avanzadas como --volumes, --rmi y --remove-orphans para controlar exactamente qué recursos se eliminan
  4. Implementó las mejores prácticas para usar Docker Compose en escenarios del mundo real, incluyendo:
    • Uso de archivos de configuración específicos del entorno
    • Creación de scripts de limpieza
    • Eliminación selectiva de recursos
    • Monitoreo del uso de recursos

Al dominar el comando docker-compose down, ahora tiene el conocimiento para mantener un entorno Docker limpio, evitar fugas de recursos y optimizar su flujo de trabajo de desarrollo.

Recuerde estos puntos clave:

  • El comando básico docker-compose down elimina contenedores y redes, pero conserva los volúmenes
  • Use --volumes para eliminar volúmenes cuando desee restablecer sus datos
  • Use --rmi para eliminar imágenes cuando necesite liberar espacio en disco
  • Use --remove-orphans para limpiar los contenedores que ya no están definidos en su archivo Compose
  • Combine estas opciones para una limpieza completa cuando sea necesario

Con estas habilidades, ahora está mejor equipado para administrar entornos Docker Compose de manera eficiente en sus proyectos.