19-bo‘lim

Nosozliklarni topish

Eng ko'p uchraydigan xatolar va ularning aniq xabarlari, to'xtagan konteynerni tekshirish, docker diff va inspect.

🕑 16 daqiqa o‘qish 📄 879 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Birinchi uchta buyruq
  2. Konteyner darhol tugab qolyapti
  3. Buyruq topilmadi
  4. Bajarish huquqi yo'q
  5. Port band
  6. Xizmat nomi yechilmayapti
  7. To'xtagan konteynerni tekshirish
  8. Nima o'zgargan? - docker diff
  9. inspect - eng ko'p kerak bo'ladigan maydonlar
  10. Tez-tez uchraydigan holatlar
  11. Xulosa

Konteyner ishlamayapti. Qayerdan boshlash kerak?

Bu bob aniq xato xabarlari haqida - chunki xabarni tanish sababni topishning yarmidir.

Birinchi uchta buyruq #

Har qanday nosozlikda shu uchtasidan boshlang:

Natija
docker ps -a          # konteyner qanday holatda?
docker logs <nom>     # nima dedi?
docker inspect <nom>  # qanday sozlangan?

Konteyner darhol tugab qolyapti #

Terminal
docker run -d --name tez alpine:3.21 \
    sh -c 'echo "boshlandi"; exit 3' >/dev/null
sleep 2
docker ps -a --filter name=tez --format '{{.Names}} {{.State}}'
echo "kod: $(docker inspect tez -f '{{.State.ExitCode}}')"
docker logs tez
Natija
tez exited
kod: 3
boshlandi

Chiqish kodi ko'p narsani aytadi:

KodMa'nosi
0Muvaffaqiyatli tugadi - ehtimol buyruq uzoq ishlamaydigan turdan
1, 2, ...Ilova o'zi xato bilan chiqdi - jurnalga qarang
125Docker buyrug'ining o'zida xato
126Fayl topildi, lekin bajarib bo'lmadi
127Buyruq topilmadi
137SIGKILL - docker stop yoki OOM (14-bob)
139Segmentatsiya xatosi
143SIGTERM bilan toza chiqdi

Buyruq topilmadi #

Terminal
docker run --rm alpine:3.21 /yoq-buyruq 2>&1 \
    | grep -oE 'exec: .*' | head -1
Natija
exec: "/yoq-buyruq": stat /yoq-buyruq: no such file or directory

Sabablari:

  • Yo'l noto'g'ri yozilgan
  • COPY fayl nomini noto'g'ri ko'chirgan
  • Obraz scratch yoki distroless va unda sh yo'q (7-bob)
  • Windows da yozilgan skriptda CRLF qator oxiri bor

Oxirgisi ayyor: fayl ko'rinadi, lekin #!/bin/sh\r ni yadro /bin/sh\r deb o'qiydi va bunday fayl yo'q.

Bajarish huquqi yo'q #

Terminal
docker run --rm huquq:1 2>&1 | tr ':' '\n' | tail -3
Natija
 permission denied

Run 'docker run --help' for more information

COPY fayl huquqlarini hostdan o'zgarishsiz oladi. Skript hostda chmod +x qilinmagan bo'lsa, obrazda ham bajarilmaydi.

Ikki yechim:

DOCKERFILE
COPY --chmod=755 skript.sh /skript.sh

yoki

DOCKERFILE
COPY skript.sh /skript.sh
RUN chmod +x /skript.sh

Port band #

Terminal
docker run -d --name p1 -p 8099:80 nginx:alpine >/dev/null 2>&1
sleep 2
docker run --rm -p 8099:80 nginx:alpine 2>&1 \
    | grep -oE 'port is already allocated' | head -1
Natija
port is already allocated

To'liq xabar qaysi manzil band ekanini ham aytadi - Bind for 127.0.0.1:8099 failed: ... yoki Bind for ::1:8099 failed: .... Qaysi biri chiqishi IPv4 va IPv6 dan qaysinisi avval urinilganiga bog'liq, shuning uchun biz faqat barqaror qismini oldik.

