<p>Le mécanisme de healthcheck n'est pas une nouveauté dans Docker... Présent depuis la version 1.12 ce mécanisme reste pourtant peu utilisé...</p>
<p>Tout d'abord l'instruction <code>HEALTHCHECK</code> , c'est quoi ?</p>
<p>Elle indique à Docker comment tester votre container pour vérifier qu'il fonctionne toujours correctement ( Oui oui, j'ai réussi à vous traduire la documentation officielle ) :</p>
<blockquote>
<p>The <code>HEALTHCHECK</code> instruction tells Docker how to test a container to check that it is still working. This can detect cases such as a web server that is stuck in an infinite loop and unable to handle new connections, even though the server process is still running.</p>
</blockquote>
<p>Nous avions déjà pu voir comment relancer automatiquement un container dont le processus principal ( vous savez le programme qui prend le <code>PID 1</code> dans votre container ) ne fonctionne plus, et ceci à l'aide de l'instruction <code>restart.</code></p>
<p>Mais voilà, dans votre malheur le <code>PID 1</code> de votre instance est toujours actif mais pourtant il ne remplit plus son rôle :</p>
<blockquote>
<p>Par exemple <code>nginx</code> est toujours <i>UP</i> mais il ne dessert plus vos pages correctement et/ou vous remonte une erreur <i><strong>404/503 </strong></i>!</p>
</blockquote>
<p><br>Dans ce moment là, plusieurs solutions :</p>
<ul>
<li>La supervision finit par vous remonter l'information et vous intervenez ( de façon automatique ou non ),</li>
<li>On intègre un healthcheck à notre service pour vérifier sa bonne santé et ainsi avoir l'information en temps réel.</li>
</ul>
<h1><strong>Healthcheck</strong></h1>
<p>Il est possible de déclarer un <code>HEALTHCHECK</code> de deux façons :</p>
<ul>
<li>Dans votre fichier <code>Dockerfile</code> avant de build votre image,</li>
<li>Lors de la déclaration du service dans le fichier docker-compose.</li>
</ul>
<p>Plutôt que de long discours, voyons par l'exemple la différence entre ces deux types de déclarations.</p>
<p>🚩 Alors oui il est nécessaire d'installer <code>curl</code> qui n'est pas présent dans l'image. Pour les personnes qui souhaitent pousser la réflexion plus loin, voici un <ahref="https://blog.sixeyed.com/docker-healthchecks-why-not-to-use-curl-or-iwr/">article très intéressant</a>. 🚩</p>
<p>Voici la liste des options qu'il est possible d'ajouter avant <code><i>CMD</i></code> :</p>
<p><code>Ghost</code> étant une application web, l'utilisation de <code>curl</code> ou <code>wget</code> comme commande de vérification vient immédiatement à l'esprit.</p>
<p>Ici on vérifie qu'une page web est présente et renvoie un code de retour <code>200</code> à l'adresse <ahref="http://localhost:2368/"><code>http://localhost:2368</code></a>.</p>
<li><strong>Starting</strong>: Votre container est en cours de démarrage.</li>
<li><strong>Healthy</strong>: La commande de check renvoie un <i>success.</i> Votre container est fonctionnel.</li>
<li><strong>Unhealthy</strong>: Votre container ne fonctionne pas correctement !</li>
</ul>
<p>On peut constater lors de mon <code>docker ps</code> que notre container est toujours en cours de démarrage : nous avons eu un retour <code>starting</code>.</p>
<p>Vérifions de nouveau quelques secondes plus tard :</p>
<pre><codeclass="language-plaintext">$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a3435a4d95fd ghost:healthcheck "docker-entrypoint.s…" About a minute ago Up About a minute (healthy) 0.0.0.0:2368->2368/tcp some-ghost</code></pre>
<p>Il est donc relativement simple d'ajouter ce mécanisme à votre image !</p>
<p>Toutefois le principal problème lié à cette méthode, est que la vérification est alors générique. Il peut être nécessaire de rendre vos checks plus "personnels", par container.</p>
<p>Il existe d'ailleurs un second inconvénient : votre image n'est peut-être tout simplement pas prévu "<i>seulement"</i> pour Docker. Kubernetes intègre par exemple ses propres mécanismes, et vous souhaiterez probablement les utiliser...</p>
<p>Le fonctionnement est identique à celui que nous venons de voir lors d'une utilisation de l'instruction au sein d'un fichier <code>Dockerfile</code>. ( ouf 😂 )</p>
<p>Enfin sachez qu'il est tout simplement possible de désactiver dans votre <code>docker-compose</code> un healthcheck créé dans une image à l'aide de l'instruction suivante :</p>