Cómo usar el comando docker compose kill para forzar la detención de 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 kill para detener forzosamente los servicios definidos en un archivo Docker Compose. Comenzaremos preparando un archivo Compose simple con múltiples servicios y los iniciaremos usando docker compose up.

Posteriormente, explorarás diferentes formas de usar el comando docker compose kill: para detener forzosamente todos los servicios, para detener forzosamente un servicio específico y para detener servicios usando una señal diferente. Esta experiencia práctica te proporcionará conocimientos útiles sobre la gestión de servicios Docker Compose utilizando el comando kill.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/logs("View Container Logs") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") subgraph Lab Skills docker/ps -.-> lab-555081{{"Cómo usar el comando docker compose kill para forzar la detención de servicios"}} docker/logs -.-> lab-555081{{"Cómo usar el comando docker compose kill para forzar la detención de servicios"}} docker/pull -.-> lab-555081{{"Cómo usar el comando docker compose kill para forzar la detención de servicios"}} end

Preparar un archivo Compose simple con múltiples servicios

En este paso, prepararemos un archivo Docker Compose simple que define múltiples servicios. Docker Compose es una herramienta que te permite definir y ejecutar aplicaciones Docker con múltiples contenedores. Aunque Docker está preinstalado en esta VM, Docker Compose no lo está. Primero lo instalaremos.

Primero, instalemos Docker Compose. Descargaremos la última versión estable y la haremos ejecutable.

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
sudo chmod +x /usr/local/bin/docker-compose

Ahora, verifiquemos la instalación comprobando la versión.

docker-compose --version

Deberías ver la información de la versión impresa en la consola, lo que confirma que Docker Compose está instalado correctamente.

A continuación, crearemos un directorio para nuestro proyecto y navegaremos hasta él.

mkdir ~/project/my-compose-app
cd ~/project/my-compose-app

Ahora, crearemos un archivo docker-compose.yml en este directorio. Este archivo definirá nuestros servicios. Usaremos el editor nano para crear y editar el archivo.

nano docker-compose.yml

Dentro del editor nano, pega el siguiente contenido. Este archivo define dos servicios: web y redis. El servicio web utiliza la imagen nginx y mapea el puerto 80 del contenedor al puerto 8080 del host. El servicio redis utiliza la imagen redis.

version: "3.8"
services:
  web:
    image: nginx
    ports:
      - "8080:80"
  redis:
    image: redis

Después de pegar el contenido, guarda el archivo presionando Ctrl + X, luego Y, y finalmente Enter.

Antes de poder iniciar los servicios, necesitamos descargar las imágenes definidas en el archivo docker-compose.yml. Podemos hacer esto usando el comando docker pull.

docker pull nginx
docker pull redis

Estos comandos descargarán las imágenes nginx y redis desde Docker Hub.

Iniciar los servicios usando docker compose up

En este paso, iniciaremos los servicios definidos en nuestro archivo docker-compose.yml usando el comando docker compose up. Este comando construye, (re)crea, inicia y se conecta a los contenedores de un servicio.

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

cd ~/project/my-compose-app

Ahora, ejecuta el siguiente comando para iniciar los servicios. La bandera -d ejecuta los contenedores en modo detached (desconectado), lo que significa que se ejecutarán en segundo plano sin ocupar tu terminal.

docker-compose up -d

Deberías ver una salida que indica que las redes, volúmenes (si los hay) y contenedores están siendo creados e iniciados.

Para verificar que los contenedores están en ejecución, puedes usar el comando docker ps.

docker ps

Este comando lista todos los contenedores en ejecución. Deberías ver entradas para ambos contenedores: web (nginx) y redis.

También puedes revisar los logs de los servicios usando el comando docker-compose logs.

docker-compose logs

Esto mostrará los logs de todos los servicios. También puedes ver los logs de un servicio específico añadiendo el nombre del servicio, por ejemplo: docker-compose logs web.

Finalmente, como mapeamos el puerto 80 del contenedor nginx al puerto 8080 del host, puedes acceder a la página de bienvenida predeterminada de Nginx usando curl para acceder a localhost en el puerto 8080.

curl localhost:8080

Deberías ver el contenido HTML de la página de bienvenida de Nginx en la salida.

Forzar la detención de todos los servicios usando docker compose kill

