Nastavitev rotacije dnevnikov Dockerja z gonilnikom za beleženje: beleženje Dockerja z journald in lokalni datotečni gonilnik
Raven: Strokovnjak
Ocenjeni čas: ~20 minut
Cilj: Nastaviti rotacijo dnevnikov Dockerja za upravljanje dnevnikov brez izpadov in preprečiti izčrpanje prostora na disku.
Uvod
Neupravljani dnevniki Dockerja lahko hitro izčrpajo shrambo strežnika. Privzeto demon Docker zapisuje dnevnike v obliki json-file brez omejitev velikosti. Za zanesljivo infrastrukturo morate rotacijo dnevnikov Dockerja nastaviti z razširljivim gonilnikom beleženja Dockerja. Ta vodnik opisuje, kako rotacijo dnevnikov Dockerja globalno uvesti z beleženjem Dockerja prek journald ali z lokalnim datotečnim gonilnikom (local) Dockerja. Prava konfiguracija zagotavlja učinkovito upravljanje dnevnikov in stabilnost sistema.
Terminologija
Preden nadaljujete, se seznanite z naslednjimi osnovnimi pojmi:
- Docker: platforma za izvajanje aplikacij v izoliranih okoljih, imenovanih vsebniki (kontejnerji).
- Dnevniki Dockerja: izhodni tokovi, zajeti iz standardnega izhoda (Stdout) in standardnega izhoda za napake (Stderr) vsebnika.
- Rotacija dnevnikov: praksa arhiviranja in brisanja starih dnevnikov za pridobitev prostora.
- Gonilnik beleženja (logging driver): mehanizem, s katerim Docker zajema, oblikuje in usmerja dnevnike.
- Journald: sistemska storitev beleženja systemd, idealna za centralizirano beleženje na gostitelju.
- Lokalni datotečni gonilnik (local): vgrajen visokozmogljiv gonilnik, optimiziran za lokalno shrambo.
- Json-file: privzeti gonilnik, ki zapisuje dnevnike v obliki JSON.
- Demon Docker: storitev v ozadju, ki upravlja operacije Dockerja.
- Daemon.json: konfiguracijska datoteka demona.
- Konfiguracija gonilnika dnevnikov: globalne ali za posamezen vsebnik veljavne nastavitve beleženja.
- Možnosti dnevnikov: posebni parametri, posredovani gonilniku.
- Max-size: mejna velikost, pri kateri se dnevniška datoteka zarotira.
- Max-file: največje število ohranjenih zarotiranih datotek.
Predpogoji
Preden začnete, se prepričajte, da imate:
- Operacijski sistem: Ubuntu 22.04 / 24.04 LTS, Debian 12 / 13, RHEL 9 / 10, AlmaLinux 9 / 10, Rocky Linux 9 / 10
- Docker: nameščena različica 24.x ali novejša
- Dostop: pravice sudo
- Zahtevano znanje: administracija sistema Linux in koncepti Infrastructure as Code
1. korak: Razumevanje razlik med gonilnikoma json-file in local v Dockerju
Pri presoji gonilnikov json-file in local v Dockerju o izbiri odločata zmogljivost in dodatna obremenitev. Privzeti gonilnik json-file je preprost, vendar zaradi oblikovanja JSON porabi več procesorja in prostora na disku. Datotečni gonilnik local pa uporablja dvojiško obliko samo za dodajanje (append-only), ki je posebej optimizirana za učinkovito rotacijo. Pri običajnih produkcijskih obremenitvah lokalni datotečni gonilnik (local) Dockerja zmanjša obremenitev diska in zanesljivo izvaja rotacijo izvorno.
Za preverjanje trenutnega gonilnika zaženite:
docker info --format '{{.LoggingDriver}}'
Pričakovani izpis:
json-file
Če vidite json-file, nadaljujte s spreminjanjem konfiguracije beleženja Dockerja v daemon.json.
2. korak: Nastavitev rotacije dnevnikov Dockerja z lokalnim datotečnim gonilnikom (local)
Za uveljavitev globalnih omejitev za vse vsebnike boste uredili datoteko /etc/docker/daemon.json. To je priporočen pristop za konfiguracijo beleženja Dockerja v daemon.json.
Odprite konfiguracijsko datoteko:
Če datoteka /etc/docker/daemon.json v vašem sistemu ne obstaja, jo bo nano ustvaril ob shranjevanju. To je običajno - Docker ob odsotnosti datoteke uporablja vgrajene privzete vrednosti.
sudo nano /etc/docker/daemon.json
Dodajte naslednjo konfiguracijo gonilnika dnevnikov:
{ "log-driver": "local", "log-opts": { "max-size": "50m", "max-file": "3" } }
Shranite in zaprite datoteko. Nove nastavitve so zapisane na disk. Ta konfiguracija gonilnik uveljavi globalno. Možnosti dnevnikov naročijo Dockerju, naj dnevnike zarotira, ko dosežejo 50 megabajtov (max-size za dnevnike Dockerja), in ohrani največ 3 datoteke (max-file za dnevnike Dockerja). Upoštevajte, da gonilnik local za razliko od journald še vedno izvorno podpira te izrecne omejitve velikosti in števila datotek.
Znova zaženite demon Docker, da uveljavite spremembe. Storitev docker.service upravlja vsebnike, zato se z njenim ponovnim zagonom omejitve uveljavijo:
sudo systemctl restart docker
Za nekaj sekund boste izgubili povezavo z demonom. Po ponovnem zagonu bodo vsi na novo ustvarjeni vsebniki uporabljali lokalni datotečni gonilnik (local) Dockerja in podedovali te omejitve max-size in max-file za dnevnike Dockerja.
Gonilnik beleženja je za posamezen vsebnik nespremenljiv. Obstoječi vsebniki obdržijo svoj stari gonilnik dnevnikov; ukaz docker update ga ne more spremeniti. Za uveljavitev novega gonilnika beleženja Dockerja je treba vsebnik znova ustvariti (npr. z docker compose up -d ali ponovno namestitvijo prek orkestracije), saj migracija v živo ne obstaja. Sicer boste na gostitelju dobili mešana stanja beleženja.
Poleg tega poznajte vrstni red prednosti konfiguracij beleženja:
- Zastavice CLI (
docker run --log-driver) prevladajo nad vsem ostalim. - Preglasitve beleženja v
docker-compose.ymlveljajo za posamezno storitev ob ustvarjanju vsebnika. daemon.jsondeluje kot privzeta globalna vrednost za vse vsebnike brez izrecnih nastavitev.
3. korak: Omogočanje beleženja Dockerja prek journald kot gonilnika beleženja Dockerja
Alternativno lahko dnevnike usmerite neposredno v demon journald sistema. Beleženje Dockerja prek journald se brezhibno povezuje z systemctl in zunanjimi posredniki dnevnikov.
Odprite konfiguracijsko datoteko:
sudo nano /etc/docker/daemon.json
Vsebino zamenjajte s konfiguracijo journald. Vsebino datoteke v celoti zamenjajte - odstranite vse prejšnje vnose log-opts, saj journald ne podpira možnosti max-size in max-file:
{ "log-driver": "journald" }
Shranite in zaprite datoteko. Konfiguracija je posodobljena.
Znova zaženite storitev. Storitev docker.service je treba znova naložiti, da se upravljanje dnevnikov prenese na journald:
sudo systemctl restart docker
Pri uporabi dnevnikov Dockerja z journald gonilnik journald odvzame Dockerju nadzor nad rotacijo. Rotacija dnevnikov še vedno obstaja, vendar jo v celoti obravnava dnevnik systemd zunaj Dockerja. Dnevniki so usmerjeni neposredno v dnevnik systemd. Indeksirani so po poljih metapodatkov vsebnika in niso vezani na enoto docker.service.
Operativno journald upravlja te dnevnike s konkretnimi omejitvami, nastavljenimi v /etc/systemd/journald.conf, zlasti SystemMaxUse, RuntimeMaxUse in MaxRetentionSec. To prinaša precejšnje tveganje z velikim dosegom posledic (blast radius): izčrpanje journald lahko v produkciji vpliva na beleženje ssh, dnevnike jedra, revizijske dnevnike in vse druge storitve, ki si delijo dnevnik. Upoštevajte, da možnosti max-size in max-file veljata samo za gonilnika json-file in local, ne za journald.
Za uveljavitev sprememb konfiguracije journald:
sudo systemctl restart systemd-journald # Or to trigger immediate rotation without a full restart: sudo systemctl kill -s SIGUSR2 systemd-journald
Uporabite dnevnike Dockerja z journald v okoljih, kjer se dnevniki zbirajo neposredno iz sistemskega dnevnika.
4. korak: Upravljanje izpisa journalctl
Ko rotacijo dnevnikov Dockerja nastavite prek journald, z dnevniki upravljate z journalctl namesto z docker logs. Storitev journald te dnevnike obdeluje centralno.
Za ogled dnevnikov določenega vsebnika z dnevniki Dockerja v journald zaženite:
journalctl CONTAINER_NAME=<YOUR_CONTAINER_NAME> -o cat
Če raje filtrirate po ID-ju namesto po imenu, uporabite CONTAINER_ID_FULL=$(docker inspect -f '{{.Id}}' <YOUR_CONTAINER_NAME>) za celoten ID ali ID speljite skozi cut -c1-12, da dobite kratko obliko, shranjeno v CONTAINER_ID. Polje _CONTAINER_ID pripada systemd-cgroup in ne ustreza ID-ju vsebnika Docker.
Pričakovani izpis:
Application started successfully
5. korak: Preverjanje
Za preverjanje konfiguracije gonilnika beleženja Dockerja na delujočem vsebniku zaženite testni vsebnik:
docker run -d --name log-test nginx:latest
Preglejte možnosti dnevnikov vsebnika:
docker inspect -f '{{.HostConfig.LogConfig.Type}}' log-test
Pričakovani izpis za gonilnik local:
local
Če ste nastavili journald, bo izpis journald.
Preverite uveljavljene parametre za gonilnik local:
docker inspect -f '{{.HostConfig.LogConfig.Config}}' log-test
Pričakovani izpis:
map[max-file:3 max-size:50m]
To potrjuje, da je vaša konfiguracija beleženja Dockerja v daemon.json uspešno uveljavila parametra max-size in max-file za dnevnike Dockerja. Upoštevajte, da journald tu ne izpostavlja možnosti max-size ali max-file, ker je rotacija prepuščena operacijskemu sistemu.
S tem ukazom poiščite obstoječe vsebnike, ki še uporabljajo prejšnji gonilnik. Gonilnik beleženja se določi ob ustvarjanju vsebnika - te vsebnike je treba znova ustvariti (npr. z docker compose up -d --force-recreate), da podedujejo novo konfiguracijo:
docker ps -aq | xargs -r docker inspect -f '{{.Name}}: {{.HostConfig.LogConfig.Type}}'
Razveljavitev sprememb
Za vrnitev globalne konfiguracije gonilnika dnevnikov na privzeto obliko odstranite konfiguracijo iz daemon.json.
Odstranite datoteko (pred spreminjanjem vedno naredite varnostno kopijo konfiguracijskih datotek) in znova zaženite storitev Docker:
sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.bak.$(date +%F) sudo rm /etc/docker/daemon.json sudo systemctl restart docker
Razveljavitev teh sprememb takoj odstrani omejitve za vse na novo ustvarjene vsebnike, kar ob velikih količinah dnevnikov grozi z izčrpanjem prostora na disku.
Če /etc/docker/daemon.json vsebuje nepovezane nastavitve demona (zrcala registra, gonilnik shrambe, DNS, MTU, insecure-registries ipd.), se bodo z odstranitvijo datoteke izbrisale tudi te. Datoteko najprej varnostno kopirajte (kot je prikazano zgoraj) ali jo ročno uredite in odstranite samo razdelka log-driver in log-opts.
Odpravljanje težav
journalctlzaCONTAINER_IDne vrne izpisa: gonilnikjournaldv Dockerju vCONTAINER_IDzapiše kratek 12-mestni ID, medtem kodocker inspectvrne celoten 64-mestni ID. Namesto tega uporabiteCONTAINER_NAMEaliCONTAINER_ID_FULL.- Obstoječi vsebniki po ponovnem zagonu še vedno uporabljajo
json-file: ukazdocker updategonilnika beleženja ne spremeni. Za uveljavitev novega gonilnika beleženja morate vsebnik znova ustvariti (npr. zdocker compose downin natoup). max-sizeinmax-filezjournaldnimata učinka: rotacija dnevnikov zajournaldse upravlja globalno prek/etc/systemd/journald.conf(npr.SystemMaxUse), ne preklog-optsDockerja.
Zaključek
Pravilno upravljanje izhoda vsebnikov je temeljni del zanesljive infrastrukture. S pravilno izbiro med gonilnikoma json-file in local v Dockerju preprečite težave s shrambo. Ne glede na to, ali rotacijo dnevnikov Dockerja nastavite z lahkim lokalnim datotečnim gonilnikom (local) Dockerja ali se izvorno povežete prek beleženja Dockerja z journald, je vaše okolje zdaj pripravljeno na varno obdelavo obsežnih tokov dnevnikov. Z uporabo teh praks rotacije dnevnikov Dockerja ostane konfiguracija vašega gonilnika beleženja Dockerja stabilna, viri gostitelja pa predvidljivi.
Različica dokumenta: 1.0
Zadnja posodobitev: maj 2026
Lastnik: Ekipa za tehnično dokumentacijo