Konfiguracija rotacije logova Dockera s upravljačkim programom za zapisivanje: Docker journald zapisivanje i Docker local datotečni driver
Razina: Stručnjak
Procijenjeno vrijeme: ~20 minuta
Cilj: Konfigurirati rotaciju Docker zapisnika kako bi se osiguralo upravljanje zapisnicima bez zastoja i spriječilo iscrpljivanje prostora na disku.
Uvod
Neupravljani Docker zapisnici mogu brzo iscrpiti pohranu poslužitelja. Prema zadanim postavkama Docker daemon zapisuje zapisnike u formatu json-file bez ograničenja veličine. Za pouzdanu infrastrukturu morate konfigurirati rotaciju Docker zapisnika pomoću skalabilnog Docker upravljačkog programa za zapisivanje (logging driver). Ovaj vodič opisuje kako globalno implementirati rotaciju Docker zapisnika, bilo uz Docker zapisivanje putem journald-a, bilo uz Docker lokalni datotečni upravljački program (local). Odabir ispravne konfiguracije osigurava učinkovito upravljanje zapisnicima i stabilnost sustava.
Terminologija
Prije nastavka upoznajte se sa sljedećim osnovnim pojmovima:
- Docker: platforma za pokretanje aplikacija u izoliranim okruženjima koja se nazivaju kontejneri.
- Docker zapisnici: izlazni tokovi zabilježeni sa standardnog izlaza (Stdout) i standardnog izlaza za greške (Stderr) kontejnera.
- Rotacija zapisnika: praksa arhiviranja i brisanja starih zapisnika radi vraćanja prostora.
- Upravljački program za zapisivanje (logging driver): mehanizam kojim Docker bilježi, formatira i usmjerava zapisnike.
- Journald: systemd usluga zapisivanja, idealna za centralizirano zapisivanje na hostu.
- Lokalni datotečni upravljački program (local): ugrađeni visokoučinkoviti upravljački program optimiziran za lokalnu pohranu.
- Json-file: zadani upravljački program koji zapisuje zapisnike u JSON formatu.
- Docker daemon: pozadinska usluga koja upravlja Docker operacijama.
- Daemon.json: konfiguracijska datoteka daemona.
- Konfiguracija upravljačkog programa zapisnika: globalne postavke zapisivanja ili postavke po kontejneru.
- Opcije zapisnika: posebni parametri koji se prosljeđuju upravljačkom programu.
- Max-size: granična veličina nakon koje se datoteka zapisnika rotira.
- Max-file: najveći broj zadržanih rotiranih datoteka.
Preduvjeti
Prije početka provjerite imate li:
- Operacijski sustav: Ubuntu 22.04 / 24.04 LTS, Debian 12 / 13, RHEL 9 / 10, AlmaLinux 9 / 10, Rocky Linux 9 / 10
- Docker: instalirana verzija 24.x ili novija
- Pristup: sudo ovlasti
- Potrebno znanje: administracija sustava Linux i koncepti Infrastructure as Code
Korak 1: Razumijevanje razlika između Docker upravljačkih programa json-file i local
Pri procjeni Docker upravljačkih programa json-file i local izbor ovisi o performansama i dodatnom opterećenju. Zadani upravljački program json-file jednostavan je, ali troši više CPU-a i prostora na disku zbog JSON formatiranja. Nasuprot tome, datotečni upravljački program local koristi binarni format samo za dodavanje (append-only) optimiziran posebno za učinkovitost rotacije. U uobičajenom produkcijskom opterećenju Docker lokalni datotečni upravljački program (local) smanjuje opterećenje diska i pouzdano nativno provodi rotaciju.
Za provjeru trenutnog upravljačkog programa pokrenite:
docker info --format '{{.LoggingDriver}}'
Očekivani ispis:
json-file
Ako vidite json-file, nastavite s izmjenom konfiguracije Docker zapisivanja u daemon.json.
Korak 2: Konfiguriranje rotacije Docker zapisnika s lokalnim datotečnim upravljačkim programom (local)
Za provedbu globalnih ograničenja na sve kontejnere uredit ćete datoteku /etc/docker/daemon.json. To je preporučeni pristup za konfiguraciju Docker zapisivanja u daemon.json.
Otvorite konfiguracijsku datoteku:
Ako /etc/docker/daemon.json ne postoji na vašem sustavu, nano će je izraditi pri spremanju. To je normalno - Docker koristi ugrađene zadane vrijednosti kada datoteke nema.
sudo nano /etc/docker/daemon.json
Dodajte sljedeću konfiguraciju upravljačkog programa zapisnika:
{ "log-driver": "local", "log-opts": { "max-size": "50m", "max-file": "3" } }
Spremite i zatvorite datoteku. Nove postavke zapisuju se na disk. Ova konfiguracija primjenjuje upravljački program globalno. Opcije zapisnika nalažu Dockeru da rotira zapisnike kada dosegnu 50 megabajta (max-size za Docker zapisnike) i zadrži najviše 3 datoteke (max-file za Docker zapisnike). Imajte na umu da upravljački program local, za razliku od journald, i dalje nativno podržava ta izričita ograničenja veličine i broja datoteka.
Ponovno pokrenite Docker daemon kako biste primijenili promjene. Usluga docker.service upravlja kontejnerima, pa se njezinim ponovnim pokretanjem ograničenja primjenjuju:
sudo systemctl restart docker
Na nekoliko sekundi izgubit ćete vezu s daemonom. Nakon ponovnog pokretanja svi novoizrađeni kontejneri koristit će Docker lokalni datotečni upravljački program (local) i naslijediti ova ograničenja max-size i max-file za Docker zapisnike.
Upravljački program za zapisivanje nepromjenjiv je po kontejneru. Postojeći kontejneri zadržat će stari upravljački program zapisnika; docker update ga ne može promijeniti. Za primjenu novog Docker upravljačkog programa za zapisivanje potrebno je ponovno izraditi kontejner (npr. pomoću docker compose up -d ili ponovne isporuke putem orkestracije), jer ne postoji migracija uživo. Inače ćete na hostu dobiti pomiješana stanja zapisivanja.
Dodatno, upoznajte se s redoslijedom prioriteta konfiguracija zapisivanja:
- CLI zastavice (
docker run --log-driver) nadjačavaju sve ostalo. - Nadjačavanja zapisivanja u
docker-compose.ymldjeluju po usluzi u trenutku izrade kontejnera. daemon.jsondjeluje kao zadana globalna vrijednost za sve kontejnere bez izričite konfiguracije.
Korak 3: Omogućavanje Docker zapisivanja putem journald-a kao Docker upravljačkog programa za zapisivanje
Alternativno, zapisnike možete usmjeriti izravno na journald daemon sustava. Docker zapisivanje putem journald-a besprijekorno se integrira sa systemctl i vanjskim prosljeditljima zapisnika.
Otvorite konfiguracijsku datoteku:
sudo nano /etc/docker/daemon.json
Zamijenite sadržaj konfiguracijom journald. Potpuno zamijenite sadržaj datoteke - uklonite sve prethodne unose log-opts, jer journald ne podržava opcije max-size i max-file:
{ "log-driver": "journald" }
Spremite i zatvorite datoteku. Konfiguracija je ažurirana.
Ponovno pokrenite uslugu. Uslugu docker.service potrebno je ponovno učitati kako bi se upravljanje zapisnicima prebacilo na journald:
sudo systemctl restart docker
Pri uporabi Docker zapisnika s journald-om upravljački program journald uklanja kontrolu rotacije na strani Dockera. Rotacija zapisnika i dalje postoji, ali njome u cijelosti, izvan Dockera, upravlja systemd dnevnik (journal). Zapisnici se usmjeravaju izravno u systemd dnevnik. Indeksirani su prema poljima metapodataka kontejnera, a ne vezani uz jedinicu docker.service.
Operativno, journald upravlja tim zapisnicima konkretnim ograničenjima konfiguriranima u /etc/systemd/journald.conf, osobito SystemMaxUse, RuntimeMaxUse i MaxRetentionSec. To nosi znatan rizik velikog dosega posljedica (blast radius): iscrpljivanje journald-a može u produkciji utjecati na ssh zapisivanje, zapisnike jezgre, revizijske zapisnike i sve druge usluge koje dijele dnevnik. Imajte na umu da se opcije max-size i max-file primjenjuju samo na upravljačke programe json-file i local, a ne na journald.
Za primjenu promjena u konfiguraciji journald-a:
sudo systemctl restart systemd-journald # Or to trigger immediate rotation without a full restart: sudo systemctl kill -s SIGUSR2 systemd-journald
Koristite Docker zapisnike s journald-om pri isporuci u okruženja u kojima se zapisnici prikupljaju izravno iz sustavnog dnevnika.
Korak 4: Upravljanje ispisom journalctl
Kada rotaciju Docker zapisnika konfigurirate putem journald-a, sa zapisnicima radite pomoću journalctl umjesto docker logs. Usluga journald centralizirano obrađuje te zapisnike.
Za pregled zapisnika određenog kontejnera uz Docker zapisnike u journald-u pokrenite:
journalctl CONTAINER_NAME=<YOUR_CONTAINER_NAME> -o cat
Ako radije filtrirate prema ID-u umjesto prema imenu, koristite CONTAINER_ID_FULL=$(docker inspect -f '{{.Id}}' <YOUR_CONTAINER_NAME>) za puni ID ili provedite ID kroz cut -c1-12 kako biste dobili kratki oblik pohranjen u CONTAINER_ID. Polje _CONTAINER_ID pripada systemd-cgroupu i ne odgovara ID-u Docker kontejnera.
Očekivani ispis:
Application started successfully
Korak 5: Provjera
Za provjeru konfiguracije Docker upravljačkog programa za zapisivanje na kontejneru koji radi, pokrenite testni kontejner:
docker run -d --name log-test nginx:latest
Pregledajte opcije zapisnika kontejnera:
docker inspect -f '{{.HostConfig.LogConfig.Type}}' log-test
Očekivani ispis za upravljački program local:
local
Ako ste konfigurirali journald, ispis će umjesto toga biti journald.
Provjerite primijenjene parametre za upravljački program local:
docker inspect -f '{{.HostConfig.LogConfig.Config}}' log-test
Očekivani ispis:
map[max-file:3 max-size:50m]
Ovo potvrđuje da je vaša konfiguracija Docker zapisivanja u daemon.json uspješno primijenila parametre max-size i max-file za Docker zapisnike. Imajte na umu da journald ovdje ne izlaže opcije max-size ili max-file, jer je rotacija prepuštena operacijskom sustavu.
Ovom naredbom pronađite postojeće kontejnere koji još koriste prethodni upravljački program. Upravljački program za zapisivanje određuje se pri izradi kontejnera - te je kontejnere potrebno ponovno izraditi (npr. pomoću docker compose up -d --force-recreate) kako bi naslijedili novu konfiguraciju:
docker ps -aq | xargs -r docker inspect -f '{{.Name}}: {{.HostConfig.LogConfig.Type}}'
Poništavanje promjena
Za vraćanje globalne konfiguracije upravljačkog programa zapisnika na zadani format uklonite konfiguraciju iz daemon.json.
Uklonite datoteku (prije izmjene uvijek napravite sigurnosnu kopiju konfiguracijskih datoteka) i ponovno pokrenite Docker uslugu:
sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.bak.$(date +%F) sudo rm /etc/docker/daemon.json sudo systemctl restart docker
Poništavanje ovih promjena odmah uklanja ograničenja za sve novoizrađene kontejnere, što riskira iscrpljivanje prostora na disku ako generiraju velike količine zapisnika.
Ako /etc/docker/daemon.json sadrži nepovezane postavke daemona (zrcala registra, upravljački program pohrane, DNS, MTU, insecure-registries itd.), uklanjanjem datoteke obrisat ćete i njih. Ili prvo napravite sigurnosnu kopiju datoteke (kako je prikazano gore) ili je ručno uredite i uklonite samo odjeljke log-driver i log-opts.
Rješavanje problema
journalctlne vraća ispis zaCONTAINER_ID: Docker upravljački programjournalduCONTAINER_IDzapisuje kratki ID od 12 znakova, dokdocker inspectvraća puni ID od 64 znaka. Umjesto toga koristiteCONTAINER_NAMEiliCONTAINER_ID_FULL.- Postojeći kontejneri i nakon ponovnog pokretanja još koriste
json-file: naredbadocker updatene mijenja upravljački program za zapisivanje. Za primjenu novog upravljačkog programa morate ponovno izraditi kontejner (npr. pomoćudocker compose down, a zatimup). max-sizeimax-filenemaju učinka uzjournald: rotacijom zapisnika zajournaldupravlja se globalno putem/etc/systemd/journald.conf(npr.SystemMaxUse), a ne putem Dockerovihlog-opts.
Zaključak
Ispravno upravljanje izlazom kontejnera temeljni je dio pouzdane infrastrukture. Ispravnim odabirom između Docker upravljačkih programa json-file i local sprječavate probleme s pohranom. Bez obzira na to konfigurirate li rotaciju Docker zapisnika laganim Docker lokalnim datotečnim upravljačkim programom (local) ili se nativno integrirate putem Docker zapisivanja s journald-om, vaše je okruženje sada spremno za sigurnu obradu golemih tokova zapisnika. Primjenom ovih praksi rotacije Docker zapisnika konfiguracija vašeg Docker upravljačkog programa za zapisivanje ostaje stabilna, a resursi hosta predvidljivi.
Verzija dokumenta: 1.0
Posljednje ažuriranje: svibanj 2026.
Vlasnik: Tim za tehničku dokumentaciju