Cómo usar el comando docker compose wait para bloquear hasta que los servicios se detengan

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 wait para gestionar el ciclo de vida de tus servicios en Docker Compose. Comenzaremos configurando un archivo básico docker-compose.yml con múltiples servicios y observando su estado inicial después de iniciarlos.

Posteriormente, explorarás la funcionalidad principal de docker compose wait para bloquear la ejecución hasta que todos los servicios dentro de tu proyecto se hayan detenido. Luego, demostraremos cómo usar este comando para esperar a que servicios específicos se detengan y, finalmente, cómo combinar docker compose wait con la opción --down-project para una operación completa de apagado y espera del proyecto.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/VolumeOperationsGroup(["Volume Operations"]) docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/stop("Stop Container") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ContainerOperationsGroup -.-> docker/logs("View Container Logs") docker/ContainerOperationsGroup -.-> docker/create("Create Container") docker/VolumeOperationsGroup -.-> docker/volume("Manage Volumes") subgraph Lab Skills docker/ps -.-> lab-555097{{"Cómo usar el comando docker compose wait para bloquear hasta que los servicios se detengan"}} docker/stop -.-> lab-555097{{"Cómo usar el comando docker compose wait para bloquear hasta que los servicios se detengan"}} docker/rm -.-> lab-555097{{"Cómo usar el comando docker compose wait para bloquear hasta que los servicios se detengan"}} docker/logs -.-> lab-555097{{"Cómo usar el comando docker compose wait para bloquear hasta que los servicios se detengan"}} docker/create -.-> lab-555097{{"Cómo usar el comando docker compose wait para bloquear hasta que los servicios se detengan"}} docker/volume -.-> lab-555097{{"Cómo usar el comando docker compose wait para bloquear hasta que los servicios se detengan"}} end

Crear un archivo docker-compose.yml simple con múltiples servicios

En este paso, crearemos un archivo docker-compose.yml simple que define dos servicios. Antes de comenzar, necesitamos instalar Docker Compose ya que no viene preinstalado en este entorno.

Primero, descargaremos el binario de Docker Compose. Descargaremos la versión v2.20.2 que es compatible con la versión instalada de Docker.

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

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.

A continuación, debemos dar permisos de ejecución al binario descargado.

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

Ahora, verifiquemos que Docker Compose se instaló correctamente comprobando su versión.

docker-compose version

Deberías ver una salida que indique la versión de Docker Compose instalada.

Ahora que Docker Compose está instalado, podemos crear nuestro archivo docker-compose.yml. Este archivo usa formato YAML para definir los servicios, redes y volúmenes de tu aplicación. Crearemos un archivo simple con dos servicios: un servidor web y una base de datos.

Navega a tu directorio de proyecto.

cd ~/project

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

nano docker-compose.yml

Pega el siguiente contenido en el editor:

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
  db:
    image: postgres:latest
    environment:
      POSTGRES_PASSWORD: mysecretpassword

Analicemos este archivo:

  • 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 de Docker Hub.
    • ports: mapea el puerto 80 en la máquina host al puerto 80 en el contenedor web, permitiendo acceder al servidor web desde tu navegador.
  • db: define un servicio llamado db.
    • image: postgres:latest especifica que este servicio usará la imagen más reciente de postgres de Docker Hub.
    • environment: establece variables de entorno dentro del contenedor. Aquí configuramos POSTGRES_PASSWORD requerida por la imagen PostgreSQL.

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

Ahora has creado exitosamente un archivo docker-compose.yml que define dos servicios.

Iniciar los servicios y observar su estado

En este paso, iniciaremos los servicios definidos en nuestro archivo docker-compose.yml y observaremos su estado.

Primero, asegúrate de estar en el directorio ~/project donde creaste el archivo docker-compose.yml.

cd ~/project

Ahora, usa el comando docker-compose up para iniciar los servicios. El flag -d ejecuta los contenedores en modo detached (desacoplado), lo que significa que se ejecutarán en segundo plano.

docker-compose up -d

Cuando ejecutes este comando por primera vez, Docker Compose descargará las imágenes necesarias (nginx:latest y postgres:latest) si no están presentes en tu sistema. Esto puede tomar algún tiempo dependiendo de tu conexión a internet. Después de la descarga, creará e iniciará los contenedores para los servicios web y db.

