Come monitorare i log dei container Docker

0
287

Docker aggrega automaticamente l'output standard del contenitore e i flussi di errore (stdout/stderr) in feed di log che vengono conservati dal demone Docker. Puoi facilmente monitorare i log per capire cosa sta succedendo nei tuoi contenitori.

I log contengono l'output che vedresti nel tuo terminale quando è collegato a un contenitore in modalità interattiva (-it ). I log saranno disponibili solo se il processo in primo piano nel tuo contenitore emette effettivamente un output. Dovresti assicurarti che i tuoi contenitori registrino gli errori su stderr in modo che i comandi Docker siano in grado di esporli.

Puoi visualizzare i log del contenitore in qualsiasi momento durante il ciclo di vita di un contenitore. Quando un contenitore è in esecuzione, puoi eseguire lo streaming dei log in tempo reale. Per i container arrestati, puoi accedere a tutti i log acquisiti prima della chiusura.

Visualizzazione dei log dei container

Per visualizzare i log dei container, utilizza la finestra mobile comando logs:

docker logs my-container

Sostituisci my-container con il nome o l'ID del container che vuoi ispezionare. Puoi utilizzare docker ps -a per ottenere gli ID e i nomi dei tuoi contenitori.

Il comando logs stampa l'intero output del log del contenitore sul tuo terminale. L'output non sarà continuo. Se desideri mantenere lo streaming di nuovi log, aggiungi il flag –follow al comando. Ciò equivale a utilizzare tail -f con normali file di log sulla macchina.

Personalizzare cosa viene visualizzato

Il comando docker logs supporta diversi flag che ti consentono di regolare il suo output:

  • & # 8211; timestamp & # 8211; Mostra i timestamp completi all'inizio di ogni riga di log.
  • & # 8211; until e –since & # 8211; Questi flag consentono di recuperare le righe registrate durante un determinato periodo di tempo. Passa un timestamp completo (2021-04-30T20: 00: 00Z) o un orario relativo amichevole (ad esempio, 1 ora = 1 ora fa).
  • & # 8211; coda & # 8211; Recupera un determinato numero di righe dal registro. – la coda 10 mostrerà le ultime dieci righe registrate dal contenitore.
  • & # 8211; dettagli & # 8211; Questo è un flag speciale che aggiunge informazioni extra all'output del registro, in base alle opzioni passate al driver di registrazione. Nella sezione successiva esamineremo la registrazione dei driver. I valori tipici visualizzati con –details includono le etichette dei contenitori e le variabili di ambiente.

Puoi combinare questi flag per ottenere i log nel formato richiesto. I flag until, since e tail non avranno effetto se utilizzi follow per lo streaming continuo dei dati di log.

Driver di registrazione Docker

Docker raccoglie e archivia i log del contenitore utilizzando uno dei numerosi driver di registrazione. È possibile impostare il driver di registrazione attivo in base al contenitore. Quando non viene specificato alcun driver di registrazione, Docker utilizza il driver del file json.

Questo driver archivia i log del contenitore in un file JSON. Questo formato è abbastanza leggibile dall'uomo e può essere facilmente utilizzato da strumenti di terze parti. Se non hai intenzione di accedere direttamente ai file di registro, passare al driver locale ti farà risparmiare un po 'di spazio di archiviazione. Utilizza un formato di archiviazione dei log personalizzato.

