Image va konteyner — farqi, hayot sikli

~12 daq · Docker · Kirish

Muammodan boshlaylik

Ubuntu konteyneriga kirib, curl ni o'rnatdingiz. Chiqdingiz. Yangi konteyner ochdingiz — curl yo'q! Yoki teskari: MySQL konteynerida bazaga ma'lumot kiritdingiz, konteynerni o'chirib, qaytadan yaratdingiz — ma'lumot yo'qoldi.

Bu "xato" emas — bu image va konteyner qanday ishlashining natijasi. Uni tushunsangiz, Docker ning qolgan qismi oson.


Image — o'zgarmas shablon

Image — faqat o'qish uchun bo'lgan fayllar to'plami: operatsion tizim kutubxonalari, til (Node, Python), ilova kodi, sozlamalar. U hech qachon o'zgarmaydi.

docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    a72860cb95fd   2 weeks ago   192MB
ubuntu       24.04     b1d9df8ab815   3 weeks ago   78MB
node         22        5f4c7a3b2e1d   1 week ago    1.1GB

Image qatlamlardan (layers) iborat — har bir qatlam oldingisi ustidagi o'zgarishlar:

┌──────────────────────────┐
│ Ilova kodi               │  ← 2 MB
├──────────────────────────┤
│ npm paketlar             │  ← 80 MB
├──────────────────────────┤
│ Node.js 22               │  ← 150 MB
├──────────────────────────┤
│ Debian asosiy tizim      │  ← 80 MB
└──────────────────────────┘

Ikki image bir xil asosga ega bo'lsa (masalan, ikkalasi ham node:22) — umumiy qatlamlar diskda bir marta saqlanadi. Qatlamlar haqida batafsil — 14-dars.


Konteyner — image + yoziladigan qatlam

Konteyner yaratilganda Docker image ustiga yupqa yoziladigan qatlam qo'shadi:

┌──────────────────────────┐
│ Konteyner qatlami (R/W)  │  ← curl o'rnatish, loglar, vaqtinchalik fayllar
╞══════════════════════════╡
│ Image qatlamlari (R/O)   │  ← o'zgarmaydi
│ ...                      │
└──────────────────────────┘
  • Konteyner ichida qilingan har qanday o'zgarish — faqat uning o'z qatlamida
  • Image o'zgarmaydi — undan yaratilgan boshqa konteynerlar o'zgarishni ko'rmaydi
  • Konteyner o'chirilsa (docker rm) — uning qatlami ham yo'qoladi

Boshidagi muammolarning javobi:

  • curl birinchi konteyner qatlamida edi; yangi konteyner — yangi, toza qatlam
  • MySQL ma'lumoti konteyner qatlamida edi; konteyner o'chirildi — ma'lumot ham. Yechim — volume (19-dars)

Qoida: konteynerni vaqtinchalik narsa deb hisoblang. Muhim narsa ichida saqlanmasin. Konteynerni o'chirib, qayta yaratish — odatiy, xavfsiz amal bo'lishi kerak.


