13-bo‘lim
Jurnal va kuzatuv
Konteyner jurnali qayerdan keladi, nega faylga yozish ishlamaydi, aylanish sozlamalari, stats, events va salomatlik tekshiruvi.
Ushbu bo‘lim mundarijasi
Konteyner buzilganda birinchi savol - nima bo'ldi? Javob jurnalda bo'lishi kerak. Lekin konteynerda jurnal odatdagidan boshqacha ishlaydi.
Jurnal - bu oqim, fayl emas #
Docker konteynerdagi 1-jarayonning stdout va stderr
oqimlarini ushlab oladi. Ikkalasi ham docker logs ga tushadi:
docker logs oqim 2>&1 | sort
oddiy xabar
xato xabari
yana oddiy
Uch qator ham joyida.
E'tibor bering: 2>&1 bo'lmasa quvurga faqat stdout tushardi va
xato xabari saralashdan chetda qolardi.
Yuqorida sort ishlatganimizni payqadingizmi? Bu bejiz emas.
stdout va stderr alohida buferlanadi, shuning uchun
docker logs ularni turli tartibda ko'rsatishi mumkin. Bir
xil konteynerni uch marta ishga tushirib sinadim - tartib ikki
xil chiqdi.
Tartib muhim bo'lsa, ilova bitta oqimga yozsin (odatda
stdout) yoki har bir qatorga o'z vaqt belgisini qo'ysin.
Oqimlarni ajratish mumkin - docker logs ularni haqiqiy
stdout/stderr sifatida qaytaradi:
docker logs oqim 2>/dev/null
oddiy xabar
yana oddiy
docker logs oqim 2>&1 1>/dev/null
xato xabari
Faylga yozilgan jurnal ko'rinmaydi #
Bu konteynerga o'tayotgan jamoalar duch keladigan birinchi
muammo. Ilova jurnalni /var/log/ilova.log ga yozadi:
docker logs faylga
echo "(yuqorida hech narsa yo'q)"
(yuqorida hech narsa yo'q)
Fayl konteyner ichida bor, lekin docker logs uni ko'rmaydi - va
konteyner o'chganda fayl ham yo'qoladi.
Kodini o'zgartira olmasangiz, jurnal faylini stdout ga
yo'naltiring. Nginx obrazi aynan shunday qiladi:
ln -sf /dev/stdout /var/log/nginx/access.log
ln -sf /dev/stderr /var/log/nginx/error.log
Ko'p rasmiy obrazlar shu hiyladan foydalanadi.
Kerakli qismini olish #
docker logs --tail 3 hisob
qator 6
qator 7
qator 8
Vaqt belgisi bilan:
docker logs -t --tail 2 hisob | sed -E 's/^[^ ]+ /<vaqt> /'
<vaqt> qator 7
<vaqt> qator 8
(Haqiqiy chiqishda <vaqt> o'rnida 2026-09-16T00:28:27.123Z
ko'rinishidagi belgi turadi - biz uni o'qish uchun maskaladik.)
| Bayroq | Nima qiladi |
|---|---|
-f | Jonli kuzatadi (tail -f kabi) |
--tail N | Oxirgi N qator |
--since 10m | Oxirgi 10 daqiqa |
--until 2026-09-16T00:00:00 | Belgilangan vaqtgacha |
-t | Har qatorga vaqt belgisi qo'shadi |
--no-log-prefix | Compose da xizmat nomini olib tashlaydi |
Jurnal drayveri #
docker inspect hisob -f '{{.HostConfig.LogConfig.Type}}'
docker info --format 'Standart drayver: {{.LoggingDriver}}'
json-file
Standart drayver: json-file
json-file - jurnalni hostdagi faylga JSON ko'rinishida yozadi:
docker inspect hisob -f '{{.LogPath}}' | sed 's|/[0-9a-f]\{64\}|/<ID>|g'
/home/husanboy/.local/share/docker/containers/<ID>/<ID>-json.log
| Drayver | Qayerga yozadi |
|---|---|
json-file | Hostdagi fayl (standart) |
local | Hostdagi fayl, ixchamroq format |
journald | systemd jurnaliga |
syslog | Syslog serveriga |
fluentd / gelf | Markazlashgan jurnal tizimiga |
none | Hech qayerga - jurnal yo'qoladi |
Aylanish - bu majburiy #
Standart holatda json-file cheksiz o'sadi. Gapiruvchi ilova
bir necha oyda diskni to'ldiradi.
docker inspect cheklangan -f '{{json .HostConfig.LogConfig.Config}}'
{"max-file":"3","max-size":"10k"}
Bu konteyner 5000 qator yozdi, lekin jurnal cheklangan:
LP=$(docker inspect cheklangan -f '{{.LogPath}}')
ls "$LP"* | wc -l
du -k "$LP"* | awk '{j+=$1} END {print (j<40) ? "jami 40K dan kam" : j"K"}'
3
jami 40K dan kam
Uchta fayl, jami 30 kilobayt atrofida - aniq raqam qator uzunligiga qarab biroz o'zgaradi, lekin chegara ushlab turiladi.
Chegara bo'lmasa, bu bir necha yuz kilobayt bo'lardi.
Jurnal chegarasiz qoldirilsa, bir kuni server to'liq to'ladi. Shundan keyin hech narsa ishlamaydi: baza yoza olmaydi, yangi konteyner ko'tarilmaydi, hatto SSH ham qiynaladi.
Buni hamma konteyner uchun bir joyda yoqing -
/etc/docker/daemon.json:
{
"log-driver": "json-file",
"log-opts": { "max-size": "10m", "max-file": "3" }
}
Shundan keyin har bir yangi konteyner shu chegarani oladi. Mavjudlariga esa qayta yaratish kerak.
Compose da xizmat darajasida:
services:
ilova:
image: dokon:1.0
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
Resurs iste'moli - docker stats #
docker stats --no-stream --format '{{.Name}} {{.CPUPerc}}' | sort
cheklangan 0.00%
hisob 0.00%
To'liq jadval ko'proq ustun beradi (qiymatlar sizda boshqacha bo'ladi):
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % PIDS
59184cf6c51b hisob 0.00% 876KiB / 31.29GiB 0.00% 1
^^^^^^^^
chegara qo'yilmagan - butun host xotirasi
--no-stream bir marta o'lchab chiqadi; usiz stats jonli
yangilanib turadi.
MEM USAGE / LIMIT dagi limitKonteynerga xotira chegarasi qo'yilmagan bo'lsa, bu ustunda butun hostning xotirasi ko'rinadi.
Ya'ni konteyner kerak bo'lsa serverning hamma xotirasini yeb qo'yishi mumkin. Buni 14-bobda tuzatamiz.
Salomatlik tekshiruvi #
12-bobda uni Compose da ko'rdik. docker run da ham bor:
docker rm -f salomat >/dev/null 2>&1
docker run -d --name salomat \
--health-cmd='test -f /tayyor' --health-interval=1s --health-retries=3 \
alpine:3.21 sh -c 'sleep 3; touch /tayyor; sleep 300' >/dev/null
sleep 1
echo "1-soniya : $(docker inspect salomat -f '{{.State.Health.Status}}')"
sleep 6
echo "7-soniya : $(docker inspect salomat -f '{{.State.Health.Status}}')"
1-soniya : starting
7-soniya : healthy
Uchta holat bor: starting, healthy, unhealthy.
unhealthy bo'lgan konteyner o'zi qayta ishga tushmaydi -
Docker faqat holatni belgilaydi. Qayta ishga tushirishni
orkestrator (Compose restart, Swarm, Kubernetes) qiladi.
Hodisalar oqimi - docker events #
docker run --rm --name hodisa alpine:3.21 true >/dev/null 2>&1
sleep 1
docker events --since 10s --until 0s --filter 'container=hodisa' \
--format '{{.Type}} {{.Action}} {{.Actor.Attributes.name}}'
container create hodisa
container attach hodisa
container start hodisa
container die hodisa
container destroy hodisa
Bitta docker run --rm beshta hodisa hosil qildi. Bu oqim
monitoring tizimlari uchun asosiy manba: konteyner kutilmaganda
die qilsa, ogohlantirish shu yerdan chiqadi.
Xulosa #
- Docker 1-jarayonning
stdoutvastderroqimlarini ushlaydi - faylga yozilgan jurnalni emas. - Ikki oqim tartibi kafolatlanmagan; tartib muhim bo'lsa bitta oqimga yozing.
docker logschiqishida oqimlar ajratilgan holicha qoladi -2>/dev/nullbilan faqatstdoutni olish mumkin.- Mavjud ilovani moslashtirish uchun jurnal faylini
/dev/stdoutga bog'lang - rasmiy obrazlar shunday qiladi. --tail,--since,-t,-f- kerakli qismini ajratish uchun.- Standart drayver
json-file; u hostdagi faylga yozadi va cheksiz o'sadi. - Aylanishni (
max-size,max-file) majburiy deb biling - eng yaxshisidaemon.jsonda hamma uchun bir joyda. - Disk to'lishi - eng ko'p uchraydigan ishlab chiqarish nosozliklaridan biri.
docker statsda xotira chegarasi yo'q konteyner butun host xotirasini limit sifatida ko'rsatadi.unhealthykonteynerni Docker o'zi qayta ishga tushirmaydi - buni orkestrator qiladi.docker eventskonteyner hayotidagi har bir o'zgarishni oqim sifatida beradi.
stdoutvastderrga yozadigan konteyner yarating vadocker logschiqishini ko'ring.- Oqimlarni
2>/dev/nullbilan ajrating. - Faylga yozadigan konteyner yarating va
docker logsbo'sh ekanini tasdiqlang. - Jurnal faylini
/dev/stdoutga bog'lab, muammoni tuzating. --tailva--sincebilan jurnalni cheklang.docker inspectorqali jurnal faylining yo'lini toping.max-size=10kbilan konteyner ishga tushirib, fayllar sonini sanang.daemon.jsonuchun aylanish sozlamasini yozing.docker statsbilan ikkita konteynerni solishtiring.docker eventsni ochiq qoldirib, boshqa terminalda konteyner ishga tushiring va hodisalarni kuzating.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.