19-bo‘lim
Nosozliklarni topish
Eng ko'p uchraydigan xatolar va ularning aniq xabarlari, to'xtagan konteynerni tekshirish, docker diff va inspect.
Ushbu bo‘lim mundarijasi
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:
docker ps -a # konteyner qanday holatda?
docker logs <nom> # nima dedi?
docker inspect <nom> # qanday sozlangan?
Konteyner darhol tugab qolyapti #
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
tez exited
kod: 3
boshlandi
Chiqish kodi ko'p narsani aytadi:
| Kod | Ma'nosi |
|---|---|
0 | Muvaffaqiyatli tugadi - ehtimol buyruq uzoq ishlamaydigan turdan |
1, 2, ... | Ilova o'zi xato bilan chiqdi - jurnalga qarang |
125 | Docker buyrug'ining o'zida xato |
126 | Fayl topildi, lekin bajarib bo'lmadi |
127 | Buyruq topilmadi |
137 | SIGKILL - docker stop yoki OOM (14-bob) |
139 | Segmentatsiya xatosi |
143 | SIGTERM bilan toza chiqdi |
Buyruq topilmadi #
docker run --rm alpine:3.21 /yoq-buyruq 2>&1 \
| grep -oE 'exec: .*' | head -1
exec: "/yoq-buyruq": stat /yoq-buyruq: no such file or directory
Sabablari:
- Yo'l noto'g'ri yozilgan
COPYfayl nomini noto'g'ri ko'chirgan- Obraz
scratchyoki distroless va undashyo'q (7-bob) - Windows da yozilgan skriptda
CRLFqator 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 #
docker run --rm huquq:1 2>&1 | tr ':' '\n' | tail -3
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:
COPY --chmod=755 skript.sh /skript.sh
yoki
COPY skript.sh /skript.sh
RUN chmod +x /skript.sh
Port band #
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
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:
docker ps --format '{{.Names}}\t{{.Ports}}' | grep 8099
ss -tulpn | grep 8099
Xizmat nomi yechilmayapti #
docker rm -f p1 >/dev/null 2>&1
docker run --rm alpine:3.21 ping -c1 -W2 yoq-xizmat 2>&1 | head -1
ping: bad address 'yoq-xizmat'
Tekshirish tartibi (9-bobdan):
- Ikkala konteyner bir tarmoqdami?
docker inspect <nom> -f '{{.NetworkSettings.Networks}}' - Tarmoq standart bridge emasmi? Unda DNS ishlamaydi.
- Compose da xizmat nomi ishlatilyaptimi, konteyner nomi emas?
- Nishon konteyner ishlayaptimi?
To'xtagan konteynerni tekshirish #
Ishlayotgan konteynerga kirish oson:
docker run -d --name tirik alpine:3.21 sleep 120 >/dev/null
docker exec tirik sh -c 'echo "ichkaridan ishladi"'
ichkaridan ishladi
To'xtaganiga esa kirib bo'lmaydi:
docker exec tez sh -c 'echo x' 2>&1 | grep -oE 'is not running'
is not running
Lekin fayllarini olish mumkin - docker cp to'xtagan
konteynerda ham ishlaydi:
docker cp tez:/etc/alpine-release - | tar -tf - | head -1
alpine-release
--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 dedidocker cp- fayllarini olingdocker inspect- qanday sozlangan edidocker 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 #
docker exec tirik sh -c 'echo yangi > /yangi-fayl'
docker diff tirik | head -3
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 #
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'
Obraz : alpine:3.21
Buyruq : [sleep 120]
Tarmoq : bridge
Ulanish : 0 ta
| Maydon | Nimani aytadi |
|---|---|
.State.ExitCode | Nima uchun tugadi |
.State.OOMKilled | Xotira yetmadimi (14-bob) |
.State.Health.Status | Salomatlik tekshiruvi |
.RestartCount | Necha marta qayta ko'tarildi |
.Config.Cmd / .Config.Entrypoint | Nima ishga tushdi |
.NetworkSettings.Networks | Qaysi tarmoqda |
.Mounts | Nima ulangan |
.HostConfig.LogConfig | Jurnal sozlamasi |
Tez-tez uchraydigan holatlar #
| Belgi | Ehtimoliy sabab |
|---|---|
Darhol exited (0) | Buyruq uzoq ishlamaydi - CMD ni tekshiring |
Takror restarting | Ilova yiqilyapti - jurnal + OOMKilled |
exited (137), OOMKilled: true | Xotira chegarasi kichik |
exited (137), OOMKilled: false | docker stop SIGKILL yubordi (6-bob) |
unhealthy | healthcheck buyrug'i noto'g'ri yoki ilova sekin |
| Nom yechilmaydi | Standart bridge yoki boshqa tarmoq (9-bob) |
| Hostdan port ochilmaydi | -p berilmagan (9-bob) |
| Fayl yo'qolgan | Bind mount obraz mazmunini yopgan (8-bob) |
docker logs bo'sh | Ilova faylga yozyapti (13-bob) |
| Disk to'ldi | Jurnal aylanishi yo'q (13-bob) |
| Sir sizib chiqdi | --build-arg ishlatilgan (10-bob) |
"Kodni o'zgartirdim, lekin hech narsa o'zgarmadi" degan holat.
Sabablari:
- Obraz qayta qurilmagan (
docker compose upobrazni o'zi qayta qurmaydi ---buildkerak) latesttegi eski obrazga ishora qilyapti- Registry dan eski digest tortilgan
Tekshirish:
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 skriptdaCRLFqator oxiri bor.permission denied-COPYfayl huquqini hostdan oladi;COPY --chmod=755yokiRUN chmod +xkerak.port is already allocated-docker psbilan kim band qilganini toping.- To'xtagan konteynerga
docker execishlamaydi, lekindocker cpvadocker logsishlaydi. - Nosozlik qidirayotganda
--rmni olib tashlang - aks holda dalil yo'qoladi. docker commityiqilgan holatni obrazga aylantiradi.docker diffilova qayerga yozayotganini ko'rsatadi.- "Hech narsa o'zgarmadi" - odatda obraz qayta qurilmagan:
docker compose upobrazni o'zi qurmaydi,--buildkerak.
- Nol bo'lmagan kod bilan chiqadigan konteyner yarating va kodini toping.
- Mavjud bo'lmagan buyruq bilan ishga tushirib, xabarni o'qing.
- Bajarish huquqisiz skriptni ko'chirib, xatoni ko'ring va ikki xil usulda tuzating.
- Bir portni ikki marta band qilib, xabarni o'qing.
- Boshqa tarmoqdagi konteynerga nom bo'yicha murojaat qiling.
- To'xtagan konteynerga
execqilishga urinib ko'ring. - O'sha konteynerdan
docker cpbilan fayl oling. docker diffbilan ilova qayerga yozayotganini aniqlang.docker commitbilan yiqilgan holatdan obraz yasang.- O'z loyihangizda uchragan xatoni jadvaldagi sabablar bilan solishtiring.
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.