Znalosti o protokolování pomocí Dockeru mohou být velmi užitečné pro každodenní činnosti správy systému, ať už jde o odstraňování problémů nebo základní monitorování. Bez sledování protokolů na Dockeru by bylo zmírňování problémů při vyšetřování anomálií mnohem obtížnější.
Tento zápis zkoumá některé důležité informace v této oblasti, aby bylo snazší pochopit, jak spravovat soubory protokolu související s Dockerem ve vašem systému Linux.
Dovolte mi začít tím, že prozkoumám nejzákladnější části a postupně půjdu hlouběji do některých specifik.
Jak zobrazit protokoly Docker
Můžete použít docker logs
příkaz k načtení všeho, co se děje se službou uvnitř běžícího kontejneru.
Syntaxe je jednoduchá:
docker logs container_name_or_ID
Pravděpodobně již víte, že můžete použít docker ps
k zobrazení názvu a ID běžících kontejnerů.
Vezměme si příklad z reálného světa. Nasadil jsem Nextcloud s Dockerem. Kontejner se nepřekvapivě jmenuje nextcloud.
Nyní si prohlédněte protokoly kontejneru s názvem nextcloud
, použijte:
docker logs nextcloud
Zde je zkrácená verze výstupu výše uvedeného příkazu:
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"
Příliš mnoho protokolů? Dobrá věc je, že existují různé možnosti, které značně usnadňují prohlížení protokolů dockeru, stejně jako protokolů v Linuxu.
Protokoly Tail Docker pro zobrazení pouze určitého počtu řádků
Příkaz Docker logs má --tail
atribut, který lze použít podobným způsobem jako příkaz tail.
To znamená, že jej můžete použít k zobrazení pouze určitého počtu řádků protokolů Docker od konce.
Chcete-li například zobrazit posledních 50 řádků kontejneru, můžete použít:
docker logs --tail 50 container_name_or_ID
Výše uvedený příkaz můžete použít také tímto způsobem
docker logs -n=50 container_name_or_ID
Zobrazení protokolů Docker v reálném čase na živém kontejneru
Záznamy kontejneru můžete zcela zobrazit v reálném čase. Chcete-li „sledovat“ protokoly, použijte --follow
nebo -f
atribut.
docker logs -f container_name_or_ID
Když spustíte protokoly dockeru s možností sledování, všimnete si, že nové řádky protokolu budou z kontejneru hlášeny v průběhu času.
Pro ukončení můžete jednoduše použít Ctrl+C kombinaci kláves a přejděte zpět na výzvu terminálu.
Většina možností v docker logs
dílčí příkaz lze zkombinovat a vytvořit požadovaný výsledek.
Například docker logs -f
zaplaví obrazovku všemi logy od začátku. To bys nechtěl. Co můžete udělat, je zkombinovat oba tail
a follow
možnosti, jako je tato:
docker logs -f --tail 20 container_name_or_ID
Výše uvedený příkaz zobrazí posledních 20 řádků protokolů a poté bude sledovat protokoly v reálném čase.
Při aktualizaci kontejnerů aplikací pomocí škálování může být výše uvedený příkaz velmi užitečný, než odeberete starší kontejner.
Zobrazit časové razítko v protokolech Docker
Pokud chcete vidět také časové razítko položek protokolu, můžete použít -t
volba.
docker logs -t container_name_or_ID
To lze snadno kombinovat s dalšími možnostmi, jako je --follow
a --tail
.
Příkaz níže zobrazí posledních 10 řádků souboru protokolu daného kontejneru s časovými razítky připojenými ke každému z nich
docker logs -n=10 -t container_name_or_ID
Zobrazení protokolů Docker v určeném časovém období
Když vyšetřujete problém, čas může být kritickým faktorem, v takovém případě --since
a --until
příznaky mohou být velmi užitečné.
Pokud například vyšetřujete problém, ke kterému došlo za posledních 24 hodin, následující příkaz zobrazí zaznamenaný obsah všeho, co se stalo pouze během této doby:
docker logs --since 1440m -t container_name_or_ID
1440m
ve výše uvedeném příkazu označuje 24×60 minut. Přidání -t
nebo --timestamps
flag zajišťuje, že nahlášené linky budou označeny časovým razítkem, abyste ještě snadněji porozuměli incidentům nebo chybám. Doporučuji jej přidat při dotazování na jakýkoli kontejner.
Podobně, pokud požadujete podrobnosti protokolu po prvních 24 hodinách od zahájení nasazení, ekvivalentní příkaz bude:
docker logs --until 1440m -t nextcloud
Kromě zadání času v minutách lze výše uvedené dva příznaky použít také s konkrétním časovým razítkem, které -t
generuje. Formát je jako 2021-07-28T06:20:00
.
docker logs --since 2021-07-28 -t container_name_or_ID
Výše uvedený příkaz zobrazí protokoly od 28. července 2021.
Chcete-li získat úplný přehled protokolů dockeru, můžete také zkontrolovat jeho manuálovou stránku s protokoly man docker-logs.Přístup k protokolům Docker z kontejneru
V některých zajímavých případech použití možná budete chtít použít hybridní přístup, kdy přistupujete k protokolům specifickým pro aplikaci z kontejnerů.
Chcete-li to provést, zadejte kontejner Docker:
docker exec -it container_name_or_ID sh
A pak můžete použít běžné nástroje Linuxu k získání protokolů souvisejících s aplikací. Jedním přístupem by bylo získat ID procesu požadované služby pomocí příkazu ps:
ps aux
Získejte podrobnosti o tomto procesu:
cat /proc/PID_of_process/fd/1
Protokoly služeb systému Docker
Pokud chcete vidět protokoly samotné služby Docker na hostiteli, můžete použít journalctl, pokud používáte Ubuntu 16.04 nebo novější:
sudo journalctl -u docker
Jak používat příkaz journalctl k analýze protokolů v průvodci LinuxBeginner k používání příkazů journalctl k prohlížení, filtrování a analýze protokolů deníku v Linuxu. Linux HandbookAbhishek Prakash Kde jsou uloženy protokoly Dockeru?
Protokoly dockeru byste měli najít v /var/lib/docker/containers adresář na hostitelském systému. Tento adresář obsahuje soubory protokolu související se všemi kontejnery v jejich jednotlivých adresářích. Adresáře můžete identifikovat pomocí ID kontejneru.
Použil jsem docker ps
najít 70f19fde9076
je ID kontejneru kontejneru Nextcloud.
Pokud se podívám do adresáře, kde jsou uloženy protokoly dockeru:
[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
V současné době běží čtyři kontejnery a můžete vidět, že třetí odpovídá tomu, který potřebujeme prozkoumat (začíná 70f19fde9076
).
Pokud zkontrolujete obsah tohoto adresáře, uvidíte, že náš log soubor je přímo tam!
[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
Odpovídající soubor protokolu je tedy 70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e-json.log což je stejný soubor, který jste četli, když jsem spouštěl docker logs
příkaz na začátku.
Dovolte mi to rychle ověřit:
[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"}
Obsah protokolu je stejný, ale protože soubor protokolu čtu přímo z hostitele, má ve srovnání s docker logs
hodně žargonu dříve použitý příkaz.
Povolení rotace protokolu pro Docker (JSON)
Ve výchozím nastavení je pro protokolování založené na souborech JSON rotace protokolů na Dockeru zakázána.
To může představovat problém s místem na disku, pokud se soubory protokolu zvětší. Naše instance Ghost založená na Dockeru zaznamenala, že její soubory protokolu narostly až na 20 GB. Takové situaci byste se chtěli vyhnout povolením rotace protokolu.
Chcete-li povolit rotaci protokolů pro Docker, upravte /etc/docker/daemon.json
soubor:
sudo nano /etc/docker/daemon.json
Připojte následující řádky a uložte soubor:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
Restartujte démona Docker:
sudo systemctl restart docker
Výše uvedené nastavení je samozřejmě relevantní pro obecnou instalaci Dockeru, která má jako výchozí nastaveno protokolování JSON. Mějte tedy na paměti, že každý další mechanismus protokolování (uvedený níže) má svůj vlastní způsob implementace rotace.
Krátké slovo o protokolování ovladačů
Všimli jste si „json“ v názvu souboru protokolu dříve? Je to proto, že soubor JSON je výchozím ovladačem protokolování na Dockeru.
Kromě JSON existuje na výběr také mnoho dalších mechanismů protokolování:
- Místní soubor
- Logentries
- Graylog Extended Format (GELF)
- Syslog
- Protokoly Amazon Cloudwatch (AWS)
- Sledování událostí ve Windows (ETW)
- Plynule
- Protokoly projektu Google Cloud (GCP)
- Journald
- Splunk
- Logstash
Pro rozsáhlá nasazení GELF , AWS , GCP a Fluentd se doporučují, protože zavádějí centralizovaný přístup. Ale pro malé rozměry JSON dělá svou práci dobře, zatímco místní , Syslog a Journald jsou také docela vhodné. Syslog a Logstash jsou zvláště velmi užitečné, pokud se stane požadavkem komplexní analýza protokolů. ETW je specifický pro Windows, zatímco Splunk se zaměřuje na vzdálené protokolování.
Počínaje Docker Engine 20.10 byla zavedena nová funkce nazvaná „duální protokolování“, která zajišťuje spouštění docker logs
příkaz a také provádění rotace protokolu bez ohledu na platný ovladač protokolování.
Přehled
V tomto článku jsem začal se základy toho, jak zobrazit protokoly pro jakýkoli kontejner Docker, a to jak na úrovni kontejneru, tak na úrovni hostitelského systému. Také jsem vám ukázal, jak najít fyzické umístění souborů protokolu specifických pro kontejner, které se nacházejí na vašem hostitelském systému. Stručně jsem vám ukázal, jak zkontrolovat protokoly služby Docker na samotném hostiteli.
Později jsem diskutoval o protokolování ovladačů se zaměřením na výchozí mechanismus a také jsem zdůraznil novou funkci duálního protokolování.
Doufám, že vám tyto rady pomohou při každodenním sledování nebo učení. Jakékoli další nápady a návrhy jsou více než vítány! Podělte se o ně v sekci komentářů níže.