Hoe (en waarom) u statuscontroles toevoegt aan uw Docker-containers

0
191

Je hebt je Docker-image gebouwd en naar je register gepusht en startte een nieuwe container in productie. Alles werkt terwijl je naar huis gaat, maar je krijgt storingsmeldingen als je de volgende ochtend terugkomt. Uw container is nog steeds actief, maar hij dient geen verzoeken in.

Dit scenario kan onaangenaam bekend zijn bij operationele teams die met Docker werken. Hier leest u hoe u de statuscontrolefunctie van Docker kunt gebruiken om nauwkeurige gegevens over de beschikbaarheid van uw diensten te krijgen.

Hoe gezondheidscontroles werken< /h2>

Met statuscontroles kan een container de beschikbaarheid van zijn werkbelasting blootleggen. Dit staat los van of de container draait. Als je database uitvalt, kan je API-server geen verzoeken verwerken, ook al draait de Docker-container nog steeds.

Dit zorgt voor nutteloze ervaringen tijdens het oplossen van problemen. Een eenvoudige docker ps zou de container als beschikbaar melden. Door een statuscontrole toe te voegen, wordt de uitvoer van de docker ps uitgebreid met de ware status van de container.

U configureert containerstatuscontroles in uw Dockerfile. Dit accepteert een opdracht die de Docker-daemon elke 30 seconden uitvoert. Docker gebruikt de exit-code van het commando om de gezondheid van uw container te bepalen:

  • 0 – De container is gezond en werkt normaal.
  • 1 – De container is ongezond; de werklast werkt mogelijk niet.
  • 2 – Deze statuscode is gereserveerd door Docker en mag niet worden gebruikt.

Advertentie

Als HEALTHCHECK aanwezig is in een Dockerfile, ziet u de gezondheid van de container in de STATUS-kolom wanneer u docker ps uitvoert.

Gezondheid wordt niet meteen gecontroleerd wanneer containers worden gemaakt. De status wordt weergegeven als startend voordat de eerste controle wordt uitgevoerd. Dit geeft de container de tijd om opstarttaken uit te voeren. Een container met een geslaagde gezondheidscontrole wordt als gezond weergegeven; een ongezonde container wordt ongezond weergegeven.

Gezondheidscontrole-opdrachten schrijven

Containerstatuscontroles worden geconfigureerd met de HEALTHCHECK-instructie in uw Dockerfile. U moet een opdracht voor de statuscontrole gebruiken die geschikt is voor uw container. Voor webservers biedt curl u een gemakkelijke manier om een ​​basisgereedheidscontrole uit te voeren. Ping een bekend eindpunt dat beschikbaar zou moeten zijn wanneer uw service beschikbaar is.

VAN nginx:latest HEALTHCHECK CMD curl –fail http://localhost/api/healthcheck || afrit 1

In dit voorbeeld zou de container als ongezond worden gemarkeerd als het /api/healthcheck-eindpunt van uw server een foutstatus afgeeft.

U kunt docker inspect gebruiken om de uitvoer van health check-opdrachten te zien. Dit is handig wanneer u uw HEALTHCHECK-instructie debugt.

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

Vervang mijn-container door de ID of naam van de container die u wilt inspecteren. Deze details worden weergegeven in de uitvoer van docker ps.

Gezondheidscontroles aanpassen

Advertentie

Met Docker kunt u de frequentie van statuscontroles aanpassen. U kunt ook de criteria wijzigen die een container als ongezond markeren.

Er zijn vier opties beschikbaar:

  • –interval – Stel de tijd tussen de gezondheidscontroles in. Hiermee kunt u de standaardwaarde van 30 seconden overschrijven. Gebruik een hoger interval om de tijd tussen controles te verlengen. Dit is handig als u een service met lage prioriteit heeft waarbij regelmatige statuscontroles de prestaties kunnen beïnvloeden. Gebruik een meer regelmatige frequentie voor kritieke diensten.
  • –start-periode – Stel de duur in nadat een container is gestart wanneer statuscontroles moeten worden genegeerd. De opdracht wordt nog steeds uitgevoerd, maar een ongezonde status wordt niet geteld. Dit geeft containers de tijd om opstartprocedures te voltooien.
  • –retries– Hierdoor kunt u meerdere opeenvolgende fouten vereisen voordat een container als ongezond wordt gemarkeerd. De standaardwaarde is 3. Als een statuscontrole mislukt, maar de volgende slaagt, wordt de container niet overgezet naar ongezond. Het wordt ongezond na drie opeenvolgende mislukte controles.
  • –timeout – Stel de time-out in voor opdrachten voor statuscontrole. Docker behandelt de controle als mislukt als de opdracht niet binnen deze tijd wordt afgesloten.

Opties worden als vlaggen doorgegeven aan de HEALTHCHECK-instructie. Geef ze op vóór het health check-commando:

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

Deze configuratie geeft Docker de opdracht om elke 60 seconden curl uit te voeren. De container wordt als ongezond gemarkeerd als vijf opeenvolgende tests een afsluitcode hebben die niet nul is.

Opdrachtindeling

De syntaxis van de HEALTHCHECK-opdracht ondersteunt ofwel een gewone CMD of een exec-array in entrypoint-stijl. U kunt ook NONE doorgeven in plaats van CMD om gezondheidscontroles uit te schakelen:

HEALTHCHECK NONE

Hiermee kunt u de gezondheidscontroles van uw basisimage blokkeren. Elke HEALTHCHECK-instructie overschrijft alle eerdere instructies in de lagen van uw afbeelding.

Hoe zit het met Docker Compose?

Docker Compose ondersteunt ook definities van statuscontroles. Voeg een healthcheck-sectie toe aan uw service:.

version: "3" services: app: afbeelding: nginx: nieuwste poorten: – 80:80 healthcheck: test: curl –fail http://localhost || exit 1 interval: 10s nieuwe pogingen: 5 start_period: 5s time-out: 10s Advertentie

De testtoets definieert de opdracht die moet worden uitgevoerd. De andere toetsen komen overeen met de parameters die worden geaccepteerd door de Dockerfile HEALTHCHECK-instructie.

Samenvatting

Het instellen van een HEALTHCHECK-instructie maakt het gemakkelijker om een ​​zich misdragende container te diagnosticeren. U kunt de gereedheid van uw werklast volgen, onafhankelijk van de “running” staat.

Gezondheidscontroles zijn compatibel met elk commando dat een 0 of 1 exit code geeft. U kunt algemene opdrachten zoals curl en ping gebruiken om webservices en databases te inspecteren. Voor meer geavanceerde controle schrijft u een speciaal script en voegt u dit toe aan uw afbeeldingen.