Kim band qilganini topish:

Natija
docker ps --format '{{.Names}}\t{{.Ports}}' | grep 8099
ss -tulpn | grep 8099

Xizmat nomi yechilmayapti #

Terminal
docker rm -f p1 >/dev/null 2>&1
docker run --rm alpine:3.21 ping -c1 -W2 yoq-xizmat 2>&1 | head -1
Natija
ping: bad address 'yoq-xizmat'

Tekshirish tartibi (9-bobdan):

  1. Ikkala konteyner bir tarmoqdami? docker inspect <nom> -f '{{.NetworkSettings.Networks}}'
  2. Tarmoq standart bridge emasmi? Unda DNS ishlamaydi.
  3. Compose da xizmat nomi ishlatilyaptimi, konteyner nomi emas?
  4. Nishon konteyner ishlayaptimi?
Konteyner ishlamayapti - qayerdan boshlash docker ps -a exited - tugab qolgan running - lekin javob bermayapti ExitCode + docker logs 137 - OOMKilled tekshiring 126/127 - yo'l yoki huquq Health + tarmoq + port docker exec ... ichkaridan sinang docker port, docker network inspect Har ikki yo'lda ham oxirgi to'xtash - docker inspect
Holat ikkiga bo'ladi - va yo'l shundan boshlanadi

To'xtagan konteynerni tekshirish #

Ishlayotgan konteynerga kirish oson:

Terminal
docker run -d --name tirik alpine:3.21 sleep 120 >/dev/null
docker exec tirik sh -c 'echo "ichkaridan ishladi"'
Natija
ichkaridan ishladi

To'xtaganiga esa kirib bo'lmaydi:

Terminal
docker exec tez sh -c 'echo x' 2>&1 | grep -oE 'is not running'
Natija
is not running

Lekin fayllarini olish mumkin - docker cp to'xtagan konteynerda ham ishlaydi:

Terminal
docker cp tez:/etc/alpine-release - | tar -tf - | head -1
Natija
alpine-release
Yiqilgan konteynerni o'chirmang

--rm bilan ishga tushirilgan konteyner yiqilsa, o'chib ketadi va tekshirish uchun hech narsa qolmaydi.

Nosozlikni qidirayotganda --rm ni olib tashlang. Keyin:

  • docker logs - nima dedi
  • docker cp - fayllarini oling
  • docker inspect - qanday sozlangan edi
  • docker commit - holatidan obraz yasab, uni tekshiring

docker commit <konteyner> tekshiruv:1 juda foydali: yiqilgan holatni obrazga aylantirib, ichida bemalol qidirasiz.

Nima o'zgargan? - docker diff #

Terminal
docker exec tirik sh -c 'echo yangi > /yangi-fayl'
docker diff tirik | head -3
Natija
A /yangi-fayl

A - qo'shilgan, C - o'zgargan, D - o'chirilgan.

Bu ilova qayerga yozayotganini topish uchun juda qulay - masalan --read-only qilishdan oldin qaysi papkalarga tmpfs kerakligini aniqlash uchun (14-bob).

inspect - eng ko'p kerak bo'ladigan maydonlar #

Terminal
docker inspect tirik -f 'Obraz   : {{.Config.Image}}'
docker inspect tirik -f 'Buyruq  : {{.Config.Cmd}}'
docker inspect tirik \
    -f 'Tarmoq  : {{range $k,$v := .NetworkSettings.Networks}}{{$k}} {{end}}'
