La conoscenza della registrazione con Docker può essere molto utile per le attività quotidiane di amministrazione del sistema, che si tratti di risoluzione dei problemi o monitoraggio di base. Senza tenere traccia dei log su Docker, l'attenuazione dei problemi sarebbe molto più difficile durante l'analisi delle anomalie.
Questo articolo esplora alcune informazioni importanti su quell'area per semplificare la comprensione di come gestire i file di registro associati a Docker sul tuo sistema Linux.
Vorrei iniziare esplorando le parti più basilari e approfondire gradualmente alcune specifiche.
Come visualizzare i registri Docker
Puoi utilizzare i docker logs
comando per recuperare qualsiasi cosa stia succedendo con il servizio all'interno di un contenitore in esecuzione.
La sintassi è semplice:
docker logs container_name_or_ID
Probabilmente sai già che puoi usare la docker ps
comando per visualizzare il nome e l'ID dei contenitori in esecuzione.
Facciamo un esempio del mondo reale. Ho distribuito Nextcloud con Docker. Il contenitore si chiama nextcloud, non sorprende.
Ora, per visualizzare i log del contenitore denominato nextcloud
, usa:
docker logs nextcloud
Ecco una versione troncata dell'output del comando precedente:
172.18.0.2 - - [23/Jul/2021:19:36:09 +0000] "HEAD /.env HTTP/1.1" 302 1571 "-" "python-requests/2.26.0"
172.18.0.2 - - [23/Jul/2021:19:49:52 +0000] "HEAD /c99.php HTTP/1.1" 302 1565 "-" "python-requests/2.26.0"
172.18.0.2 - - [24/Jul/2021:16:25:23 +0000] "HEAD /backup.tar HTTP/1.1" 302 1571 "-" "python-requests/2.26.0"
172.18.0.2 - - [24/Jul/2021:16:25:24 +0000] "HEAD /backup.zip HTTP/1.1" 302 1569 "-" "python-requests/2.26.0"
172.18.0.2 - - [25/Jul/2021:20:36:01 +0000] "GET / HTTP/1.1" 302 1590 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko; compatible; BW/1.1; bit.ly/2W6Px8S) Chrome/84.0.4147.105 Safari/537.36"
172.18.0.2 - - [25/Jul/2021:20:36:07 +0000] "GET /custom_apps/richdocumentscode/proxy.php?req=/hosting/capabilities HTTP/1.1" 200 721 "-" "Nextcloud Server Crawler"
172.18.0.2 - - [25/Jul/2021:20:36:04 +0000] "GET /login HTTP/1.1" 200 7501 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko; compatible; BW/1.1; bit.ly/2W6Px8S) Chrome/84.0.4147.105 Safari/537.36"
Troppi log? La cosa buona è che ci sono varie opzioni che rendono la visualizzazione dei log della finestra mobile molto più semplice, proprio come i log in Linux.
Registri Tail Docker per visualizzare solo un certo numero di righe
Il comando dei registri Docker ha --tail
attributo che può essere utilizzato in modo simile al comando tail.
Ciò significa che puoi usarlo per visualizzare solo un certo numero di righe di registri Docker dalla fine.
Ad esempio, per visualizzare le ultime 50 righe di un contenitore, puoi utilizzare:
docker logs --tail 50 container_name_or_ID
Puoi usare il comando precedente anche in questo modo
docker logs -n=50 container_name_or_ID
Visualizzazione dei registri Docker in tempo reale su un container live
Puoi visualizzare totalmente i log del contenitore in tempo reale. Per “seguire” i log, usa il --follow
o il -f
attributo.
docker logs -f container_name_or_ID
Quando esegui i registri docker con l'opzione Segui, noterai che le nuove righe di registro verranno segnalate dal contenitore con il passare del tempo.
Per uscire, puoi semplicemente utilizzare Ctrl+C combinazione di tasti e tornare al prompt del terminale.
La maggior parte delle opzioni nei docker logs
il sottocomando può essere combinato per produrre il risultato desiderato.
Ad esempio, docker logs -f
inonderà lo schermo con tutti i registri dall'inizio. Non lo vorresti. Quello che puoi fare è combinare entrambi tail
e follow
opzioni come questa:
docker logs -f --tail 20 container_name_or_ID
Il comando precedente mostrerà le ultime 20 righe dei registri e quindi seguirà i registri in tempo reale.
Quando aggiorni i contenitori dell'app con il ridimensionamento, il comando precedente può essere molto utile prima di rimuovere un contenitore precedente.
Visualizza timestamp nei registri Docker
Se vuoi vedere anche il timestamp delle voci di log, puoi usare il -t
opzione.
docker logs -t container_name_or_ID
Questo può essere facilmente combinato con altre opzioni come --follow
e --tail
.
Il comando seguente mostrerà le ultime 10 righe del file di registro di un determinato contenitore con timestamp allegati a ciascuno di essi
docker logs -n=10 -t container_name_or_ID
Visualizzazione dei registri Docker in un periodo di tempo specificato
Quando stai indagando su un problema, il tempo può essere un fattore critico, nel qual caso il --since
e --until
i flag potrebbero rivelarsi molto utili.
Ad esempio, se stai indagando su un problema che si è verificato nelle ultime 24 ore, il seguente comando mostrerà i contenuti registrati di qualsiasi cosa sia accaduta solo durante quel periodo:
docker logs --since 1440m -t container_name_or_ID
1440m
nel comando sopra denota 24×60 minuti. Aggiungendo il -t
o il --timestamps
flag assicura che le righe segnalate vengano etichettate con un timestamp per consentirti di comprendere incidenti o errori ancora più facilmente. Suggerirei di aggiungerlo quando chiedi informazioni su qualsiasi contenitore.
Allo stesso modo, se hai bisogno dei dettagli del registro dopo le prime 24 ore dall'avvio della distribuzione, il comando equivalente sarebbe:
docker logs --until 1440m -t nextcloud
Oltre a specificare il tempo in minuti, i due flag precedenti possono essere utilizzati anche con un timestamp specifico che -t
genera. Il formato è come 2021-07-28T06:20:00
.
docker logs --since 2021-07-28 -t container_name_or_ID
Il comando precedente mostrerà i registri dal 28 luglio 2021.
Per una panoramica completa dei registri docker, puoi anche controllare la sua pagina man con man docker-logs.Accesso ai log Docker dall'interno del container
In alcuni casi d'uso interessanti, potresti optare per un approccio ibrido, in cui accedi ai log specifici dell'applicazione dall'interno dei contenitori.
Per farlo, accedi al contenitore Docker:
docker exec -it container_name_or_ID sh
E poi puoi usare i normali strumenti Linux per ottenere i log relativi alle applicazioni. Un approccio potrebbe essere quello di ottenere l'ID di processo del servizio desiderato utilizzando il comando ps:
ps aux
Ottieni i dettagli su questo processo:
cat /proc/PID_of_process/fd/1
Registri del servizio di sistema Docker
Se desideri vedere i log del servizio Docker stesso sull'host, puoi utilizzare journalctl se sei su Ubuntu 16.04 o successivo:
sudo journalctl -u docker
Come utilizzare il comando journalctl per analizzare i registri in LinuxGuida per principianti all'utilizzo dei comandi journalctl per visualizzare, filtrare e analizzare i registri del journal in Linux. Manuale LinuxAbhishek Prakash Dove sono archiviati i registri Docker?
Dovresti trovare i log della finestra mobile in /var/lib/docker/containers directory sul sistema host. Questa directory contiene i file di registro relativi a tutti i contenitori nelle rispettive directory. Puoi identificare le directory con l'ID contenitore.
Ho usato il docker ps
per trovare quel 70f19fde9076
è l'ID contenitore del contenitore Nextcloud.
Se guardo nella directory in cui sono archiviati i registri della finestra mobile:
[email protected]:~$ sudo ls -lh /var/lib/docker/containers
total 16K
drwx------ 4 root root 4.0K Jul 27 18:48 0efe12b28562c42619e533ad5f524d56740a7a3739d9e082c758bac95ae2a46f
drwx------ 4 root root 4.0K Jul 27 18:57 12c55f365f93ecb7f91e40bc130ddc2409216a61bbb244cd045a22b4513416d3
drwx------ 4 root root 4.0K Jul 27 18:58 70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e
drwx------ 4 root root 4.0K Jul 27 18:57 a436399ef16a3efc0a909b9c3f725938e595e0b8fd34644b13f28b2c9bcb4ed7
Attualmente ci sono quattro container in esecuzione e puoi vedere che il terzo corrisponde a quello che dobbiamo esaminare (inizia con 70f19fde9076
).
Se controlli il contenuto di questa directory, puoi vedere che il nostro file di registro si trova proprio lì!
[email protected]:~$ sudo ls -lh /var/lib/docker/containers/70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e
total 192K
-rw-r----- 1 root root 150K Jul 27 18:58 70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e-json.log
drwx------ 2 root root 4.0K Jul 19 17:10 checkpoints
-rw------- 1 root root 5.5K Jul 27 18:58 config.v2.json
-rw-r--r-- 1 root root 1.5K Jul 27 18:58 hostconfig.json
-rw-r--r-- 1 root root 13 Jul 27 18:58 hostname
-rw-r--r-- 1 root root 198 Jul 27 18:58 hosts
drwx------ 3 root root 4.0K Jul 19 17:10 mounts
-rw-r--r-- 1 root root 79 Jul 27 18:58 resolv.conf
-rw-r--r-- 1 root root 71 Jul 27 18:58 resolv.conf.hash
Pertanto, il file di registro corrispondente è 70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e-json.log che è lo stesso file che stavi leggendo quando ho eseguito i docker logs
comando all'inizio.
Consentitemi di verificare rapidamente che:
[email protected]:~$ sudo cat /var/lib/docker/containers/70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e/70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e-json.log
{"log":"172.18.0.2 - - [23/Jul/2021:19:36:09 +0000] \"HEAD /.env HTTP/1.1\" 302 1571 \"-\" \"python-requests/2.26.0\"\n","stream":"stdout","time":"2021-07-23T19:36:09.837857567Z"}
{"log":"172.18.0.2 - - [23/Jul/2021:19:49:52 +0000] \"HEAD /c99.php HTTP/1.1\" 302 1565 \"-\" \"python-requests/2.26.0\"\n","stream":"stdout","time":"2021-07-23T19:49:52.996108799Z"}
{"log":"172.18.0.2 - - [24/Jul/2021:16:25:23 +0000] \"HEAD /backup.tar HTTP/1.1\" 302 1571 \"-\" \"python-requests/2.26.0\"\n","stream":"stdout","time":"2021-07-24T16:25:23.445225166Z"}
{"log":"172.18.0.2 - - [24/Jul/2021:16:25:24 +0000] \"HEAD /backup.zip HTTP/1.1\" 302 1569 \"-\" \"python-requests/2.26.0\"\n","stream":"stdout","time":"2021-07-24T16:25:24.772881041Z"}
{"log":"172.18.0.2 - - [25/Jul/2021:20:36:01 +0000] \"GET / HTTP/1.1\" 302 1590 \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko; compatible; BW/1.1; bit.ly/2W6Px8S) Chrome/84.0.4147.105 Safari/537.36\"\n","stream":"stdout","time":"2021-07-25T20:36:03.678967877Z"}
{"log":"172.18.0.2 - - [25/Jul/2021:20:36:07 +0000] \"GET /custom_apps/richdocumentscode/proxy.php?req=/hosting/capabilities HTTP/1.1\" 200 721 \"-\" \"Nextcloud Server Crawler\"\n","stream":"stdout","time":"2021-07-25T20:36:07.404618408Z"}
{"log":"172.18.0.2 - - [25/Jul/2021:20:36:04 +0000] \"GET /login HTTP/1.1\" 200 7501 \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko; compatible; BW/1.1; bit.ly/2W6Px8S) Chrome/84.0.4147.105 Safari/537.36\"\n","stream":"stdout","time":"2021-07-25T20:36:07.619020402Z"}
Il contenuto del registro è lo stesso, ma dal momento che sto leggendo il file di registro direttamente dall'host, questo ha molto gergo rispetto ai docker logs
comando utilizzato in precedenza.
Abilitazione della rotazione del registro per Docker (JSON)
Per impostazione predefinita, per la registrazione basata su file JSON, la rotazione del registro su Docker è disabilitata.
Ciò potrebbe rappresentare un problema con lo spazio su disco se le dimensioni dei file di registro aumentano. La nostra istanza Ghost basata su Docker ha visto i suoi file di registro raggiungere dimensioni fino a 20 GB. Vorresti evitare tale situazione abilitando la rotazione dei log.
Per abilitare la rotazione dei log per Docker, modifica il /etc/docker/daemon.json
file:
sudo nano /etc/docker/daemon.json
Aggiungi le seguenti righe e salva il file:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
Riavvia il demone Docker:
sudo systemctl restart docker
La configurazione di cui sopra è ovviamente rilevante per un'installazione Docker generica, che ha la registrazione JSON impostata come predefinita. Quindi tieni presente che ogni altro meccanismo di registrazione (elencato di seguito) ha il proprio modo di implementare la rotazione.
Una breve parola sui driver di registrazione
Hai notato "json" nel nome del file di registro di prima? Questo perché JSON File è il driver di registrazione predefinito su Docker.
Oltre a JSON, ci sono anche molti altri meccanismi di registrazione tra cui scegliere:
- File locale
- Loggerie
- Formato esteso Graylog (GELF)
- Registro di sistema
- Registri Amazon Cloudwatch (AWS)
- Tracciamento eventi in Windows(ETW)
- Fluente
- Registri di progetto Google Cloud (GCP)
- Diario
- Splunk
- Stoccaio
Per implementazioni su larga scala, GELF , AWS , GCP e Fluentd sono raccomandati in quanto implementano un approccio centralizzato. Ma per la piccola scala, JSON fa bene il suo lavoro, mentre è locale , Syslog e Diario sono anche abbastanza adatti. Registro di sistema e Logstash sono particolarmente utili se l'analisi di log complessa diventa un requisito. ETW è specifico per Windows, mentre Splunk si concentra sulla registrazione remota.
A partire da Docker Engine 20.10, è stata introdotta una nuova funzionalità denominata "dual-logging" che garantisce l'esecuzione dei docker logs
comando oltre a eseguire la rotazione del registro indipendentemente dal driver di registrazione in vigore.
Riepilogo
In questo articolo, ho iniziato con le nozioni di base su come visualizzare i log per qualsiasi container Docker, sia a livello di container che di sistema host. Ti ho anche mostrato come individuare la posizione fisica dei file di registro specifici del contenitore che risiedono sul tuo sistema host. Ti ho mostrato brevemente come controllare i log per il servizio Docker sull'host stesso.
Successivamente, ho discusso dei driver di registrazione concentrandomi sul meccanismo predefinito e ho anche evidenziato la nuova funzione di doppia registrazione.
Spero che questi suggerimenti ti aiutino nelle tue attività quotidiane di monitoraggio o apprendimento. Eventuali altri pensieri e suggerimenti sono più che benvenuti! Si prega di condividerli nella sezione commenti qui sotto.