Cómo usar el comando docker compose stop para gestionar servicios

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 el comando docker compose stop para gestionar servicios definidos en un archivo Docker Compose. Comenzaremos preparando un proyecto simple de Docker Compose, que incluye la instalación de Docker Compose y la creación de un archivo básico docker-compose.yml.

Después de configurar el proyecto, practicarás el inicio de los servicios definidos en el archivo Compose. El núcleo del laboratorio se centra en el uso del comando docker compose stop para detener todos los servicios en ejecución, detener un servicio específico y detener servicios con un tiempo de espera (timeout) especificado. Esta experiencia práctica te proporcionará habilidades útiles para controlar el ciclo de vida de tus aplicaciones Docker multi-contenedor utilizando Docker Compose.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/start("Start Container") docker/ContainerOperationsGroup -.-> docker/stop("Stop Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") subgraph Lab Skills docker/run -.-> lab-555093{{"Cómo usar el comando docker compose stop para gestionar servicios"}} docker/ps -.-> lab-555093{{"Cómo usar el comando docker compose stop para gestionar servicios"}} docker/start -.-> lab-555093{{"Cómo usar el comando docker compose stop para gestionar servicios"}} docker/stop -.-> lab-555093{{"Cómo usar el comando docker compose stop para gestionar servicios"}} docker/pull -.-> lab-555093{{"Cómo usar el comando docker compose stop para gestionar servicios"}} end

Preparar un proyecto simple de Docker Compose

En este paso, prepararemos un proyecto simple de Docker Compose. Docker Compose es una herramienta para definir y ejecutar aplicaciones Docker multi-contenedor. Con Compose, utilizas un archivo YAML para configurar los servicios de tu aplicación. Luego, con un solo comando, creas e inicias todos los servicios desde tu configuración.

Como Docker Compose no viene preinstalado en el entorno de LabEx, primero necesitamos instalarlo. Descargaremos el binario de Docker Compose y lo haremos ejecutable.

Primero, descarguemos el binario de Docker Compose. Usaremos curl para descargar la última versión estable.

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 para la arquitectura de tu sistema y lo guarda en /usr/local/bin/docker-compose.

A continuación, necesitamos hacer que el binario descargado sea ejecutable.

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

Este comando agrega permisos de ejecución al binario de Docker Compose.

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

docker-compose --version

Deberías ver la versión instalada de Docker Compose en la salida, lo que confirma que la instalación fue exitosa.

Ahora que Docker Compose está instalado, creemos un proyecto simple. Crearemos un directorio para nuestro proyecto y luego un archivo docker-compose.yml dentro de él.

Primero, crea un directorio llamado my-compose-app en tu directorio home.

mkdir ~/project/my-compose-app

Accede al directorio recién creado.

cd ~/project/my-compose-app

Ahora, crearemos un archivo docker-compose.yml. Este archivo definirá los servicios para nuestra aplicación. Usaremos nano para crear y editar el archivo.

nano docker-compose.yml

Dentro del editor nano, pega el siguiente contenido:

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
  app:
    image: ubuntu:latest
    command: tail -f /dev/null

Analicemos este archivo docker-compose.yml:

  • version: '3.8' especifica la versión del formato del archivo Docker Compose.
  • services: define los servicios que componen tu aplicación.
  • web: define un servicio llamado web.
    • image: nginx:latest especifica que este servicio usará la imagen Docker nginx:latest. Si la imagen no está disponible localmente, Docker Compose la descargará de Docker Hub.
    • ports: mapea el puerto 80 de la máquina host al puerto 80 del contenedor web.
  • app: define un servicio llamado app.
    • image: ubuntu:latest especifica que este servicio usará la imagen Docker ubuntu:latest.
    • command: tail -f /dev/null especifica el comando a ejecutar cuando el contenedor app inicie. Este comando mantiene el contenedor ejecutándose indefinidamente sin salir.

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

Antes de iniciar los servicios, debemos asegurarnos de que las imágenes Docker requeridas estén disponibles. Aunque Docker Compose descargará las imágenes si no están presentes, es buena práctica descargarlas explícitamente antes, especialmente en entornos con acceso limitado a internet o para un inicio más rápido.

