Image va konteyner — farqi, hayot sikli
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:
curlbirinchi 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),latestemas. 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 commitemas, Dockerfile;latestemas, aniq teg
Keyingi dars
5-dars: Docker Hub — tayyor image lar, teglar, rasmiy image lar