Altri driver di log incorporati includono syslog (scrivi sul daemon syslog in esecuzione sulla tua macchina), journald (usa un'istanza di journald in esecuzione) e fluentd (per usare un fluentd demone). Sono inoltre disponibili driver per Amazon CloudWatch, Google Cloud Platform, Event Tracing per Windows e altre soluzioni di monitoraggio dei log.

Docker supporta i driver di registrazione di terze parti tramite plug-in. Puoi trovare i driver su Docker Hub. Per installare un driver plug-in, eseguire docker plug-in installa nome-plug-in. Potrai quindi fare riferimento ad esso come un driver di registrazione come nome-plugin.

Specificare un driver di registrazione

Tu può specificare il driver di registrazione per un contenitore passando il flag –log-driver a docker run:

docker run –log-driver systemd my-image: latest

È possibile modificare globalmente il driver di registrazione predefinito aggiornando la configurazione del demone Docker. Modifica (o crea) /etc/docker/daemon.json. Impostare la chiave del driver di registro sul nome di un driver di registrazione. Docker utilizzerà questo driver per tutti i contenitori creati senza un flag –log-driver.

{& quot; log-driver & quot ;: & quot; systemd & quot; }

Molti driver di registrazione vengono forniti con le proprie opzioni di configurazione. Questi vengono impostati utilizzando il flag del contenitore –log-opts o log-opts in daemon.json. Ecco un esempio relativo al driver di file json predefinito. Indica a Docker di ruotare i file di registro una volta che sono più grandi di 8 MB. Verranno conservati solo cinque file alla volta.

docker run

docker run –log-driver json-file –log-opts max-size = 8M –log-opts max-file = 5

<”/etc/docker/daemon.json

{& quot; log-driver & quot ;: & quot; json-file & quot ;, & quot; log -opts & quot ;: {& quot; max-size & quot ;: & quot; 8M & quot ;, & quot; max-file & quot ;: 5}}

Driver Delivery Modes

I registri possono essere forniti in modalità di blocco o non di blocco. Per impostazione predefinita, Docker blocca la consegna. I registri dal contenitore verranno inviati immediatamente all'autista. Ciò garantisce la consegna dei registri ma potrebbe influire sulle prestazioni. L'applicazione attenderà fino al completamento della scrittura del registro. Ciò può causare un ritardo percettibile se il driver di registrazione è occupato.

In modalità non bloccante, Docker scrive i log in un buffer in memoria. Il contenitore non ha bisogno di attendere che il driver di registrazione completi la sua scrittura. Ciò può migliorare significativamente le prestazioni su macchine attive con archiviazione lenta.

Il compromesso con la modalità non bloccante è la possibilità di perdere i registri. Ciò può verificarsi quando i registri vengono emessi più rapidamente di quanto il driver possa elaborarli. Il buffer in memoria potrebbe essere riempito, causando la cancellazione dei log memorizzati nella cache prima che siano stati consegnati al conducente.

È possibile abilitare la consegna non bloccante impostando l'opzione di registrazione della modalità, con –log-opts o daemon.json. È possibile impostare la dimensione del buffer di registro in memoria con l'opzione max-buffer-size. L'impostazione di questo valore alto riduce il rischio di perdita di log, a condizione che tu abbia sufficiente RAM disponibile.

docker run –log-opt mode = non-blocking –log-opt max-buffer-size = 8M my -image: latest

Best practice per la registrazione

I tuoi contenitori dovrebbero funzionare con il sistema di registrazione di Docker, ove possibile. L'emissione dei log in stdout e stderr consente a Docker e ad altri strumenti di aggregarli in modo standardizzato.

L'output del log non deve includere i timestamp. I driver di registrazione di Docker registreranno automaticamente l'ora in cui si è verificato un evento.

A volte potresti avere requisiti di registrazione complessi che i soli log di Docker non possono soddisfare. In tal caso, potrebbe essere necessario implementare la propria soluzione di registrazione all'interno del contenitore. Puoi memorizzare i log direttamente sul filesystem, utilizzando un volume Docker, o chiamare un servizio API esterno.

Alcuni stack richiedono un contenitore di registrazione dedicato che si trova accanto ai contenitori dell'applicazione. Il contenitore di registrazione, spesso chiamato & # 8220; sidecar & # 8221 ;, legge i file di registro temporanei che i contenitori dell'applicazione creano in un volume Docker condiviso. Il sidecar gestisce l'aggregazione di questi log in un formato che può essere caricato su un servizio di monitoraggio dei log.

Questo approccio può essere utile per distribuzioni più complesse, sebbene sia più complicato da configurare e scalare. In genere ti lascia senza la comodità immediata dei comandi di log incorporati di Docker.

Riepilogo

Docker ha funzionalità versatili di monitoraggio dei log fornite da una suite dei driver di registrazione. Ogni contenitore può utilizzare un driver di registrazione univoco, che consente di archiviare i log in un formato appropriato ai requisiti di ciascuna app.

I log includono qualsiasi cosa emessa dai flussi di output standard di un contenitore. Puoi usare echo, print, console.log () o l'equivalente del tuo linguaggio di programmazione per aggiungere righe all'output dei log di Docker. I log vengono conservati fino a quando il contenitore non viene eliminato con docker rm.