Controllo controllo salute per il contenitore docker (1.12) (non in Dockerfile!)

Docker Versione 1.12 , ho un Dockerfile da qui

 FROM nginx:latest RUN touch /marker ADD ./check_running.sh /check_running.sh RUN chmod +x /check_running.sh HEALTHCHECK --interval=5s --timeout=3s CMD ./check_running.sh 

Sono in grado di rotolare gli aggiornamenti ei controlli di salute con check_running.sh script shell di check_running.sh . Qui lo script check_running.sh viene copiato in image , quindi il contenitore lanciato lo ha.

Ora, la mia domanda è che ci sia un modo per controllare la salute dal lato esterno del contenitore e lo script che si trova anche fuori.

Eccetto un command di verifica della salute per get la prestazione del contenitore (dipende da quello che abbiamo scritto nello script), SE il contenitore non funziona bene dovrebbe tornare alla versione precedente ( tipo di process che controlla i contenitori, se non è buono, dovrebbe tornare indietro a precedenti )

Grazie

c'è un modo per controllare la salute dal lato esterno del contenitore e lo script che si trova anche fuori.

Il genere di un process che controlla i contenitori, se non è buono, dovrebbe tornare al precedente

Hai diverse opzioni:

  1. Dall'esterno, si esegue un process all'interno del contenitore per verificare la sua salute con il conducente docker. Questa potrebbe essere qualsiasi sequenza di comandi di shell. Se si desidera mantenere gli script esterni al contenitore, è ansible utilizzare qualcosa di simile a cat script.sh | docker exec -it container sh -s cat script.sh | docker exec -it container sh -s .
  2. Controllare la salute del contenitore dall'esterno del contenitore, ad esempio cercando un process che dovrebbe essere eseguito all'interno del contenitore (cercare di impostare un profilo di sicurezza e utilizzare ps -Zax o cercare di cercare i figli del demone ) oppure puoi dare a ciascuno contenere un ID utente specifico con --user 12345 e quindi cercare quello o ad esempio collegarsi ai suoi servizi. Dovresti essere sicuro che stava correndo dentro il contenitore giusto. È ansible accedere al filesystem dei contenitori sotto /var/lib/docker/devicemapper/mnt/<hash>/rootfs .
  3. Esegui un HEALTHCHECK all'interno del contenitore e controlla la sua salute con il docker inspect --format='{{json .State.Health.Status}}' <containername> combinato ad esempio una row nel Dockerfile: HEALTHCHECK CMD wget -q -s http://google.com per verificare che il contenitore abbia accesso a Internet.

Raccommand l'opzione 3, perché probabilmente sarà più compatibile con altri strumenti in futuro.

Ho appena ricevuto un commento da un blog !. Ha riferito la documentazione Docker della sezione HealthCheck . C'è un'opzione di controllo di salute per il command docker per "ignorare" i predefiniti del file dockerfile. Non ho ancora controllato !. Ma mi sembra buono per get quello che voglio. Verificherà e aggiornare la risposta!

Questo non è disponibile con l'opzione Dockerfile HEALTHCHECK , tutti i controlli eseguiti all'interno del contenitore. Per me, questa è una buona cosa in quanto evita che il codice potenzialmente non attendibile viene eseguito direttamente nell'host e ti consente di includere le dependencies per il controllo di salute all'interno del contenitore.

Se hai bisogno di monitorare il tuo contenitore dall'esterno, devi usare un altro strumento o un'applicazione di monitoraggio, ci sono tantissimi di essi.

È ansible visualizzare i risultati del controllo sanitario eseguendo l' docker inspect su un contenitore.

Un altro approccio a seconda della tua applicazione sarebbe quello di esporre un endpoint di /healthz che il healthcheck anche sonde, in questo modo può essere interrogato esternamente o internamente come necessario.

Il command Docker inspect consente di visualizzare l'output di comandi che riescono o non riescono

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