Chargement

Comment (et pourquoi) ajouter une vérification de l'état de santé sur vos conteneurs Docker

4 min de lecture

Cloud Docker DevOps
Comment (et pourquoi) ajouter une vérification de l'état de santé sur vos conteneurs Docker
Photo by justin beck / Unsplash

Vous avez construit votre image Docker, l'avez poussée vers votre registre et avez démarré un nouveau conteneur en production. Tout fonctionne alors que vous rentrez chez vous pour la journée, mais vous êtes confronté à des rapports de panne à votre retour le lendemain matin. Votre conteneur fonctionne toujours, mais il ne répond pas aux demandes.

Ce scénario peut sembler familier aux équipes d'exploitation qui travaillent avec Docker. Voici comment utiliser la fonction de vérification de l'état de santé de vos conteneurs Docker pour obtenir des données précises sur la disponibilité de vos services.

Comment fonctionne la vérification de l'état de santé

Les contrôles de santé permettent à un conteneur d'exposer la disponibilité de sa charge de travail. Il ne s'agit pas de savoir si le conteneur est en cours d'exécution. Si votre base de données tombe en panne, votre serveur API ne sera pas en mesure de traiter les demandes, même si son conteneur Docker est toujours en cours d'exécution.

Cela donne lieu à des expériences peu utiles lors du dépannage. Un simple docker ps indique que le conteneur est disponible. L'ajout d'un contrôle de santé étend la sortie de docker ps pour inclure l'état réel du conteneur.

Vous configurez les contrôles de santé des conteneurs dans votre Dockerfile. Celui-ci accepte une commande que le démon Docker exécutera toutes les 30 secondes. Docker utilise le code de sortie de la commande pour déterminer l'état de santé de votre conteneur :

  1. Le conteneur est sain et fonctionne normalement.
  2. Le conteneur n'est pas en bonne santé ; la charge de travail peut ne pas fonctionner.
  3. Ce code d'état est réservé par Docker et ne doit pas être utilisé.

Lorsque HEALTHCHECK est présent dans un Dockerfile, vous verrez l'état de santé du conteneur dans la colonne STATUS lorsque vous exécutez docker ps.

L'état de santé n'est pas vérifié immédiatement lorsque les conteneurs sont créés. L'état sera indiqué comme démarrant avant que la première vérification ne soit exécutée. Cela donne au conteneur le temps d'exécuter les tâches de démarrage. Un conteneur dont l'état de santé a été vérifié avec succès s'affiche comme sain ; un conteneur en mauvaise santé s'affiche comme non sain.

Écrire les commandes de contrôle de santé

Les contrôles de santé des conteneurs sont configurés avec l'instruction HEALTHCHECK dans votre Dockerfile. Vous devez utiliser une commande de vérification de l'état de santé appropriée pour votre conteneur. Pour les serveurs web, curl vous offre un moyen simple d'effectuer un contrôle de base de la disponibilité. Effectuez un ping sur un point de terminaison connu qui devrait être disponible lorsque votre service est en service.

FROM nginx:latest
HEALTHCHECK CMD curl --fail http://localhost/api/healthcheck || exit 1

Dans cet exemple, le conteneur serait marqué comme étant non sain si le point de terminaison /api/healthcheck de votre serveur émettait un état d'erreur.
Vous pouvez utiliser docker inspect pour voir la sortie des commandes de contrôle de santé. Ceci est utile lorsque vous déboguez votre instruction HEALTHCHECK.

docker inspect --format='{{json .State.Health}}' my-container

Remplacez my-container par l'ID ou le nom du conteneur que vous souhaitez inspecter. Ces détails sont affichés dans la sortie docker ps.


Personnaliser les bilans de santé

Docker vous permet de personnaliser la fréquence des contrôles de santé. Vous pouvez également modifier les critères qui marquent un conteneur comme étant non sain.

