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:
- Detiene todos los contenedores en ejecución definidos en su archivo Docker Compose
- Elimina todos los contenedores
- 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:
- Detendrá y eliminará todos los contenedores
- Eliminará todos los volúmenes con nombre
- Eliminará todas las imágenes utilizadas por cualquier servicio
- 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:
Eliminar solo contenedores y redes (conservar volúmenes e imágenes):
docker-compose downEliminar contenedores, redes e imágenes (conservar volúmenes):
docker-compose down --rmi allEliminar contenedores, redes y volúmenes (conservar imágenes):
docker-compose down --volumesEliminar 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:
Enumerar todos los contenedores (incluidos los detenidos):
docker ps -aEnumerar todas las redes:
docker network lsEnumerar todos los volúmenes:
docker volume lsEnumerar todas las imágenes:
docker image lsObtener 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:
- Instaló Docker Compose y creó un entorno Docker Compose simple
- Aprendió los conceptos básicos de
docker-compose downy cómo elimina contenedores y redes de forma predeterminada - Exploró opciones avanzadas como
--volumes,--rmiy--remove-orphanspara controlar exactamente qué recursos se eliminan - 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 downelimina contenedores y redes, pero conserva los volúmenes - Use
--volumespara eliminar volúmenes cuando desee restablecer sus datos - Use
--rmipara eliminar imágenes cuando necesite liberar espacio en disco - Use
--remove-orphanspara 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.



