Docker image va konteyner: qatlamlar, teglar va hayotiy sikl
Asoslar4 daqInnovialabs tahririyati
Qisqacha
Docker image — read-only qatlamlardan iborat o‘zgarmas shablon, konteyner esa shu image ning o‘z yozish qatlamiga ega ishga tushirilgan nusxasi; konteynerlar image dan mustaqil ravishda yaratiladi, ishga tushiriladi, to‘xtatiladi va o‘chiriladi.
Image va konteyner bir jumlada
Image — bu shablon: qadoqlangan fayl tizimi va metama’lumotlar (standart buyruq, muhit o‘zgaruvchilari, portlar). Konteyner — shu shablondan ishga tushirilgan, o‘z holatiga ega jarayon. Munosabat klass va obyektlarga o‘xshaydi: bitta image — ko‘plab konteynerlar.
- Yig‘ilgan image o‘zgarmaydi.
- Har bir konteyner image ustida yozish qatlami (writable layer) oladi, fayllardagi barcha o‘zgarishlar shu yerga tushadi.
- Konteynerni o‘chirish shu qatlamni o‘chiradi, image ni emas.
Qatlamlar: image nimadan iborat
Dockerfile dagi fayl tizimini o‘zgartiruvchi har bir buyruq (RUN, COPY, ADD) yangi read-only qatlam yaratadi. Qatlamlar bir-birining ustiga qo‘yiladi va image lar o‘rtasida qayta ishlatiladi.
FROM node:20-alpine # bazaviy image qatlamlari
WORKDIR /app
COPY package*.json ./ # qatlam: bog‘liqliklar manifesti
RUN npm ci # qatlam: node_modules
COPY . . # qatlam: ilova kodi
CMD ["node", "server.js"] # faqat metama’lumot, yangi qatlam yo‘q
Amalda nega bu muhim:
- Build keshi: faqat kod o‘zgargan bo‘lsa, Docker oxirgi
COPYqatlamini qayta yig‘adi. Shuning uchun bog‘liqlik fayllari koddan oldin nusxalanadi. - Joyni tejash: bitta bazadan
FROMqilingan o‘nta image uni bir marta saqlaydi. - O‘chirilgan fayllar ham joy egallaydi: keyingi qatlamda faylni o‘chirish uni faqat yashiradi, oldingi qatlamlarni kichraytirmaydi. Fayllar paydo bo‘lgan
RUNichida tozalang yoki multi-stage build dan foydalaning.
Image qatlamlarini ko‘rish:
docker history myapp:1.4
docker image inspect myapp:1.4 --format '{{json .RootFS.Layers}}'
Yozish qatlami
Konteyner ishga tushganda Docker image ning read-only qatlamlari ustiga yupqa writable qatlam qo‘shadi (copy-on-write). Konteyner o‘zgartirgan har bir fayl shu qatlamga nusxalanadi.
Bundan kelib chiqadi:
- Konteyner ichida yozilgan ma’lumotlar konteyner o‘chirilganda yo‘qoladi. Ma’lumotlar bazasi, yuklangan fayllar va saqlanishi kerak bo‘lgan hamma narsa uchun volume yoki bind mount ishlating.
- Bitta image dan yaratilgan ikki konteyner bir-birining o‘zgarishlarini ko‘rmaydi.
docker diff <container>image ga nisbatan nima o‘zgarganini ko‘rsatadi.
Teglar va digest
Teg — inson uchun qulay va o‘zgaruvchan nom: nginx:1.27, myapp:latest. Ertaga xuddi shu teg boshqa image ga ishora qilishi mumkin.
Digest — image mazmunining xeshi: nginx@sha256:.... U o‘zgarmas: bir xil digest har doim aynan bir xil baytlarni bildiradi.
| Teg | Digest | |
|---|---|---|
| Misol | myapp:1.4 | myapp@sha256:3f1a... |
| O‘zgarishi mumkinmi | Ha, qayta push qilish mumkin | Yo‘q |
| Nima uchun | Odamlar uchun, reliz nomlari | Takrorlanadigan deploy, audit |
Amaliy qoidalar:
- Prodakshnda
latestdan foydalanmang — aslida nima ishlayotgani noma’lum bo‘ladi. - Image larni CI dan versiya yoki commit SHA bilan teglang.
- Takrorlanuvchanlik muhim bo‘lsa, digest ni mahkamlang, masalan muhim servislar uchun Kubernetes manifestlarida.
docker images --digests
docker inspect --format '{{index .RepoDigests 0}}' myapp:1.4
Konteynerning hayotiy sikli
Konteyner aniq holatlardan o‘tadi: created → running → (paused) → exited → removed.
docker create --name web myapp:1.4 # yaratildi, ishlamayapti
docker start web # ishlayapti
docker stop web # SIGTERM, keyin taymaut bo‘yicha SIGKILL: exited
docker start web # yana ishlayapti, o‘sha writable qatlam
docker rm web # o‘chirildi, writable qatlam yo‘qoldi
docker run — bu bitta buyruqda create + start. --rm bayrog‘i konteyner tugagach uni avtomatik o‘chiradi.
Har bir bosqichni tekshirish:
docker ps # ishlayotgan konteynerlar
docker ps -a # barchasi, to‘xtatilganlari bilan
docker inspect web # holat, mount lar, tarmoq, chiqish kodi
docker logs web # asosiy jarayonning stdout/stderr
docker image ls # lokal image lar
Ko‘p uchraydigan xatolar
- Konteynerga server kabi qarash: ishlayotgan konteyner ichiga paket o‘rnatish. Qayta yaratilganda o‘zgarishlar yo‘qoladi. Dockerfile ni o‘zgartirib, qayta yig‘ing.
- Ma’lumotlarni volume siz saqlash va
docker rmyoki yangi deploy dan keyin ularni yo‘qotish. latestga tayanish va boshqa mashinada boshqa image olish.- To‘xtatilgan konteynerlar va «osilib qolgan» image larni yig‘ib qo‘yish. Nima o‘chirilishini oldindan tekshirib,
docker container prunevadocker image prunebilan muntazam tozalang.