Estrategias para un apagado elegante
Cuando se trata de apagar de manera elegante contenedores Docker de ejecución prolongada, hay varias estrategias que se pueden emplear para garantizar un proceso de apagado fluido y controlado. Esta sección explorará algunas de las estrategias clave y las mejores prácticas para un apagado elegante.
Manejo de señales en su aplicación
Una de las estrategias más importantes para un apagado elegante es implementar el manejo de señales en su aplicación. Esto implica escribir código que escuche la señal SIGTERM
(o una alternativa) y realice las tareas de limpieza necesarias antes de que la aplicación salga.
A continuación, se muestra un ejemplo de cómo se podría implementar el manejo de señales en una aplicación Node.js:
process.on("SIGTERM", () => {
console.log("Received SIGTERM signal, starting graceful shutdown...");
// Perform cleanup tasks, such as:
// - Saving in-memory data to persistent storage
// - Closing network connections or database connections
// - Flushing logs or other output
// - Performing any other application-specific cleanup tasks
console.log("Graceful shutdown complete, exiting process.");
process.exit(0);
});
Al implementar este manejo de señales, su aplicación puede garantizar que realice un apagado controlado, minimizando el riesgo de pérdida de datos u otros problemas.
Uso de comprobaciones de salud y sondeos de actividad
Otra estrategia para un apagado elegante es utilizar las características integradas de comprobación de salud y sondeos de actividad de Docker. Estas características le permiten definir comprobaciones que Docker puede utilizar para determinar la salud y la preparación de su contenedor.
Durante el proceso de apagado, puede utilizar estos sondeos para indicar a Docker que su contenedor está en proceso de apagado, lo que permite que Docker espere a que se complete el apagado antes de eliminar el contenedor.
A continuación, se muestra un ejemplo de cómo se podría configurar una comprobación de salud y un sondeo de actividad en su contenedor Docker:
## Dockerfile
FROM node:14-alpine
COPY. /app
WORKDIR /app
CMD ["node", "server.js"]
HEALTHCHECK --interval=5s --timeout=3s \
CMD curl -f http://localhost:3000/healthz || exit 1
LABEL com.labex.shutdown.signal=SIGINT
LABEL com.labex.shutdown.timeout=60
En este ejemplo, la instrucción HEALTHCHECK
define una comprobación de salud que verifica el endpoint /healthz
en el servidor web del contenedor. Las instrucciones LABEL
definen la señal que se utilizará para el apagado elegante (SIGINT
) y el período de tiempo de espera (60 segundos).
Durante el proceso de apagado, su aplicación puede actualizar el endpoint de comprobación de salud para indicar que el apagado está en progreso, lo que permite que Docker espere a que se complete el apagado antes de eliminar el contenedor.
Aprovechamiento de marcos de orquestación
Si está ejecutando sus contenedores Docker en un marco de orquestación como Kubernetes o Docker Swarm, puede aprovechar las características integradas de estos marcos para ayudar con el apagado elegante.
Por ejemplo, en Kubernetes, puede utilizar el hook preStop
para ejecutar un comando o script que realice tareas de limpieza antes de que se termine el contenedor. También puede utilizar el campo terminationGracePeriodSeconds
para especificar la cantidad de tiempo que se debe dar al contenedor para apagarse de manera elegante.
A continuación, se muestra un ejemplo de cómo se podría configurar una implementación de Kubernetes con un hook preStop
y un período de terminación elegante:
## kubernetes-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: my-app:latest
ports:
- containerPort: 3000
lifecycle:
preStop:
exec:
command: ["/app/shutdown.sh"]
terminationGracePeriodSeconds: 60
En este ejemplo, el hook preStop
ejecuta un script (/app/shutdown.sh
) que realiza cualquier tarea de limpieza necesaria antes de que se termine el contenedor. El campo terminationGracePeriodSeconds
da al contenedor 60 segundos para apagarse de manera elegante antes de que se lo termine forzosamente.
Al aprovechar estas características del marco de orquestación, puede mejorar aún más la confiabilidad y la previsibilidad de su proceso de apagado de contenedores.