Konteyner hayot sikli

             docker create            docker start
   image ───────────────→ Created ─────────────→ Running
                                                  │  ↑
                                     docker stop  │  │ docker start
                                     (yoki jarayon│  │
                                      tugadi)     ↓  │
                                                 Exited
                                                  │
                                        docker rm │
                                                  ↓
                                               (yo'q)

docker run = docker create + docker start.

docker run -d --name test nginx     # Created → Running
docker stop test                    # Running → Exited (konteyner qatlami SAQLANADI)
docker start test                   # Exited → Running (o'sha konteyner, o'sha ma'lumot)
docker rm test                      # Exited → yo'q (qatlam yo'qoladi)

stop — o'chirish emas! To'xtatilgan konteyner o'zgarishlari bilan saqlanib turadi:

docker ps        # faqat ishlayotganlar
docker ps -a     # hammasi, to'xtatilganlar bilan

Konteyner qachon to'xtaydi

Konteyner — bitta asosiy jarayon ishlab turgan vaqtgacha yashaydi. Jarayon tugasa — konteyner ham to'xtaydi:

docker run ubuntu echo "salom"     # echo bajarildi → jarayon tugadi → konteyner Exited
docker run -d nginx                # nginx doim ishlaydi → konteyner Running
docker run -d ubuntu               # bash — terminal yo'q, darhol tugaydi → Exited

"Konteyner ishga tushib, darhol to'xtab qolyapti" — ko'pincha asosiy jarayon tugagan yoki xato bilan chiqib ketgan. docker logs ga qarang.


Konteynerdan image yasash (va nima uchun bunday qilmaslik kerak)

docker run -it --name tajriba ubuntu bash
# ichida: apt update && apt install -y curl && exit

docker commit tajriba mening-ubuntu-curl
docker run -it --rm mening-ubuntu-curl curl --version    # ✅ curl bor

docker commit — konteyner qatlamini yangi image ga aylantiradi. Ishlaydi, lekin:

  • Image ichida nima borligini hech kim bilmaydi — qanday yasalgani yozilmagan
  • Takrorlab bo'lmaydi: bir oydan keyin "bu image ga yana nima o'rnatgan edim?"
  • Keraksiz fayllar (apt keshi, tarix) ham kirib qoladi

To'g'ri yo'l — Dockerfile (12-dars): image qanday yasalishi kod sifatida yoziladi, Git da saqlanadi va istalgan vaqtda aynan takrorlanadi.


Image nomlari va teglar

nginx:1.27-alpine
│     │
│     └── TEG: versiya / variant
└──────── REPOZITORIY nomi
docker pull node:22           # Node 22 ning eng oxirgisi
docker pull node:22.11.0      # aniq versiya
docker pull node:22-alpine    # Alpine Linux asosida — kichikroq
docker pull node              # = node:latest

latest — "eng oxirgi" degani emas, shunchaki standart teg nomi. Bugun node:latest — 23, ertaga — 24, va ilovangiz kutilmaganda buziladi.

[!WARNING] Production va jamoaviy loyihalarda aniq teg ishlating (node:22.11-alpine), latest emas. Busiz "bir xil muhit" va'dasi buziladi — 1-darsdagi asosiy muammo qaytadi.


Nima uchun shunday?

Nima uchun image o'zgarmas qilib yaratilgan — konteyner ichidagi o'zgarishlar image ga saqlansa qulayroq emasmi?

O'zgarmaslik — Docker ning asosiy kuchi. Agar image o'zgaruvchan bo'lsa — "serverdagi image" va "mening image im" vaqt o'tishi bilan farqlanib ketardi va biz yana 1-darsdagi muammoga qaytardik. O'zgarmas image — kafolat: bugun sinab ko'rganingiz bilan ertaga serverda ishlaydigani bit-bitigacha bir xil. O'zgaruvchan narsalar (ma'lumotlar, loglar) esa image dan tashqariga — volume larga chiqariladi. "O'zgarmas infratuzilma" (immutable infrastructure) — zamonaviy DevOps ning asosiy tamoyili.


Xulosa

Eslab qoling:

  • Image — o'zgarmas, qatlamli shablon; umumiy qatlamlar bir marta saqlanadi
  • Konteyner — image + yupqa yoziladigan qatlam; o'chirilsa — qatlam yo'qoladi
  • Konteynerni vaqtinchalik deb hisoblang; ma'lumot — volume da
  • Hayot sikli: Created → Running → Exited → (rm)
  • stop — o'chirish emas; docker ps -a — to'xtatilganlar ham
  • Asosiy jarayon tugasa — konteyner to'xtaydi
  • docker commit emas, Dockerfile; latest emas, aniq teg

Keyingi dars

5-dars: Docker Hub — tayyor image lar, teglar, rasmiy image lar