Descarguemos la imagen nginx:latest.

docker pull nginx:latest

Este comando descarga la imagen nginx:latest de Docker Hub.

Luego, descarguemos la imagen ubuntu:latest.

docker pull ubuntu:latest

Este comando descarga la imagen ubuntu:latest de Docker Hub.

Ahora has preparado exitosamente un proyecto simple de Docker Compose con dos servicios, web y app, y has descargado las imágenes Docker necesarias.

Iniciar los servicios definidos en el archivo Compose

En este paso, iniciaremos los servicios definidos en el archivo docker-compose.yml que creamos anteriormente. Docker Compose proporciona un comando simple para construir, crear e iniciar todos los servicios en tu configuración.

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

cd ~/project/my-compose-app

Para iniciar los servicios, usaremos el comando docker-compose up. Por defecto, docker-compose up inicia los contenedores en primer plano y muestra los logs de cada contenedor.

docker-compose up

Cuando ejecutes este comando, Docker Compose:

  1. Buscará el archivo docker-compose.yml en el directorio actual
  2. Construirá o descargará las imágenes Docker necesarias para cada servicio si no están disponibles
  3. Creará e iniciará los contenedores para cada servicio
  4. Mostrará los logs de todos los contenedores en ejecución en tu terminal

Verás una salida indicando que se están creando e iniciando las redes y contenedores. Se mostrarán los logs de los contenedores web (nginx) y app (ubuntu).

Como queremos que los servicios se ejecuten en segundo plano para poder seguir usando la terminal, podemos detener la ejecución actual presionando Ctrl + C.

Para ejecutar los servicios en modo detached (en segundo plano), podemos usar el flag -d con el comando docker-compose up.

docker-compose up -d

Este comando iniciará los servicios en segundo plano y mostrará los nombres de los contenedores creados.

Ahora que los servicios se ejecutan en modo detached, puedes verificar el estado de los contenedores en ejecución usando el comando docker ps.

docker ps

Deberías ver dos contenedores en ejecución: uno para el servicio web (basado en la imagen nginx) y otro para el servicio app (basado en la imagen ubuntu). La salida mostrará información sobre los contenedores, incluyendo sus IDs, imágenes, estado y puertos.

Para verificar que el servicio web es accesible, podemos usar curl para acceder al servidor nginx que se ejecuta en el puerto 80. Como mapeamos el puerto 80 del host al puerto 80 del contenedor web, podemos acceder directamente desde la VM de LabEx.

curl http://localhost:80

Deberías ver el contenido HTML por defecto servido por el servidor web nginx, lo que confirma que el servicio web está en ejecución y accesible.

Detener todos los servicios en ejecución

En este paso, aprenderemos cómo detener todos los servicios que actualmente están en ejecución como parte de nuestro proyecto Docker Compose. Docker Compose proporciona un comando conveniente para detener todos los contenedores definidos en el archivo docker-compose.yml.

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

cd ~/project/my-compose-app

Para detener todos los servicios en ejecución, usamos el comando docker-compose down. Este comando detiene y elimina los contenedores, redes y volúmenes definidos en el archivo docker-compose.yml.

docker-compose down

Cuando ejecutes este comando, Docker Compose:

  1. Detendrá los contenedores en ejecución de manera controlada
  2. Eliminará los contenedores detenidos
  3. Eliminará las redes creadas por Docker Compose para este proyecto
  4. Eliminará cualquier volumen definido en el archivo docker-compose.yml (a menos que se indique lo contrario)

Verás una salida indicando que los contenedores y redes están siendo detenidos y eliminados.

Después de ejecutar docker-compose down, puedes verificar que los contenedores ya no están en ejecución usando el comando docker ps.

docker ps

Este comando lista los contenedores actualmente en ejecución. Como detuvimos todos los servicios, no deberías ver los contenedores web o app en la salida. La salida solo debería mostrar la fila de encabezado o estar vacía si no hay otros contenedores ejecutándose en tu sistema.

Detener los servicios con docker-compose down es la forma estándar de limpiar los recursos de tu proyecto Docker Compose cuando hayas terminado con ellos.

Detener un servicio específico

