13-bo‘lim

Jurnal va kuzatuv

Konteyner jurnali qayerdan keladi, nega faylga yozish ishlamaydi, aylanish sozlamalari, stats, events va salomatlik tekshiruvi.

🕑 18 daqiqa o‘qish 📄 806 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Jurnal - bu oqim, fayl emas
  2. Faylga yozilgan jurnal ko'rinmaydi
  3. Kerakli qismini olish
  4. Jurnal drayveri
  5. Aylanish - bu majburiy
  6. Resurs iste'moli - docker stats
  7. Salomatlik tekshiruvi
  8. Hodisalar oqimi - docker events
  9. Xulosa

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:

Terminal
docker logs oqim 2>&1 | sort
Natija
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.

Ikki oqim tartibi kafolatlanmagan

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:

Terminal
docker logs oqim 2>/dev/null
Natija
oddiy xabar
yana oddiy
Terminal
docker logs oqim 2>&1 1>/dev/null
Natija
xato xabari

Faylga yozilgan jurnal ko'rinmaydi #

Bu konteynerga o'tayotgan jamoalar duch keladigan birinchi muammo. Ilova jurnalni /var/log/ilova.log ga yozadi:

Terminal
docker logs faylga
echo "(yuqorida hech narsa yo'q)"
Natija
(yuqorida hech narsa yo'q)

Fayl konteyner ichida bor, lekin docker logs uni ko'rmaydi - va konteyner o'chganda fayl ham yo'qoladi.

Jurnal qayerga boradi To'g'ri Ilova stdout ga yozadi Docker ushlab oladi docker logs, SIEM, Loki Noto'g'ri Ilova faylga yozadi Yozish qatlamida qoladi Konteyner o'chsa - yo'qoladi va diskni jimgina to'ldiradi Konteyner "bir martalik" - unga yozilgan hech narsaga ishonmang. Jurnalni tashqariga chiqarish - konteyner tizimining vazifasi.
Konteynerda jurnal faylga emas, oqimga yoziladi
Mavjud ilovani qanday moslashtirish kerak?

Kodini o'zgartira olmasangiz, jurnal faylini stdout ga yo'naltiring. Nginx obrazi aynan shunday qiladi:

Natija
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 #

Terminal
docker logs --tail 3 hisob
Natija
qator 6
qator 7
qator 8

Vaqt belgisi bilan:

Terminal
docker logs -t --tail 2 hisob | sed -E 's/^[^ ]+ /<vaqt> /'
Natija
<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.)

BayroqNima qiladi
-fJonli kuzatadi (tail -f kabi)
--tail NOxirgi N qator
--since 10mOxirgi 10 daqiqa
--until 2026-09-16T00:00:00Belgilangan vaqtgacha
-tHar qatorga vaqt belgisi qo'shadi
--no-log-prefixCompose da xizmat nomini olib tashlaydi

Jurnal drayveri #

Terminal
docker inspect hisob -f '{{.HostConfig.LogConfig.Type}}'
docker info --format 'Standart drayver: {{.LoggingDriver}}'
Natija
json-file
Standart drayver: json-file

json-file - jurnalni hostdagi faylga JSON ko'rinishida yozadi:

Terminal
docker inspect hisob -f '{{.LogPath}}' | sed 's|/[0-9a-f]\{64\}|/<ID>|g'
Natija
/home/husanboy/.local/share/docker/containers/<ID>/<ID>-json.log
DrayverQayerga yozadi
json-fileHostdagi fayl (standart)
localHostdagi fayl, ixchamroq format
journaldsystemd jurnaliga
syslogSyslog serveriga
fluentd / gelfMarkazlashgan jurnal tizimiga
noneHech qayerga - jurnal yo'qoladi

Aylanish - bu majburiy #

Standart holatda json-file cheksiz o'sadi. Gapiruvchi ilova bir necha oyda diskni to'ldiradi.

Terminal
docker inspect cheklangan -f '{{json .HostConfig.LogConfig.Config}}'
Natija
{"max-file":"3","max-size":"10k"}

Bu konteyner 5000 qator yozdi, lekin jurnal cheklangan:

Terminal
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"}'
Natija
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.

Disk to'lishi - eng ko'p uchraydigan ishlab chiqarish nosozligi

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:

Natija
{
  "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:

YAML
services:
  ilova:
    image: dokon:1.0
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

Resurs iste'moli - docker stats #

Terminal
docker stats --no-stream --format '{{.Name}} {{.CPUPerc}}' | sort
Natija
cheklangan 0.00%
hisob 0.00%

To'liq jadval ko'proq ustun beradi (qiymatlar sizda boshqacha bo'ladi):

Natija
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 limit

Konteynerga 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:

Terminal
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}}')"
Natija
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 #

Terminal
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}}'
Natija
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 stdout va stderr oqimlarini ushlaydi - faylga yozilgan jurnalni emas.
  • Ikki oqim tartibi kafolatlanmagan; tartib muhim bo'lsa bitta oqimga yozing.
  • docker logs chiqishida oqimlar ajratilgan holicha qoladi - 2>/dev/null bilan faqat stdout ni olish mumkin.
  • Mavjud ilovani moslashtirish uchun jurnal faylini /dev/stdout ga 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 yaxshisi daemon.json da hamma uchun bir joyda.
  • Disk to'lishi - eng ko'p uchraydigan ishlab chiqarish nosozliklaridan biri.
  • docker stats da xotira chegarasi yo'q konteyner butun host xotirasini limit sifatida ko'rsatadi.
  • unhealthy konteynerni Docker o'zi qayta ishga tushirmaydi - buni orkestrator qiladi.
  • docker events konteyner hayotidagi har bir o'zgarishni oqim sifatida beradi.
Amaliy topshiriq
  1. stdout va stderr ga yozadigan konteyner yarating va docker logs chiqishini ko'ring.
  2. Oqimlarni 2>/dev/null bilan ajrating.
  3. Faylga yozadigan konteyner yarating va docker logs bo'sh ekanini tasdiqlang.
  4. Jurnal faylini /dev/stdout ga bog'lab, muammoni tuzating.
  5. --tail va --since bilan jurnalni cheklang.
  6. docker inspect orqali jurnal faylining yo'lini toping.
  7. max-size=10k bilan konteyner ishga tushirib, fayllar sonini sanang.
  8. daemon.json uchun aylanish sozlamasini yozing.
  9. docker stats bilan ikkita konteynerni solishtiring.
  10. docker events ni ochiq qoldirib, boshqa terminalda konteyner ishga tushiring va hodisalarni kuzating.

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.