En este paso, aprenderemos cómo forzar la detención de todos los servicios en ejecución definidos en nuestro archivo docker-compose.yml usando el comando docker compose kill. A diferencia de docker compose down que detiene los contenedores de forma ordenada y elimina los recursos, docker compose kill envía una señal específica a los contenedores para forzar su detención inmediata.

Asegúrate de estar en el directorio ~/project/my-compose-app.

cd ~/project/my-compose-app

Para forzar la detención de todos los servicios, simplemente ejecuta el comando docker compose kill sin especificar nombres de servicios. Por defecto, este comando envía una señal SIGKILL a los contenedores.

docker-compose kill

Deberías ver una salida que indica que los contenedores están siendo terminados.

Para verificar que los contenedores se han detenido, puedes usar nuevamente el comando docker ps.

docker ps

Esta vez, no deberías ver los contenedores web (nginx) y redis listados, ya que han sido detenidos.

También puedes usar docker ps -a para ver todos los contenedores, incluyendo los que están detenidos. Deberías ver los contenedores my-compose-app-web-1 y my-compose-app-redis-1 con un estado de "Exited".

docker ps -a

Forzar la detención de un servicio específico usando docker compose kill

En este paso, aprenderemos cómo forzar la detención de un servicio específico definido en nuestro archivo docker-compose.yml usando el comando docker compose kill seguido del nombre del servicio.

Primero, iniciemos nuevamente nuestros servicios para tener contenedores que detener. Asegúrate de estar en el directorio ~/project/my-compose-app.

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

Verifica que ambos contenedores estén en ejecución usando docker ps.

docker ps

Ahora, forcemos la detención solo del servicio web. Hacemos esto agregando el nombre del servicio web después del comando docker compose kill.

docker-compose kill web

Deberías ver una salida que indica que el contenedor web está siendo terminado.

Para verificar que solo el contenedor web ha sido detenido, usa nuevamente el comando docker ps.

docker ps

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

También puedes usar docker ps -a para ver todos los contenedores, incluyendo los detenidos. El contenedor my-compose-app-web-1 debería tener un estado de "Exited", mientras que el contenedor my-compose-app-redis-1 debería seguir mostrando "Up".

docker ps -a

Forzar la detención de servicios con una señal diferente usando docker compose kill -s

En este paso, exploraremos cómo usar el comando docker compose kill con la bandera -s para enviar una señal específica a los contenedores. Por defecto, docker compose kill envía una señal SIGKILL, que termina el proceso inmediatamente. Sin embargo, podrías querer enviar una señal diferente como SIGTERM, que es una solicitud para terminar el proceso de manera controlada.

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

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

Verifica que ambos contenedores estén ejecutándose usando docker ps.

docker ps

Ahora, forcemos la detención de todos los servicios usando la señal SIGTERM. Usamos la bandera -s seguida del nombre de la señal.

docker-compose kill -s SIGTERM

Deberías ver una salida indicando que los contenedores están siendo terminados con la señal especificada.

Para confirmar que los contenedores se han detenido, usa el comando docker ps.

docker ps

Ni el contenedor web ni el redis deberían aparecer como en ejecución.

Usando docker ps -a se mostrará que los contenedores han terminado.

docker ps -a

La capacidad de enviar diferentes señales es útil para apagados más controlados, permitiendo que las aplicaciones dentro de los contenedores realicen tareas de limpieza antes de terminar, si están configuradas para manejar esas señales.

Finalmente, para limpiar los contenedores detenidos y la red creada por Docker Compose, puedes usar el comando docker compose down.

docker-compose down

Este comando detendrá y eliminará los contenedores, redes y volúmenes definidos en el archivo docker-compose.yml.

Resumen

En este laboratorio, aprendimos cómo preparar un archivo Docker Compose simple definiendo múltiples servicios (web y redis) e instalamos Docker Compose. Luego iniciamos estos servicios usando el comando docker compose up. Posteriormente, exploramos cómo detener forzosamente todos los servicios en ejecución definidos en el archivo Compose usando docker compose kill, y cómo dirigirnos a un servicio específico para su terminación forzada con docker compose kill <nombre_servicio>. Finalmente, aprendimos cómo enviar una señal diferente a los servicios durante el proceso de terminación usando la bandera -s, como docker compose kill -s SIGKILL.