docker inspect tirik -f 'Ulanish : {{len .Mounts}} ta'
Natija
Obraz   : alpine:3.21
Buyruq  : [sleep 120]
Tarmoq  : bridge
Ulanish : 0 ta
MaydonNimani aytadi
.State.ExitCodeNima uchun tugadi
.State.OOMKilledXotira yetmadimi (14-bob)
.State.Health.StatusSalomatlik tekshiruvi
.RestartCountNecha marta qayta ko'tarildi
.Config.Cmd / .Config.EntrypointNima ishga tushdi
.NetworkSettings.NetworksQaysi tarmoqda
.MountsNima ulangan
.HostConfig.LogConfigJurnal sozlamasi

Tez-tez uchraydigan holatlar #

BelgiEhtimoliy sabab
Darhol exited (0)Buyruq uzoq ishlamaydi - CMD ni tekshiring
Takror restartingIlova yiqilyapti - jurnal + OOMKilled
exited (137), OOMKilled: trueXotira chegarasi kichik
exited (137), OOMKilled: falsedocker stop SIGKILL yubordi (6-bob)
unhealthyhealthcheck buyrug'i noto'g'ri yoki ilova sekin
Nom yechilmaydiStandart bridge yoki boshqa tarmoq (9-bob)
Hostdan port ochilmaydi-p berilmagan (9-bob)
Fayl yo'qolganBind mount obraz mazmunini yopgan (8-bob)
docker logs bo'shIlova faylga yozyapti (13-bob)
Disk to'ldiJurnal aylanishi yo'q (13-bob)
Sir sizib chiqdi--build-arg ishlatilgan (10-bob)
Eng ko'p vaqt yeydigan xato - keshdagi eski obraz

"Kodni o'zgartirdim, lekin hech narsa o'zgarmadi" degan holat.

Sabablari:

  • Obraz qayta qurilmagan (docker compose up obrazni o'zi qayta qurmaydi - --build kerak)
  • latest tegi eski obrazga ishora qilyapti
  • Registry dan eski digest tortilgan

Tekshirish:

Natija
docker inspect <konteyner> -f '{{.Image}}'
docker images --digests | grep <obraz>

Ikkalasini solishtiring - ular bir xil bo'lishi kerak.

Xulosa #

  • Uch buyruqdan boshlang: docker ps -a, docker logs, docker inspect.
  • Chiqish kodi yo'nalish beradi: 126 - bajarib bo'lmadi, 127 - topilmadi, 137 - SIGKILL yoki OOM.
  • exec: "...": no such file or directory - yo'l xato yoki skriptda CRLF qator oxiri bor.
  • permission denied - COPY fayl huquqini hostdan oladi; COPY --chmod=755 yoki RUN chmod +x kerak.
  • port is already allocated - docker ps bilan kim band qilganini toping.
  • To'xtagan konteynerga docker exec ishlamaydi, lekin docker cp va docker logs ishlaydi.
  • Nosozlik qidirayotganda --rm ni olib tashlang - aks holda dalil yo'qoladi.
  • docker commit yiqilgan holatni obrazga aylantiradi.
  • docker diff ilova qayerga yozayotganini ko'rsatadi.
  • "Hech narsa o'zgarmadi" - odatda obraz qayta qurilmagan: docker compose up obrazni o'zi qurmaydi, --build kerak.
Amaliy topshiriq
  1. Nol bo'lmagan kod bilan chiqadigan konteyner yarating va kodini toping.
  2. Mavjud bo'lmagan buyruq bilan ishga tushirib, xabarni o'qing.
  3. Bajarish huquqisiz skriptni ko'chirib, xatoni ko'ring va ikki xil usulda tuzating.
  4. Bir portni ikki marta band qilib, xabarni o'qing.
  5. Boshqa tarmoqdagi konteynerga nom bo'yicha murojaat qiling.
  6. To'xtagan konteynerga exec qilishga urinib ko'ring.
  7. O'sha konteynerdan docker cp bilan fayl oling.
  8. docker diff bilan ilova qayerga yozayotganini aniqlang.
  9. docker commit bilan yiqilgan holatdan obraz yasang.
  10. O'z loyihangizda uchragan xatoni jadvaldagi sabablar bilan solishtiring.

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.