El HEALTHCHECK de Docker

En esta entrada veremos brevemente el concepto de que un contenedor tenga estado saludable (healthy) o no saludable (unhealthy) usando la instrucción HEALTHCHECK en Docker y como utilizarlo, esta es una característica más de Docker que se utiliza para comprobar si un servicio o programa está funcionando en un contenedor correctamente, es decir que está realizando su función y no se ha parado por ejemplo. Así el propio contenedor enviará chequeos periódicamente al servicio que está funcionando dentro, verificando la salida de la respuesta si es correcta o no y modificando el contenedor al estado correspondiente según la salida.

Los estados de salida son:

  • 0: healthy - el contenedor se encuentra funcionando y en estado saludable
  • 1: unhealthy - el contenedor no funciona correctamente y cambia a estado no saludable
  • 2: reserved - código reservado, no se debe usar este código de salida

Para activar esta característica se puede usar el comando HEALTHCHECK en el Dockerfile al crear la imagen o se puede configurar directamente en el docker-compose.yml como veremos a continuación

HEALTHCHECK en Dockerfile

La sintaxis sería de la siguiente forma:

HEALTHCHECK [OPTIONS] CMD command

Las opciones configurables para lanzar el comando de comprobación son:

  • –interval=DURATION (default: 30s) // intervalo en el que se lanzará el comando
  • –timeout=DURATION (default: 30s) // duración máxima de la ejecución del comando
  • –start-period=DURATION (default: 0s) // tiempo de inicio antes de lanzar el comando, es interesante si nuestro contenedor tarda en arrancar
  • –retries=N (default: 3) // Número máximo de intentos antes de declarar el contenedor como no saludable
HEALTHCHECK --interval=5m --timeout=3s \
  CMD curl -f http://localhost/ || exit 1

Si se quieren deshabilitar las comprobaciones en el Dockerfile al crear la imagen se puede añadir la siguiente instrucción y deshabilitará todas la comprobaciones declaradas.

HEALTHCHECK NONE

HEALTHCHECK en docker-compose (añadido en la versión 2.1)

Se puede configurar el HEALTHCHECK directamente en el archivo docker-compose.yml sin tener que construir de nuevo la imagen con la siguiente estructura:

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost"]
  interval: 1m30s
  timeout: 10s
  retries: 3
  start_period: 40s

En los parámetros interval, timeout and start_period se declaran los tiempos de comprobación, y en el parámetro test: se puede especificar “NONE”, “CMD” o “CMD-SHELL” como primer elemento de la lista, si se declara CMD-SHELL el segundo elemento de la lista puede ser una cadena de texto completando el comando:

test: ["CMD", "curl", "-f", "http://localhost"]

test: ["CMD-SHELL", "curl -f http://localhost || exit 1"]

Y su equivalente:

test: curl -f https://localhost || exit 1

Para deshabilitar la comprobación en el contenedor se usa la siguiente instrucción que es equivalente a test: ["NONE"]

healthcheck:
  disable: true

De esta forma no solo estaremos seguros de que el contenedor funciona en la máquina, también si el servicio que contiene está funcionando de forma correcta, sino el contenedor se declaría no saludable ya que cuando hay un cambio de estado se genera un evento health_status actualizando el estado del contenedor a no saludable (unhealthy).

Por ahora eso es todo, espero que os sirva en vuestros despliegues de Docker para mejorar el control de las aplicaciones, nos leemos en la próxima entrada.