Come (e perché) aggiungere controlli di integrità ai contenitori Docker

0
44

Hai creato la tua immagine Docker, l'hai inserita nel registro e ha avviato un nuovo contenitore in produzione. Tutto funziona mentre torni a casa per la giornata, ma quando torni la mattina dopo ti vengono segnalate le interruzioni. Il tuo container è ancora in esecuzione ma non sta servendo le richieste.

Questo scenario potrebbe non essere familiare ai team operativi che lavorano con Docker. Ecco come utilizzare la funzione di controllo dello stato di Docker per ottenere dati accurati sulla disponibilità dei tuoi servizi.

Come funzionano i controlli dello stato< /h2>

I controlli di integrità consentono a un contenitore di esporre la disponibilità del suo carico di lavoro. Ciò si distingue dal fatto che il contenitore sia in esecuzione. Se il tuo database non funziona, il tuo server API non sarà in grado di gestire le richieste, anche se il suo contenitore Docker è ancora in esecuzione.

Ciò rende inutili le esperienze durante la risoluzione dei problemi. Un semplice docker ps riporterebbe il contenitore come disponibile. L'aggiunta di un controllo dello stato estende l'output di docker ps per includere lo stato true del contenitore.

Configura i controlli dello stato del contenitore nel tuo Dockerfile. Questo accetta un comando che il demone Docker eseguirà ogni 30 secondi. Docker utilizza il codice di uscita del comando per determinare l'integrità del contenitore:

  • 0 – Il contenitore è sano e funziona normalmente.
  • 1 – Il contenitore non è sano; il carico di lavoro potrebbe non funzionare.
  • 2 – Questo codice di stato è riservato da Docker e non deve essere utilizzato.

Pubblicità

Quando HEALTHCHECK è presente in un Dockerfile, vedrai lo stato di salute del contenitore in la colonna STATUS quando esegui docker ps.

La salute non viene verificata immediatamente quando vengono creati i contenitori. Lo stato verrà visualizzato come a partire prima dell'esecuzione del primo controllo. Questo dà al contenitore il tempo di eseguire qualsiasi attività di avvio. Un contenitore con un controllo di integrità superato verrà visualizzato come integro; un contenitore non integro viene visualizzato come non integro.

Scrittura di comandi di controllo dell'integrità

I controlli dello stato del contenitore sono configurati con l'istruzione HEALTHCHECK nel tuo Dockerfile. Dovresti usare un comando di controllo dello stato appropriato per il tuo contenitore. Per i server Web, curl ti offre un modo semplice per eseguire un controllo di prontezza di base. Eseguire il ping di un endpoint noto che dovrebbe essere disponibile ogni volta che il servizio è attivo.

FROM nginx:latest HEALTHCHECK CMD curl –fail http://localhost/api/healthcheck || uscita 1

Questo esempio contrassegnerebbe il contenitore come non integro se l'endpoint /api/healthcheck del tuo server ha emesso uno stato di errore.

Puoi utilizzare il controllo finestra mobile per vedere l'output dei comandi di controllo dello stato. Ciò è utile quando si esegue il debug dell'istruzione HEALTHCHECK.

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

Sostituisci my-container con l'ID o il nome del contenitore che si desidera ispezionare. Questi dettagli vengono visualizzati nell'output di docker ps.

Personalizzazione dei controlli di integrità

Pubblicità

Docker ti consente di personalizzare la frequenza dei controlli di integrità. Puoi anche modificare i criteri che contrassegnano un contenitore come non integro.

Sono disponibili quattro opzioni:

  • –interval – Imposta l'intervallo tra i controlli di integrità. Ciò consente di sovrascrivere il valore predefinito di 30 secondi. Utilizzare un intervallo più alto per aumentare il tempo tra i controlli. Ciò è utile se si dispone di un servizio a bassa priorità in cui controlli di integrità regolari potrebbero influire sulle prestazioni. Utilizza una frequenza più regolare per i servizi critici.
  • –start-period – Imposta la durata dopo l'avvio di un contenitore quando i controlli di integrità devono essere ignorati. Il comando verrà comunque eseguito ma uno stato non integro non verrà conteggiato. Questo dà ai contenitori il tempo di completare le procedure di avvio.
  • –riprova– Ciò consente di richiedere più errori successivi prima che un contenitore venga contrassegnato come non integro. Il valore predefinito è 3. Se un controllo di integrità fallisce ma il successivo passa, il contenitore non passerà a non integro. Diventerà malsano dopo tre controlli consecutivi falliti.
  • –timeout – Imposta il timeout per i comandi di controllo dello stato. Docker considererà il controllo come fallito se il comando non esce entro questo lasso di tempo.

Le opzioni vengono passate come flag all'istruzione HEALTHCHECK. Fornirli prima del comando di controllo dello stato:

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

Questa configurazione indica a Docker di eseguire curl ogni 60 secondi. Il contenitore verrà contrassegnato come non integro se cinque test consecutivi hanno un codice di uscita diverso da zero.

Formato del comando

La sintassi del comando HEALTHCHECK supporta un semplice CMD o un array exec in stile entrypoint. Puoi anche passare NONE invece di CMD per disabilitare i controlli di integrità:

HEALTHCHECK NONE

Questo ti consente di inibire i controlli di integrità dell'immagine di base. Ogni istruzione HEALTHCHECK sovrascrive qualsiasi istruzione precedente nei livelli dell'immagine.

E Docker Compose?

Docker Compose supporta anche le definizioni di controllo dello stato. Aggiungi una sezione di controllo dello stato al tuo servizio:.

versione: "3" servizi: app: immagine: nginx:latest porte: – 80:80 healthcheck: test: curl –fail http://localhost || exit 1 intervallo: 10s tentativi: 5 start_period: 5s timeout: 10s Annuncio

La chiave di test definisce il comando da eseguire. Le altre chiavi mappano i parametri accettati dall'istruzione HEALTHCHECK di Dockerfile.

Riepilogo

L'impostazione di un'istruzione HEALTHCHECK semplifica la diagnosi di un contenitore che si comporta in modo anomalo. Puoi tenere traccia della disponibilità del tuo carico di lavoro indipendentemente dall’’esecuzione” del container. stato.

I controlli di integrità sono compatibili con qualsiasi comando che emette un codice di uscita 0 o 1. È possibile utilizzare comandi comuni come curl e ping per ispezionare servizi Web e database. Per un controllo più avanzato, scrivi uno script dedicato e includilo nelle tue immagini.