Cómo asegurarse de que un contenedor Docker se apague correctamente

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

Los contenedores Docker se han convertido en una parte esencial del desarrollo y despliegue de software moderno. Asegurarse de que estos contenedores se apaguen correctamente es crucial para mantener la estabilidad y confiabilidad de sus aplicaciones. Este tutorial lo guiará a través del proceso de detener los contenedores Docker de manera elegante y explorará las mejores prácticas para el apagado de contenedores.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker/ContainerOperationsGroup -.-> docker/start("Start Container") docker/ContainerOperationsGroup -.-> docker/stop("Stop Container") docker/ContainerOperationsGroup -.-> docker/restart("Restart Container") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ContainerOperationsGroup -.-> docker/logs("View Container Logs") subgraph Lab Skills docker/start -.-> lab-417757{{"Cómo asegurarse de que un contenedor Docker se apague correctamente"}} docker/stop -.-> lab-417757{{"Cómo asegurarse de que un contenedor Docker se apague correctamente"}} docker/restart -.-> lab-417757{{"Cómo asegurarse de que un contenedor Docker se apague correctamente"}} docker/rm -.-> lab-417757{{"Cómo asegurarse de que un contenedor Docker se apague correctamente"}} docker/logs -.-> lab-417757{{"Cómo asegurarse de que un contenedor Docker se apague correctamente"}} end

Comprender el ciclo de vida de los contenedores Docker

Para comprender completamente el ciclo de vida de los contenedores Docker, es importante conocer los diferentes estados en los que puede estar un contenedor y cómo transita entre estos estados.

Estados de los contenedores

Los contenedores Docker pueden existir en los siguientes estados:

  1. Creado (Created): El contenedor se ha creado pero no se ha iniciado.
  2. En ejecución (Running): El contenedor está actualmente en ejecución y ejecutando su proceso principal.
  3. Pausado (Paused): El proceso principal del contenedor se ha pausado, pero el contenedor sigue activo.
  4. Detenido (Stopped): El contenedor se ha detenido y su proceso principal ha finalizado.
  5. Reiniciando (Restarting): El contenedor se está reiniciando actualmente.
  6. Eliminando (Removing): El contenedor está en proceso de ser eliminado del sistema.
stateDiagram-v2 [*] --> Created Created --> Running Running --> Paused Paused --> Running Running --> Stopped Stopped --> Running Stopped --> [*] Running --> Restarting Restarting --> Running Running --> Removing Removing --> [*]

Gestión del ciclo de vida de los contenedores

El motor de Docker gestiona el ciclo de vida de los contenedores, asegurándose de que se creen, inicien, detengan y eliminen según sea necesario. Esto se logra a través de varios comandos de Docker, como docker run, docker stop, docker start y docker rm.

Cuando se crea un contenedor, está en el estado "Creado (Created)". Para iniciar el contenedor, se utiliza el comando docker start, que transita el contenedor al estado "En ejecución (Running)". Mientras el contenedor está en ejecución, se puede pausar utilizando docker pause, lo que lo coloca en el estado "Pausado (Paused)". Para reanudar el contenedor, se utiliza docker unpause.

Para detener un contenedor en ejecución, se utiliza el comando docker stop, que apaga de manera elegante el proceso principal del contenedor y lo transita al estado "Detenido (Stopped)". Si es necesario reiniciar un contenedor detenido, se puede utilizar nuevamente el comando docker start.

Finalmente, para eliminar un contenedor del sistema, se utiliza el comando docker rm, que transita el contenedor al estado "Eliminando (Removing)" y lo elimina permanentemente.

## Create a new container

## Start the container

## Pause the container

## Unpause the container

## Stop the container

## Start the stopped container

## Remove the container

Al entender los diferentes estados en los que puede estar un contenedor Docker y los comandos utilizados para gestionar su ciclo de vida, se puede controlar y monitorear de manera efectiva el comportamiento de los contenedores.

Detener contenedores Docker de manera elegante

Cuando se trata de detener contenedores Docker, es importante hacerlo de manera elegante para garantizar un proceso de apagado fluido y prevenir posibles pérdidas de datos o problemas en la aplicación.

El comando docker stop

El comando principal utilizado para detener un contenedor Docker en ejecución es docker stop. Este comando envía una señal SIGTERM al proceso principal del contenedor, dándole un período de gracia (por defecto, 10 segundos) para realizar un apagado limpio antes de terminar forzosamente el proceso con una señal SIGKILL.

docker stop [OPTIONS] CONTAINER [CONTAINER...]

Las [OPTIONS] pueden incluir:

  • -t, --time=: Segundos a esperar para que el contenedor se detenga antes de terminarlo (por defecto, 10 segundos).

Estrategias de apagado elegante

