Ichiga kirish va loglar — exec, logs, inspect
Muammodan boshlaylik
Konteyner ishlab turibdi, lekin ilova kutilgandek ishlamayapti:
- Sahifa 500 xato beryapti — sababi qayerda?
- Konfiguratsiya fayli to'g'ri ulandimi?
- Konteyner ichidagi muhit o'zgaruvchilari qanday?
- Bazaga qo'lda so'rov yuborib ko'rish kerak
Konteyner — "qora quti" emas. Uning ichiga kirish va ichida nima bo'layotganini ko'rish mumkin.
docker logs — konteyner nima deyapti
Konteyner asosiy jarayonining stdout va stderr ga yozgan hamma narsasi:
docker logs api
docker logs -f api # real vaqtda kuzatish (follow)
docker logs --tail 50 api # oxirgi 50 qator
docker logs --since 10m api # oxirgi 10 daqiqa
docker logs -f --tail 20 -t api # -t — vaqt belgilari bilan
Debug ning birinchi qadami doim docker logs. Konteyner ishga tushib darhol to'xtasa — sababi deyarli har doim shu yerda:
docker run -d --name baza mysql:8.4
docker ps -a # Exited (1)
docker logs baza
error: database is uninitialized and password option is not specified
You need to specify one of the following as an environment variable:
- MYSQL_ROOT_PASSWORD
Aniq xato va yechim.
[!INFO] Docker faqat stdout/stderr ni ushlaydi. Ilova loglarni faylga yozsa (
/var/log/app.log) —docker logsbo'sh qoladi. Konteynerlashtirilgan ilovalar loglarni konsolga yozishi kerak — bu Docker dunyosining asosiy qoidasi (43-dars).
docker exec — ishlayotgan konteyner ichida buyruq
docker exec -it api sh # ichiga kirish (sh — deyarli har doim bor)
docker exec -it api bash # bash bo'lsa (alpine da yo'q)
/app # ls
node_modules package.json src
/app # cat .env
/app # env | grep DB
DB_HOST=baza
/app # exit
exit — faqat exec sessiyasi yopiladi, konteyner ishlashda davom etadi.
Bitta buyruq — kirmasdan:
docker exec api ls -la /app
docker exec api cat /etc/nginx/nginx.conf
docker exec api printenv NODE_ENV
Bazaga kirish
docker exec -it baza mysql -uroot -p
docker exec -it pg psql -U postgres
docker exec -it kesh redis-cli
Bazaning o'z mijozi konteyner ichida allaqachon bor — kompyuterga o'rnatish shart emas.
root sifatida
docker exec -it -u root api sh # image root siz foydalanuvchi bilan ishlasa
exec va run farqi
docker run |
docker exec |
|
|---|---|---|
| Nima qiladi | Yangi konteyner yaratadi | Mavjud, ishlayotgan konteynerda buyruq |
| Konteyner to'xtagan bo'lsa | — | Ishlamaydi |
[!WARNING]
execbilan konteyner ichida qilingan o'zgarishlar (paket o'rnatish, fayl tahrirlash) — vaqtinchalik (4-dars). Debug uchun — yaxshi; doimiy tuzatish uchun — Dockerfile ni o'zgartiring.
docker inspect — to'liq ma'lumot
docker inspect api
Katta JSON: holat, IP manzil, portlar, volume lar, muhit o'zgaruvchilari, restart siyosati, image...
Kerakli qismni olish — --format:
docker inspect -f '{{.State.Status}}' api # running
docker inspect -f '{{.State.ExitCode}}' api # oxirgi chiqish kodi
docker inspect -f '{{range .Config.Env}}{{println .}}{{end}}' api # muhit o'zgaruvchilari
docker inspect -f '{{json .Mounts}}' api # ulangan papkalar
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' api
Chiqish kodlari
| Kod | Ma'nosi |
|---|---|
0 |
Muvaffaqiyatli tugadi |
1 |
Ilova xatosi |
125 |
Docker ning o'zi xato berdi (noto'g'ri parametr) |
126 |
Buyruqni bajarib bo'lmadi (ruxsat yo'q) |
127 |
Buyruq topilmadi |
137 |
SIGKILL — ko'pincha xotira tugadi (OOM) yoki docker kill |
143 |
SIGTERM — docker stop |
137 — ko'p uchraydi: konteyner xotira chegarasidan oshib, tizim tomonidan o'ldirilgan (40-dars).
Boshqa foydali buyruqlar
docker top api # konteyner ichidagi jarayonlar
docker stats # barcha konteynerlarning CPU, xotira, tarmoq — real vaqtda
docker stats --no-stream api # bir martalik
docker diff api # image ga nisbatan qaysi fayllar o'zgargan (A — qo'shilgan, C — o'zgargan, D — o'chirilgan)
docker port api # port ulanishlari
Fayl nusxalash
docker cp api:/app/logs/xato.log ./xato.log # konteynerdan kompyuterga
docker cp ./config.json api:/app/config.json # kompyuterdan konteynerga
Konteyner to'xtatilgan bo'lsa ham ishlaydi — qulab tushgan konteynerdan fayl olish uchun.
Debug tartibi
Konteyner ishlamayapti:
docker ps -a— holati va chiqish kodidocker logs nom— xato matnidocker inspect nom— sozlamalar to'g'rimi (env, mounts, ports)docker exec -it nom sh— ichida fayllar va tarmoqni tekshirish- Ishga tushmasa — buyruqni almashtirib, ichiga kirish:
docker run -it --rm --entrypoint sh image
Nima uchun shunday?
Nima uchun Docker loglarni faqat konsoldan oladi, fayllardan emas?
Chunki konteyner — vaqtinchalik (4-dars): uning ichidagi log fayli konteyner bilan birga yo'qoladi. Konsol esa — universal "chiqish": Docker uni ushlab, istalgan joyga yo'naltira oladi — docker logs ga, faylga, Loki, Elasticsearch yoki bulut xizmatiga (43-dars). Ilova "logni qayerga yozish kerak" haqida o'ylamaydi — u shunchaki konsolga yozadi, qolgani infratuzilmaning ishi. Bu "12-factor app" tamoyillaridan biri.
Xulosa
Eslab qoling:
docker logs [-f] [--tail n] nom— debug ning birinchi qadami- Ilovalar konsolga yozsin, faylga emas
docker exec -it nom sh— ichiga kirish;exitkonteynerni to'xtatmaydi- Bazalarga —
execorqali (mysql,psql,redis-cli) docker inspect -f '{{...}}'— holat, env, mounts, IP- Chiqish kodi
137— ko'pincha xotira tugagan docker stats,top,diff,cp— qo'shimcha vositalar
Keyingi dars
9-dars: Portlar — -p, konteynerga brauzerdan kirish