Ichiga kirish va loglar — exec, logs, inspect

~12 daq · Docker · Konteynerlar bilan ishlash

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 logs bo'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] exec bilan 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:

  1. docker ps -a — holati va chiqish kodi
  2. docker logs nom — xato matni
  3. docker inspect nom — sozlamalar to'g'rimi (env, mounts, ports)
  4. docker exec -it nom sh — ichida fayllar va tarmoqni tekshirish
  5. 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; exit konteynerni to'xtatmaydi
  • Bazalarga — exec orqali (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