Para garantizar un apagado elegante de sus contenedores Docker, puede implementar las siguientes estrategias:

  1. Manejar la señal SIGTERM: Asegúrese de que el proceso principal de su aplicación escuche la señal SIGTERM y realice un apagado limpio, como vaciar datos, cerrar conexiones y liberar recursos.

  2. Utilizar un script de apagado: Cree un script personalizado que se ejecute como punto de entrada o comando del contenedor. Este script puede manejar la señal SIGTERM y realizar los procedimientos de apagado necesarios antes de que el contenedor salga.

#!/bin/bash

## Trap the SIGTERM signal and perform a graceful shutdown
trap 'echo "Received SIGTERM signal, performing graceful shutdown..."; \
     your_shutdown_logic; \
     exit 0;' SIGTERM

## Run your application's main process
your_application_command
  1. Aprovechar las comprobaciones de salud (Healthchecks): Configure una comprobación de salud de Docker que verifique la preparación y disponibilidad de la aplicación. Esto puede ayudar a garantizar que el contenedor esté en un estado saludable antes de intentar detenerlo.
## Dockerfile
HEALTHCHECK --interval=5s --timeout=3s \
 CMD your_healthcheck_command || exit 1
  1. Establecer una opción --time razonable: Cuando utilice docker stop, considere establecer un período de gracia razonable utilizando la opción --time, lo que permite a su aplicación tener suficiente tiempo para realizar un apagado elegante.
docker stop --time=30 my-container

Al implementar estas estrategias, puede garantizar que sus contenedores Docker se detengan de manera controlada y confiable, minimizando el riesgo de pérdidas de datos o problemas en la aplicación.

Mejores prácticas para el apagado de contenedores

Para garantizar un apagado confiable y eficiente de los contenedores Docker, considere las siguientes mejores prácticas:

Implementar el manejo de apagado elegante

Como se discutió en la sección anterior, es crucial manejar la señal SIGTERM y realizar un apagado elegante de su aplicación. Esto implica:

  1. Escuchar la señal SIGTERM en el proceso principal de su aplicación.
  2. Ejecutar la lógica de limpieza y apagado necesaria, como vaciar datos, cerrar conexiones y liberar recursos.
  3. Salir del proceso de manera limpia después de que se complete el apagado.

Utilizar un script de apagado

Aproveche un script de apagado personalizado que se ejecute como punto de entrada o comando del contenedor. Este script puede manejar la señal SIGTERM y orquestar el proceso de apagado, asegurando un apagado consistente y confiable en todos sus contenedores.

#!/bin/bash

## Trap the SIGTERM signal and perform a graceful shutdown
trap 'echo "Received SIGTERM signal, performing graceful shutdown..."; \
     your_shutdown_logic; \
     exit 0;' SIGTERM

## Run your application's main process
your_application_command

Configurar comprobaciones de salud (Healthchecks)

Configure comprobaciones de salud de Docker para verificar la preparación y disponibilidad de su aplicación. Esto puede ayudar a garantizar que el contenedor esté en un estado saludable antes de intentar detenerlo, reduciendo el riesgo de problemas durante el proceso de apagado.

## Dockerfile
HEALTHCHECK --interval=5s --timeout=3s \
 CMD your_healthcheck_command || exit 1

Establecer la opción --time adecuada

Cuando utilice el comando docker stop, considere establecer un período de gracia razonable utilizando la opción --time. Esto permite a su aplicación tener suficiente tiempo para realizar un apagado elegante, reduciendo la probabilidad de pérdidas de datos o problemas en la aplicación.

docker stop --time=30 my-container

Monitorear el apagado de los contenedores

Monitoree de cerca el proceso de apagado de sus contenedores, especialmente durante implementaciones o operaciones de escalado. Observe los registros y métricas del contenedor para identificar cualquier problema o comportamiento inesperado durante la fase de apagado.

Implementar políticas de reinicio

Configure políticas de reinicio adecuadas para sus contenedores, como always, on-failure o unless-stopped. Esto puede ayudar a garantizar que sus contenedores se reinicien automáticamente en caso de apagados inesperados o fallos.

## docker-compose.yml
version: "3"
services:
  my-app:
    restart_policy:
      condition: on-failure

Al seguir estas mejores prácticas, puede garantizar un apagado confiable y controlado de sus contenedores Docker, minimizando el riesgo de pérdidas de datos o problemas en la aplicación.

Resumen

En este tutorial, ha aprendido cómo asegurarse de que sus contenedores Docker se apaguen correctamente. Al entender el ciclo de vida de los contenedores, implementar técnicas de detención elegante y seguir las mejores prácticas, puede administrar eficazmente sus aplicaciones basadas en Docker y evitar problemas inesperados. Apagar correctamente los contenedores es un aspecto crítico del uso de Docker, y este conocimiento le ayudará a mantener una infraestructura robusta y confiable.