Deberías ver una salida que indica que se están creando e iniciando las redes, volúmenes (si están definidos, aunque no en nuestro ejemplo simple) y contenedores.

Para verificar el estado de los servicios en ejecución, usa el comando docker-compose ps.

docker-compose ps

Este comando lista los contenedores gestionados por Docker Compose en el directorio actual. Deberías ver ambos servicios web y db listados con su estado, que debería ser Up.

También puedes usar el comando estándar docker ps para ver todos los contenedores en ejecución en tu sistema, incluyendo aquellos iniciados por Docker Compose.

docker ps

Busca contenedores cuyos nombres comiencen con el nombre del directorio (project en este caso) seguido del nombre del servicio (ej. project-web-1, project-db-1).

Para ver los logs de los servicios, puedes usar el comando docker-compose logs. Por ejemplo, para ver los logs del servicio web:

docker-compose logs web

Y para el servicio db:

docker-compose logs db

Esto es útil para depuración y entender qué está ocurriendo dentro de tus contenedores.

Ahora has iniciado exitosamente los servicios definidos en tu archivo docker-compose.yml y observado su estado usando docker-compose ps.

Usar docker compose wait para esperar hasta que los servicios se detengan

En este paso, exploraremos el comando docker compose wait, que se utiliza para bloquear la ejecución hasta que los servicios alcancen un estado determinado. Por defecto, docker compose wait espera a que los servicios se detengan.

Primero, asegúrate de que tus servicios estén en ejecución desde el paso anterior. Puedes verificarlo usando docker-compose ps.

cd ~/project
docker-compose ps

Deberías ver ambos servicios web y db listados con el estado Up.

Ahora, abre una nueva ventana o pestaña de terminal. Mantén la ventana de terminal actual abierta ya que la usaremos más adelante para detener los servicios.

En la nueva ventana de terminal, navega al directorio ~/project.

cd ~/project

Ejecuta el comando docker compose wait. Este comando se bloqueará y esperará hasta que todos los servicios definidos en el archivo docker-compose.yml del directorio actual se hayan detenido.

docker compose wait

Notarás que este comando parece quedarse colgado. Esto es normal porque los servicios están actualmente en ejecución. El comando docker compose wait está esperando a que se detengan.

Ahora, regresa a tu ventana de terminal original donde los servicios están en ejecución. Detendremos los servicios usando el comando docker-compose down. Este comando detiene y elimina los contenedores, redes y volúmenes creados por docker-compose up.

cd ~/project
docker-compose down

Observa la salida en la ventana de terminal original. Verás mensajes indicando que los contenedores están siendo detenidos y eliminados.

Ahora, vuelve a la nueva ventana de terminal donde ejecutaste docker compose wait. A medida que los servicios se detienen mediante el comando docker-compose down en el otro terminal, el comando docker compose wait en esta ventana detectará que los servicios se han detenido y finalizará.

Deberías ver que el prompt de comandos regresa en la nueva ventana de terminal. Esto demuestra cómo docker compose wait se bloquea hasta que los servicios especificados (todos los servicios por defecto) se hayan detenido.

Has utilizado exitosamente docker compose wait para esperar hasta que todos los servicios de tu proyecto se detuvieran.

Usar docker compose wait con servicios específicos

En el paso anterior, usamos docker compose wait para esperar que todos los servicios se detuvieran. En este paso, aprenderemos cómo usar docker compose wait para esperar que servicios específicos alcancen un estado determinado.

Primero, iniciemos nuevamente nuestros servicios usando docker-compose up -d. Asegúrate de estar en el directorio ~/project.

cd ~/project
docker-compose up -d

Verifica que ambos servicios estén en ejecución usando docker-compose ps.

docker-compose ps

Ahora, abre una nueva ventana o pestaña de terminal. Usaremos este nuevo terminal para demostrar cómo esperar por un servicio específico.

En la nueva ventana de terminal, navega al directorio ~/project.

cd ~/project

Podemos especificar qué servicios esperar proporcionando sus nombres después del comando docker compose wait. Por ejemplo, para esperar solo que el servicio web se detenga:

docker compose wait web

Similar al paso anterior, este comando se bloqueará porque el servicio web está actualmente en ejecución.

