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 :
- Le conteneur est sain et fonctionne normalement.
- Le conteneur n'est pas en bonne santé ; la charge de travail peut ne pas fonctionner.
- 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.