Tabla de Contenidos

Healthcheck con Docker

Contenido perteneciente al curso Docker avanzado

Comprobación de “salud” del contenedor: revisar si el servicio está funcionando de forma adecuada.

Docker permite lanzar una comprobación, pero esta comprobación depende de nosotros. No es lo mismo comprobar que responda al puerto 80, que hacer comprobaciones más complejas.

Podemos hacer healthchecks en 3 partes:

Healthcheck en imágenes

En un Dockerfile:

RUN echo "#!/bin/bash\n\nservice nginx status || exit 1" > /opt/healthcheck.sh
# con curl:
# RUN echo "#!/bin/bash\n\n curl -f http://localhost/ || exit 1" > /opt/healthcheck.sh
RUN chmod +x /opt/healthcheck.sh

FROM nginx

HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 CMD ["/opt/healthcheck.sh"]
# HEALTHCHECK --interval=10s --timeout=10s --start-period=5s --retries=3 CMD curl -f http://localhost:80 || exit 1

Otra opción:

HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
    CMD [ $(curl -I -s http://127.0.0.1:8000 | head -n 1 | cut -d' ' -f2 | head -n 1) -eq 200 ] || exit 1

Al ver el estado del contenedor:

docker ps

Docker Compose

services:
  web:
    image: nginx
    
    healthcheck:
      interval: 5s
      timeout: 5s
      start_period: 10s
      retries: 3
      test: curl -f http://localhost || exit 1

A través de otro contenedor específico

Hay contenedores que permiten monitorizar el estado de contenedores y reiniciar aquellos unhealthy. Por ejemplo: Docker Autoheal

docker run -d \
    --name autoheal \
    --restart=always \
    -e AUTOHEAL_CONTAINER_LABEL=all \
    -v /var/run/docker.sock:/var/run/docker.sock \
    willfarrell/autoheal

Podemos incluirlo en un Compose:

services:
  web:
    image: nginx
 
    # marcamos que queremos que actúe el Auto heal
    labels:
      - autoheal=true
    healthcheck:
      interval: 5s
      timeout: 5s
      start_period: 10s
      retries: 3
      test: curl -f http://localhost || exit 1

  autoheal:
    image: willfarrell/autoheal
    restart: always
    environment:
      - AUTOHEAL_CONTAINER_LABEL=all
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock