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.
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 llamadoweb.image: nginx:latestespecifica que este servicio usará la imagen más reciente denginxde Docker Hub.ports:mapea el puerto 80 en la máquina host al puerto 80 en el contenedorweb, permitiendo acceder al servidor web desde tu navegador.
db:define un servicio llamadodb.image: postgres:latestespecifica que este servicio usará la imagen más reciente depostgresde Docker Hub.environment:establece variables de entorno dentro del contenedor. Aquí configuramosPOSTGRES_PASSWORDrequerida 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.