En este paso, aprenderemos cómo detener un servicio específico dentro de nuestro proyecto Docker Compose, en lugar de detener todos los servicios a la vez. Esto es útil cuando solo necesitas reiniciar o detener un único componente de tu aplicación.

Primero, asegurémonos de que nuestros servicios estén en ejecución. Navega al directorio del proyecto e inicia los servicios en modo detached.

cd ~/project/my-compose-app
docker-compose up -d

Verifica que tanto el servicio web como app estén en ejecución usando docker ps.

docker ps

Deberías ver ambos contenedores listados como en ejecución.

Ahora, detengamos solo el servicio app. Para detener un servicio específico, usamos el comando docker-compose stop seguido del nombre del servicio.

docker-compose stop app

Este comando enviará una señal de detención al contenedor del servicio app y esperará a que se detenga correctamente.

Después de ejecutar el comando, verifiquemos nuevamente el estado de los contenedores.

docker ps

Ahora deberías ver solo el contenedor web listado como en ejecución. El contenedor app ya no debería aparecer en la lista de contenedores en ejecución.

Para confirmar que el contenedor app se ha detenido, también puedes usar docker ps -a, que muestra todos los contenedores, incluidos los detenidos.

docker ps -a

Deberías ver el contenedor app listado con un estado de Exited.

Detener un servicio específico te permite gestionar componentes individuales de tu aplicación sin afectar a los demás. Esto es particularmente útil durante el desarrollo o cuando se solucionan problemas en un servicio específico.

Detener servicios con un tiempo de espera (timeout)

En este paso, exploraremos cómo detener servicios con un tiempo de espera específico. Cuando detienes un contenedor, Docker envía una señal SIGTERM al proceso principal del contenedor, dándole tiempo para cerrarse correctamente. Si el proceso no termina dentro de un período determinado, Docker envía una señal SIGKILL para forzar su detención. Por defecto, este tiempo de espera es de 10 segundos. Puedes ajustarlo usando el flag -t o --timeout con los comandos docker-compose stop o docker-compose down.

Primero, asegurémonos de que nuestros servicios estén en ejecución. Navega al directorio del proyecto e inicia los servicios en modo detached.

cd ~/project/my-compose-app
docker-compose up -d

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

docker ps

Ahora, detengamos el servicio web con un tiempo de espera de 5 segundos.

docker-compose stop -t 5 web

Este comando indica a Docker Compose que detenga el servicio web y espere un máximo de 5 segundos para que el contenedor se detenga correctamente después de enviar la señal SIGTERM. Si el contenedor no se detiene en 5 segundos, Docker enviará una señal SIGKILL.

Verás una salida indicando que el servicio web se está deteniendo.

Verifiquemos nuevamente el estado de los contenedores:

docker ps

Ahora deberías ver solo el contenedor app en ejecución. El contenedor web debería estar detenido.

De manera similar, puedes aplicar un tiempo de espera al detener todos los servicios usando docker-compose down. Detengamos todos los servicios con un tiempo de espera de 3 segundos.

docker-compose down -t 3

Este comando intentará detener todos los servicios definidos en el archivo docker-compose.yml, esperando un máximo de 3 segundos para que cada contenedor se detenga correctamente antes de forzar su detención.

Verifica que no haya contenedores en ejecución después de ejecutar el comando:

docker ps

La salida no debería mostrar contenedores en ejecución.

Usar la opción de tiempo de espera es importante para asegurar que tus aplicaciones tengan suficiente tiempo para realizar tareas de limpieza antes de detenerse, previniendo corrupción de datos u otros problemas.

Resumen

En este laboratorio, aprendimos cómo preparar un proyecto simple con Docker Compose. Esto incluyó la instalación de Docker Compose descargando el binario y haciéndolo ejecutable, además de verificar la instalación. Luego creamos un directorio de proyecto y un archivo docker-compose.yml para definir los servicios de nuestra aplicación.

También aprendimos a gestionar el ciclo de vida de los servicios definidos en el archivo Compose usando el comando docker compose stop. Esto abarcó: iniciar todos los servicios, detener todos los servicios en ejecución, detener un servicio específico y detener servicios con un tiempo de espera (timeout) definido.