Quatre options sont disponibles :

  • --intervalle - Définit le temps entre les contrôles de santé. Ceci vous permet de remplacer la valeur par défaut de 30 secondes. Utilisez un intervalle plus élevé pour augmenter le temps entre les contrôles. Ceci est utile si vous avez un service de faible priorité pour lequel des contrôles de santé réguliers pourraient avoir un impact sur les performances. Utilisez une fréquence plus régulière pour les services critiques.

  • --start-period - Définit la durée après le démarrage d'un conteneur pendant laquelle les contrôles de santé doivent être ignorés. La commande sera quand même exécutée mais un état non sain ne sera pas comptabilisé. Cela donne aux conteneurs le temps de terminer les procédures de démarrage.

  • --retries - Cette option vous permet d'exiger plusieurs échecs successifs avant qu'un conteneur ne soit marqué comme étant en mauvaise santé. La valeur par défaut est de 3. Si un contrôle de santé échoue mais que le suivant est réussi, le conteneur ne passera pas à l'état non sain. Il deviendra malsain après trois échecs consécutifs.

  • --timeout - Définit le délai d'attente pour les commandes de contrôle de santé. Docker considérera que le contrôle a échoué si la commande ne se termine pas dans ce délai.

Les options sont transmises comme des drapeaux à l'instruction HEALTHCHECK. Il faut les fournir avant la commande de contrôle de santé :

HEALTHCHECK --interval=60s --retries=5 CMD curl --fail http://localhost || exit 1

Cette configuration demande à Docker d'exécuter curl toutes les 60 secondes. Le conteneur sera marqué comme étant en mauvaise santé si cinq tests consécutifs ont un code de sortie non nul.


Format des commandes

La syntaxe de la commande HEALTHCHECK supporte soit un simple CMD, soit un tableau exec de type point d'entrée. Vous pouvez également passer NONE au lieu de CMD pour désactiver les contrôles de santé :

HEALTHCHECK NONE

Cela vous permet d'inhiber les contrôles de santé de votre image de base. Chaque instruction HEALTHCHECK remplace toutes les instructions précédentes dans les calques de votre image.


Qu'en est-il de Docker Compose ?

Docker Compose prend également en charge les définitions de contrôle de santé. Ajoutez une section healthcheck à votre service :

version: "3"
services:
  app:
    image: nginx:latest
    ports:
      - 80:80
    healthcheck:
      test: curl --fail http://localhost || exit 1
      interval: 10s
      retries: 5
      start_period: 5s
      timeout: 10s

La propriété test définit la commande à exécuter. Les autres propriétés correspondent aux paramètres acceptés par l'instruction HEALTHCHECK dans le Dockerfile.


Résumé

La définition d'une instruction HEALTHCHECK facilite le diagnostic d'un conteneur qui se comporte mal. Vous pouvez suivre l'état de préparation de votre charge de travail indépendamment de l'état d'exécution du conteneur.

Les contrôles de santé sont compatibles avec toute commande qui émet un code de sortie 0 ou 1. Vous pouvez utiliser des commandes courantes comme curl et ping pour inspecter les services Web et les bases de données. Pour un contrôle plus avancé, écrivez un script dédié et incluez-le dans vos images.


Rédigé par INSYS INSYS

Partager sur

Recommandé pour vous

Microsoft Defender for Cloud peut désormais protéger Google Cloud

Microsoft Defender for Cloud peut désormais protéger Google Cloud

Microsoft a annoncé récemment que Microsoft Defender pour le cloud est désormais également doté d'une protection native pour les environnements Google Cloud Platform (GCP), fournissant des recommandations de sécurité et la détection des menaces dans les clouds.

Microsoft annonce le "hotpatching" pour les machines virtuelles Windows Server Azure

Microsoft annonce le "hotpatching" pour les machines virtuelles Windows Server Azure

Microsoft a annoncé la disponibilité générale du hotpatching pour les machines virtuelles de Windows Server Azure Edition, permettant la mise à jour sans redémarrage du serveur.

Microsoft repousse une attaque DDoS record de 3,47 Tbps contre les clients Azure

Microsoft repousse une attaque DDoS record de 3,47 Tbps contre les clients Azure

Microsoft a révélé cette semaine qu'il avait repoussé un nombre record d'attaques par déni de service distribué (DDoS) visant ses clients en 2021, dont une ayant dépassé 3,47 térabits par seconde (Tbps).