Docker Health check, comment vérifier la santé de vos containers?

La version 1.12 de Docker est sortit il y a quelques mois maintenant, l’occasion pour cet article de revenir sur une fonctionnalité intéressante, l’instruction HEALTHCHECK qui permet de vérifier la santé de vos containers.

Avec Docker, vous pouvez voir assez facilement les containers lancés ou stoppés, un petit « docker ps » ou un appel REST suffit, mais qu’en est-il du processus à l’intérieur de votre container? Est-ce que votre application est toujours opérationnel ou est-elle en train de freezer? C’est à cette question que va répondre la fonctionnalité Docker Health Check.

Grâce à l’instruction HEALTHCHECK à utiliser dans vos Dockerfile, vous allez pouvoir vérifier régulièrement si votre application est toujours en vie, et transmettre cette information aux outils d’orchestration et de monitoring.

Voici un exemple d’une instruction HEALTHCHECK à ajouter dans votre Dockerfile pour une application web

HEALTHCHECK CMD curl --fail http://localhost:8080 || exit 1

En ajoutant cette instruction dans le Dockerfile de construction de votre image, Docker va exécuter régulièrement la commande curl. Si l’application retourne un code 200, l’application est considéré en bonne santé (healthy)

L’information est dès lors visible lors d’un docker ps

docker-health-starting

Heath check au démarrage

Une fois l’application démarré
docker-healthy2

Si votre application se met à retourner autre chose qu’un code 200, votre conteneur va passer au status unhealthy après plusieurs essais.

docker-unhealthy

La même information est également disponible avec la commande docker inspect

docker inspect -f '{{json .State.Health.Status}}' container1

Par défaut, la commande HEALTHCHECK est exécuté toutes les 30 secondes, le container est considéré comme « unhealthy » à partir du troisième échec, mais c’est paramétrable comme le montre cette exemple ci-dessous.

HEALTHCHECK --interval=5s --timeout=3s --retries=3 \
CMD curl -f http://localhost:8080 || exit 1

Orchestration

Le changement de santé d’un container génère un évenement Docker, les outils de monitoring et d’orchestration sont donc notifié de chaque changement de status et peuvent agir en conséquence.

Un orchestrateur pourrait par exemple décider de remplacer le container malade en démarrant une nouvelle instance.

La plupart des orchestrateurs du marché utilise cette information pour savoir si l’application est réellement prête ou non. Swarm ne redirige le trafic vers le nouveau container qu’une fois le status passé de « starting » à « health ».

Bonus Spring Boot

Si vous utiliser Spring Boot et Actuator, vous savez déjà que Spring expose une url pour indiquer le status de l’application /health (UP ou DOWN).

Vous pouvez donc utiliser cette information bien plus précise qu’un code retour HTTP

Voila donc la commande HEALTHCHECK pour votre application Spring

HEALTHCHECK CMD curl -v --silent http://localhost:8080/health 2>&1 | grep UP