Ahora, regresa a tu ventana de terminal original. Detendremos solo el servicio web. Para hacer esto, podemos usar el comando docker stop con el nombre del contenedor. Puedes encontrar el nombre del contenedor usando docker ps. Probablemente será algo como project-web-1.

cd ~/project
docker stop project-web-1

Reemplaza project-web-1 con el nombre real del contenedor si es diferente.

Observa la salida en la ventana de terminal original. Verás un mensaje indicando que el contenedor web está siendo detenido.

Ahora, vuelve a la nueva ventana de terminal donde ejecutaste docker compose wait web. Como el servicio web se ha detenido, el comando docker compose wait web detectará esto y finalizará.

Deberías ver que el prompt de comandos regresa en la nueva ventana de terminal. Nota que el comando docker compose wait web finalizó aunque el servicio db sigue en ejecución.

Para confirmar que el servicio db sigue en ejecución, regresa al terminal original y ejecuta docker-compose ps.

cd ~/project
docker-compose ps

Deberías ver el servicio db listado con el estado Up, mientras que el servicio web ya no aparece o muestra un estado detenido.

Finalmente, detengamos el servicio db restante.

cd ~/project
docker-compose down

Has utilizado exitosamente docker compose wait para bloquear hasta que un servicio específico se detuviera.

Usar docker compose wait con la opción --down-project

En este paso final, exploraremos la opción --down-project con docker compose wait. Esta opción es útil cuando deseas esperar que los servicios se detengan y luego desactivar automáticamente todo el proyecto.

Primero, asegurémonos de que nuestros servicios estén detenidos desde el paso anterior. Puedes verificarlo usando docker-compose ps.

cd ~/project
docker-compose ps

Si algún servicio sigue en ejecución, detenlo usando docker-compose down.

docker-compose down

Ahora, iniciemos nuevamente los servicios en modo detached (desacoplado).

cd ~/project
docker-compose up -d

Verifica que ambos servicios estén en ejecución.

docker-compose ps

Ahora usaremos el comando docker compose wait con la opción --down-project. Este comando esperará que todos los servicios se detengan y luego ejecutará automáticamente docker-compose down.

docker compose wait --down-project

Similar a los usos anteriores de docker compose wait, este comando se bloqueará porque los servicios están actualmente en ejecución.

Ahora, abre una nueva ventana o pestaña de terminal. En este nuevo terminal, detendremos manualmente los servicios.

En la nueva ventana de terminal, navega al directorio ~/project.

cd ~/project

Detén los servicios usando docker-compose down.

docker-compose down

Observa la salida en la nueva ventana de terminal. Verás mensajes indicando que los contenedores están siendo detenidos y eliminados.

Ahora, regresa a la ventana de terminal original donde ejecutaste docker compose wait --down-project. A medida que los servicios se detienen mediante el comando docker-compose down en el otro terminal, el comando docker compose wait detectará esto. Como se usó la opción --down-project, procederá automáticamente a desactivar el proyecto, lo que en este caso significa eliminar los contenedores, redes y volúmenes.

Deberías ver una salida en la ventana de terminal original similar a lo que viste cuando ejecutaste manualmente docker-compose down. Después de desactivar el proyecto, el comando docker compose wait finalizará.

Has utilizado exitosamente docker compose wait con la opción --down-project para esperar que los servicios se detengan y luego desactivar automáticamente el proyecto.

Resumen

En este laboratorio, aprendimos a utilizar el comando docker compose wait para bloquear la ejecución hasta que los servicios se detengan. Comenzamos instalando Docker Compose y creando un archivo simple docker-compose.yml que definía dos servicios: web y db. Esta configuración nos proporcionó el entorno necesario para demostrar la funcionalidad del comando wait.

Posteriormente, exploramos cómo usar docker compose wait para esperar hasta que todos los servicios definidos en el archivo docker-compose.yml se detuvieran. También aprendimos a utilizar el comando con nombres de servicios específicos para esperar solo por esos servicios, y cómo emplear la opción --down-project para esperar que todo el proyecto sea desactivado. Estos pasos demostraron la flexibilidad y utilidad del comando docker compose wait para gestionar el ciclo de vida de los servicios de Docker Compose.