IlmHamroh
Python kursi/Infratuzilma1/14-dars19 daqiqa
Mundarija (22)

28.1-dars: Docker — tushuncha

28-QISM — INFRATUZILMA · 1-dars


1. Kirish va motivatsiya

"Mening kompyuterimda ishlaydi!" — dasturchilarning eng mashhur (va eng zararli) jumlasi. Dastur sizning mashinangizda ishlaydi, lekin serverda ishlamaydi: Python versiyasi boshqacha, kutubxona yo'q, muhit o'zgaruvchisi sozlanmagan, operatsion tizim farqli. Har muhitda qo'lda sozlash — zerikarli va xatolarga to'la. Docker bu muammoni hal qiladi: dastur va uning barcha bog'liqliklarini (Python, kutubxonalar, sozlamalar) bitta konteyner ga joylaydi — bu konteyner har joyda bir xil ishlaydi (sizning mashinangizda, serverda, hamkasbingizda). "Bir marta qur, hamma joyda ishlat".

Docker — dasturlarni konteynerlash (containerization) platformasi: image (obraz — dastur va bog'liqliklarning o'zgarmas shabloni), container (konteyner — imagedan ishga tushgan nusxa), Dockerfile (imageni qurish retsepti), registry (obrazlar ombori — Docker Hub). Konteyner — yengil izolyatsiya: dastur o'z muhitida (kutubxonalar, fayllar) ishlaydi, lekin host operatsion tizim yadrosini ulashadi (virtual mashinadan yengilroq). Bu izchillik (har joyda bir xil), izolyatsiya (dasturlar aralashmaydi) va portativlik (ko'chirish oson) beradi. Docker — infratuzilmaning zamonaviy asosi. Konteyner — dasturni qadoqlash.

Real vaziyat. Bir jamoada yangi dasturchi loyihani ishga tushirish uchun bir kun sarfladi: Python o'rnatish, kutubxonalar, PostgreSQL, Redis, muhit sozlash — har biri o'z versiyasi bilan. Docker qo'llanildi: docker compose up — bitta buyruq, hamma narsa (dastur, baza, kesh) tayyor konteynerlarda ishga tushdi. Yangi dasturchi 5 daqiqada boshladi. Serverda ham aynan shu konteynerlar (izchil). "Mening mashinamda ishlaydi" muammosi yo'qoldi. Docker — muhitni bir xillashtirdi.

Bu darsda Docker tushunchasini o'rganamiz.

Bu darsda:

  • Docker nima va muammosi
  • Image va container
  • Konteyner vs virtual mashina
  • Docker asosiy tushunchalari
  • Docker ish oqimi (build, run, push)
  • Konteyner hayotiy sikli
  • Docker qayerda foydali
  • Amaliy: konteyner modeli

ℹ Docker operatsion tizim vositasi; misollar Python bilan Docker tushunchalarini modellashtiradi (deterministik).


2. Nazariya — chuqur tushuntirish

2.1. Docker nima va muammosi

Dasturni bog'liqliklari bilan qadoqlash:

Muammo: "mening mashinamda ishlaydi"
   (Python versiyasi, kutubxona, muhit farqli)
Docker: dastur + barcha bog'liqliklar → konteyner
   har joyda bir xil ishlaydi

Docker — dasturni va uning barcha bog'liqliklarini (Python, kutubxonalar, sozlamalar, muhit) bitta konteyner ga qadoqlaydigan platforma: bu konteyner har joyda (mashinangiz, server, hamkasb) bir xil ishlaydi. Muammo: dastur turli muhitlarda turlicha ishlaydi ("mening mashinamda ishlaydi" — versiya, kutubxona farqi); Docker muhitni konteyner ichiga "muhrlaydi" (izchil). Foyda: izchillik (bir xil), izolyatsiya (aralashmaydi), portativlik (ko'chirish oson). Docker — "bir marta qur, hamma joyda ishlat". Konteyner — muhitni qadoqlash.

2.2. Image va container

Shablon va nusxa:

IMAGE (obraz) — o'zgarmas shablon (dastur + bog'liqliklar)
   masalan: python:3.14 + kodingiz + kutubxonalar
CONTAINER (konteyner) — imagedan ishga tushgan nusxa
   bir image → ko'p container (ishlaydigan)

Image va container — Dockerning ikki asosiy tushunchasi: Image (obraz) — dastur va bog'liqliklarning o'zgarmas shabloni (retseptdan qurilgan — masalan python:3.14 + kodingiz + kutubxonalar); Container (konteyner) — imagedan ishga tushgan nusxa (jonli jarayon). Analogiya: image — sinf (16-qism, shablon), container — obyekt (nusxa); bir image → ko'p container. Image o'zgarmas (immutable — qatlamlardan), container o'zgaruvchan (ishlayotgan holat). Image saqlanadi/ulashiladi, container ishlaydi/to'xtaydi. Image — shablon, container — ishlaydigan nusxa.

2.3. Konteyner vs virtual mashina

Yengil izolyatsiya:

Virtual mashina (VM): har biri to'liq OS (og'ir, sekin)
   [App][Guest OS] [App][Guest OS] → Hypervisor → Host OS

Konteyner: host OS yadrosini ulashadi (yengil, tez)
   [App][App][App] → Docker → Host OS (bir yadro)

Konteyner vs VM: Virtual mashina — har biri to'liq operatsion tizim (guest OS) ni yuklaydi (og'ir — GB, sekin ishga tushish — daqiqalar, ko'p resurs); Konteyner — host OS yadrosini ulashadi (yengil — MB, tez ishga tushish — soniyalar, kam resurs), faqat dastur va bog'liqliklar. Farq: VM apparatni virtuallashtiradi (to'liq izolyatsiya, og'ir), konteyner OSni virtuallashtiradi (jarayon izolyatsiyasi, yengil). Konteyner — bir mashinada ko'p (yuzlab) ishlaydi (VM — o'nlab). Ehtiyot: konteyner izolyatsiyasi VM dan zaifroq (yadro ulashiladi). Konteyner — yengil, tez izolyatsiya.

2.4. Docker asosiy tushunchalari

Tushuncha Ma'nosi
Image O'zgarmas shablon (dastur+bog'liqlik)
Container Imagedan ishlaydigan nusxa
Dockerfile Imageni qurish retsepti
Registry Obrazlar ombori (Docker Hub)
Volume Doimiy saqlash (konteyner tashqarisi)
Network Konteynerlar aloqasi

Asosiy tushunchalar: Dockerfile — imageni qurish retsepti (buyruqlar ketma-ketligi — 28.2); Registry — obrazlarni saqlash/ulashish ombori (Docker Hub — ommaviy, yoki xususiy); Volume — konteyner tashqarisida doimiy saqlash (konteyner o'chsa ma'lumot qoladi — baza uchun); Network — konteynerlar orasidagi aloqa (bir tarmoqda gaplashadi); Tag — image versiyasi (python:3.14, myapp:v1.2). Bu tushunchalar Docker ekotizimini tashkil qiladi. Har biri bir vazifa (qurish, saqlash, ulashish, aloqa). Tushunchalar — Docker tili.

2.5. Docker ish oqimi (build, run, push)

bash
# 1. BUILD — Dockerfile'dan image qurish
docker build -t myapp:v1 .

# 2. RUN — imagedan container ishga tushirish
docker run -p 8000:8000 myapp:v1

# 3. PUSH — imageni registryga yuborish
docker push myapp:v1

# boshqa: docker ps (ishlayotganlar), docker stop, docker logs

Docker ish oqimi: build (docker build) — Dockerfile'dan image qurish (retseptni bajarish); run (docker run) — imagedan container ishga tushirish (port, volume, muhit bilan); push/pull — imageni registryga yuborish/olish (ulashish, deploy). Boshqa buyruqlar: docker ps (ishlayotgan containerlar), docker stop/start, docker logs (chiqish), docker exec (ichiga kirish). Oqim: kod yoz → Dockerfile → build (image) → run (container) → push (ulash) → boshqa joyda pull+run. Ish oqimi — kodni konteynerga aylantirish va tarqatish. Build-run-push — asosiy sikl.

2.6. Konteyner hayotiy sikli

CREATED → RUNNING → PAUSED/STOPPED → REMOVED
docker run: created → running
docker stop: running → stopped
docker start: stopped → running
docker rm: removed (o'chirildi)

Konteyner hayotiy sikli: created (yaratildi, hali ishlamayapti), running (ishlayapti — asosiy jarayon faol), paused (vaqtincha to'xtatilgan), stopped/exited (to'xtadi — jarayon tugadi yoki to'xtatildi), removed (o'chirildi). O'tishlar: docker run (created→running), docker stop (running→stopped), docker start (stopped→running), docker rm (removed). Muhim: container to'xtaganda ichki o'zgarishlar (fayllar) yo'qoladi (agar volume'da bo'lmasa — 28.3) — konteyner "vaqtinchalik" (ephemeral). Hayotiy sikl — konteyner holatlari (yaratish → ishlash → o'chirish). Konteyner — o'tkinchi (volume — doimiy).

2.7. Docker qayerda foydali

Docker foydali: rivojlanish muhiti (bir buyruq — dastur, baza, kesh tayyor — "mening mashinamda" muammosiz); CI/CD (28.7-8 — izchil test/deploy muhiti); mikroservis (27.9 — har xizmat o'z konteyneri); deploy (serverga bir xil image — izchillik); izolyatsiya (turli loyiha turli konteyner — aralashmaydi). Kamroq foydali: juda oddiy skript (Docker ortiqcha), yuqori unumdorlik talab (bevosita apparat). Docker deyarli har zamonaviy loyihada (rivojlanish, deploy). Bu Kubernetes 28.5-bob, CI/CD 28.7-bob, cloud 28.13-bob uchun asos. Docker — infratuzilmaning umumiy tili. Konteyner — zamonaviy deploy birligi.

2.8. Docker — izchillik va portativlik

Docker asosiy qiymati — izchillik va portativlik: konteyner muhitni "muhrlaydi" (dastur + bog'liqliklar) — natijada har joyda (dev, test, prod, har mashina) aynan bir xil ishlaydi. Bu "mening mashinamda ishlaydi" muammosini yo'q qiladi (muhit farqi yo'q). Portativlik — konteyner har platformada ishlaydi (Docker o'rnatilgan). Bu qatlamli arxitektura 27.6-bob, mikroservis 27.9-bob ni amalda qo'llashni osonlashtiradi (har qism o'z konteyneri). Docker DevOps (rivojlanish + operatsiya) ning asosi. Konteyner — dasturni muhiti bilan qadoqlash (universal birlik). Izchillik — ishonchli deploy. Bir marta qur — hamma joyda ishlat.


3. Tez ma'lumotnoma

bash
# ASOSIY TUSHUNCHALAR:
# Image — o'zgarmas shablon (dastur + bog'liqlik)
# Container — imagedan ishlaydigan nusxa
# Dockerfile — image qurish retsepti
# Registry — obrazlar ombori (Docker Hub)
# Volume — doimiy saqlash · Network — konteyner aloqasi

# ISH OQIMI:
docker build -t myapp:v1 .        # image qurish
docker run -p 8000:8000 myapp:v1  # container ishga tushirish
docker push myapp:v1              # registryga yuborish
docker pull myapp:v1              # registrydan olish

# BOSHQARISH:
docker ps                         # ishlayotgan containerlar
docker ps -a                      # barcha (to'xtagan ham)
docker stop <id>                  # to'xtatish
docker logs <id>                  # chiqishni ko'rish
docker exec -it <id> bash         # ichiga kirish
docker images                     # obrazlar ro'yxati
docker rm <id> / docker rmi <img> # o'chirish

# HAYOTIY SIKL: created → running → stopped → removed

Docker xulosasi

Docker — dasturni bog'liqliklari bilan konteynerga qadoqlash
Image (shablon, o'zgarmas) → Container (ishlaydigan nusxa)
Konteyner — yengil (VM emas: host yadro ulashadi)
Build → Run → Push (ish oqimi) · Volume (doimiy saqlash)
Izchillik: har joyda bir xil ("mening mashinamda" muammosiz)

4. Batafsil misollar

Docker OS vositasi; misollar Python bilan tushunchalarni modellashtiradi (deterministik).

Misol 1 — Image va container modeli

python
"""Image (shablon) va Container (nusxa) modeli — bir image, ko'p container."""


class Image:
    """O'zgarmas shablon (dastur + bog'liqliklar)."""

    def __init__(self, nom: str, tag: str, bogliqliklar: list) -> None:
        self.nom = nom
        self.tag = tag
        self.bogliqliklar = tuple(bogliqliklar)   # o'zgarmas

    def __repr__(self) -> str:
        return f"{self.nom}:{self.tag}"


class Container:
    """Imagedan ishga tushgan nusxa."""

    _keyingi_id = 1

    def __init__(self, image: Image) -> None:
        self.id = Container._keyingi_id
        Container._keyingi_id += 1
        self.image = image
        self.holat = "created"

    def ishga_tushir(self) -> None:
        self.holat = "running"

    def toxtat(self) -> None:
        self.holat = "stopped"


def main() -> None:
    print("=== 1. Image yaratish (shablon) ===")
    image = Image("myapp", "v1", ["python:3.14", "fastapi", "uvicorn"])
    print(f"  image: {image}")
    print(f"  bog'liqliklar: {list(image.bogliqliklar)}")

    print("\n=== 2. Bir imagedan ko'p container ===")
    c1 = Container(image)
    c2 = Container(image)
    c3 = Container(image)
    print(f"  container id'lar: {c1.id}, {c2.id}, {c3.id}")
    print(f"  hammasi bir image: {c1.image} = {c2.image} = {c3.image}")

    print("\n=== 3. Containerlarni ishga tushirish ===")
    c1.ishga_tushir()
    c2.ishga_tushir()
    print(f"  c1 holat: {c1.holat}, c2 holat: {c2.holat}, c3 holat: {c3.holat}")

    print("\n=== 4. Image o'zgarmas, container o'zgaruvchan ===")
    c1.toxtat()
    print(f"  c1 to'xtadi: {c1.holat}, c2 ishlayapti: {c2.holat}")
    print("  image — shablon (sinf), container — nusxa (obyekt)")
    print("  ⭐ Bir image → ko'p container")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Image yaratish (shablon) ===
  image: myapp:v1
  bog'liqliklar: ['python:3.14', 'fastapi', 'uvicorn']

=== 2. Bir imagedan ko'p container ===
  container id'lar: 1, 2, 3
  hammasi bir image: myapp:v1 = myapp:v1 = myapp:v1

=== 3. Containerlarni ishga tushirish ===
  c1 holat: running, c2 holat: running, c3 holat: created

=== 4. Image o'zgarmas, container o'zgaruvchan ===
  c1 to'xtadi: stopped, c2 ishlayapti: running
  image — shablon (sinf), container — nusxa (obyekt)
  ⭐ Bir image → ko'p container

Nima ko'rsatdi: 2.2-bo'lim.

Misol 2 — Konteyner hayotiy sikli

python
"""Konteyner hayotiy sikli: created → running → stopped → removed."""


class Konteyner:
    OTISHLAR = {
        "created": ["running"],
        "running": ["stopped", "paused"],
        "paused": ["running", "stopped"],
        "stopped": ["running", "removed"],
        "removed": [],
    }

    def __init__(self) -> None:
        self.holat = "created"
        self.tarix = ["created"]

    def otish(self, yangi_holat: str) -> str:
        if yangi_holat not in self.OTISHLAR[self.holat]:
            return f"Xato: {self.holat} → {yangi_holat} mumkin emas"
        self.holat = yangi_holat
        self.tarix.append(yangi_holat)
        return f"{self.tarix[-2]} → {yangi_holat}"


def main() -> None:
    k = Konteyner()

    print("=== 1. Boshlang'ich holat ===")
    print(f"  holat: {k.holat}")

    print("\n=== 2. Ishga tushirish (docker run) ===")
    print(f"  {k.otish('running')}")

    print("\n=== 3. To'xtatish va qayta ishga tushirish ===")
    print(f"  {k.otish('stopped')}")
    print(f"  {k.otish('running')}")

    print("\n=== 4. Noto'g'ri o'tish ===")
    print(f"  {k.otish('removed')}  (running'dan to'g'ridan removed emas)")
    k.otish("stopped")
    print(f"  {k.otish('removed')}  (stopped'dan removed mumkin)")
    print(f"  tarix: {k.tarix}")
    print("  ⭐ Konteyner — holatlar bo'ylab (hayotiy sikl)")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Boshlang'ich holat ===
  holat: created

=== 2. Ishga tushirish (docker run) ===
  created → running

=== 3. To'xtatish va qayta ishga tushirish ===
  running → stopped
  stopped → running

=== 4. Noto'g'ri o'tish ===
  Xato: running → removed mumkin emas  (running'dan to'g'ridan removed emas)
  stopped → removed  (stopped'dan removed mumkin)
  tarix: ['created', 'running', 'stopped', 'running', 'stopped', 'removed']
  ⭐ Konteyner — holatlar bo'ylab (hayotiy sikl)

Nima ko'rsatdi: 2.6-bo'lim.

Misol 3 — Konteyner vs VM resurs modeli

python
"""Konteyner vs VM: resurs iste'moli modeli (konteyner yengilroq)."""


def vm_resurs(dasturlar_soni: int) -> dict:
    # har VM to'liq OS yuklaydi
    os_hajmi_gb = 2.0        # har VM uchun guest OS
    dastur_hajmi_gb = 0.5
    return {
        "jami_gb": dasturlar_soni * (os_hajmi_gb + dastur_hajmi_gb),
        "ishga_tushish_sek": dasturlar_soni * 30,   # sekin
    }


def konteyner_resurs(dasturlar_soni: int) -> dict:
    # host OS ulashiladi (bir marta)
    host_os_gb = 2.0        # bir marta (ulashiladi)
    dastur_hajmi_gb = 0.5
    return {
        "jami_gb": host_os_gb + dasturlar_soni * dastur_hajmi_gb,
        "ishga_tushish_sek": dasturlar_soni * 2,    # tez
    }


def main() -> None:
    n = 5

    print(f"=== 1. {n} ta dastur — VM bilan ===")
    vm = vm_resurs(n)
    print(f"  disk: {vm['jami_gb']} GB")
    print(f"  ishga tushish: {vm['ishga_tushish_sek']} sek")

    print(f"\n=== 2. {n} ta dastur — konteyner bilan ===")
    kont = konteyner_resurs(n)
    print(f"  disk: {kont['jami_gb']} GB")
    print(f"  ishga tushish: {kont['ishga_tushish_sek']} sek")

    print("\n=== 3. Taqqoslash ===")
    print(f"  disk tejaladi: {vm['jami_gb'] - kont['jami_gb']} GB")
    print(f"  tezroq: {vm['ishga_tushish_sek'] // kont['ishga_tushish_sek']}x")

    print("\n=== 4. Sabab ===")
    print("  VM: har biri to'liq OS (og'ir)")
    print("  Konteyner: host yadro ulashadi (yengil)")
    print("  ⭐ Konteyner — yengil, tez (VM emas)")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. 5 ta dastur — VM bilan ===
  disk: 12.5 GB
  ishga tushish: 150 sek

=== 2. 5 ta dastur — konteyner bilan ===
  disk: 4.5 GB
  ishga tushish: 10 sek

=== 3. Taqqoslash ===
  disk tejaladi: 8.0 GB
  tezroq: 15x

=== 4. Sabab ===
  VM: har biri to'liq OS (og'ir)
  Konteyner: host yadro ulashadi (yengil)
  ⭐ Konteyner — yengil, tez (VM emas)

Nima ko'rsatdi: 2.3-bo'lim.

Misol 4 — Docker ish oqimi (build, run, push simulyatsiya)

python
"""Docker ish oqimi: build → run → push (buyruqlar ketma-ketligi modeli)."""


class DockerMuhit:
    def __init__(self) -> None:
        self.obrazlar: dict = {}       # nom:tag → bog'liqliklar
        self.containerlar: list = []
        self.registry: dict = {}

    def build(self, nom_tag: str, bogliqliklar: list) -> str:
        self.obrazlar[nom_tag] = bogliqliklar
        return f"Image qurildi: {nom_tag} ({len(bogliqliklar)} qatlam)"

    def run(self, nom_tag: str, port: int) -> str:
        if nom_tag not in self.obrazlar:
            return f"Xato: {nom_tag} image topilmadi"
        container = {"image": nom_tag, "port": port, "holat": "running"}
        self.containerlar.append(container)
        return f"Container ishga tushdi: {nom_tag} (port {port})"

    def push(self, nom_tag: str) -> str:
        if nom_tag not in self.obrazlar:
            return f"Xato: {nom_tag} topilmadi"
        self.registry[nom_tag] = self.obrazlar[nom_tag]
        return f"Registryga yuborildi: {nom_tag}"


def main() -> None:
    docker = DockerMuhit()

    print("=== 1. BUILD (Dockerfile'dan image) ===")
    print(f"  {docker.build('myapp:v1', ['python:3.14', 'fastapi', 'kod'])}")

    print("\n=== 2. RUN (imagedan container) ===")
    print(f"  {docker.run('myapp:v1', 8000)}")
    print(f"  {docker.run('myapp:v1', 8001)}")
    print(f"  ishlayotgan containerlar: {len(docker.containerlar)}")

    print("\n=== 3. PUSH (registryga) ===")
    print(f"  {docker.push('myapp:v1')}")
    print(f"  registryda: {list(docker.registry)}")

    print("\n=== 4. Yo'q imageni run ===")
    print(f"  {docker.run('boshqa:v9', 9000)}")
    print("  oqim: build → run → push (kod → konteyner → tarqatish)")
    print("  ⭐ Docker ish oqimi — build, run, push")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. BUILD (Dockerfile'dan image) ===
  Image qurildi: myapp:v1 (3 qatlam)

=== 2. RUN (imagedan container) ===
  Container ishga tushdi: myapp:v1 (port 8000)
  Container ishga tushdi: myapp:v1 (port 8001)
  ishlayotgan containerlar: 2

=== 3. PUSH (registryga) ===
  Registryga yuborildi: myapp:v1
  registryda: ['myapp:v1']

=== 4. Yo'q imageni run ===
  Xato: boshqa:v9 image topilmadi
  oqim: build → run → push (kod → konteyner → tarqatish)
  ⭐ Docker ish oqimi — build, run, push

Nima ko'rsatdi: 2.5-bo'lim.


5. To'g'ri va noto'g'ri tushunishlar

Noto'g'ri fikr To'g'risi
"Konteyner = virtual mashina" Yengil (host yadro ulashadi)
"Image = container" Image shablon, container nusxa
"Container o'zgarishlari saqlanadi" O'tkinchi (volume — doimiy)
"Docker faqat Linux'da" Har platformada (Docker Desktop)
"Bir image = bir container" Bir image → ko'p container
"Docker = deploy" Rivojlanish ham (dev muhit)
"Konteyner to'liq izolyatsiya" Yadro ulashiladi (VM'dan zaifroq)
"Docker murakkab" Izchillik beradi (soddalashtiradi)

6. Keng tarqalgan xatolar va yechimlari

1. Ma'lumotni container ichida saqlash

bash
# baza container ichida (o'chsa yo'qoladi)      # ⚠️
docker run -v data:/var/lib/postgresql ...      # ✅ volume

2. Har o'zgarishga yangi image nomi

bash
docker build -t myapp:latest .   # doim latest   # ⚠️
docker build -t myapp:v1.2 .     # versiya (tag)  # ✅

3. Konteynerni VM kabi ishlatish

bash
# bir konteynerda dastur + baza + kesh          # ⚠️
# har xizmat alohida konteyner (bir vazifa)      # ✅

4. Sirlarni imagega yozish

dockerfile
ENV PAROL=secret123   # imageda qoladi           # ⚠️
# muhit o'zgaruvchisi run'da yoki secret          # ✅

5. Portni ochishni unutish

bash
docker run myapp   # port yo'q (kirib bo'lmaydi) # ⚠️
docker run -p 8000:8000 myapp                    # ✅

6. Katta image (keraksiz narsalar)

dockerfile
FROM ubuntu   # to'liq OS (og'ir)                # ⚠️
FROM python:3.14-slim   # yengil                  # ✅

7. latest tagga tayanish (deploy)

bash
docker pull myapp:latest   # qaysi versiya?      # ⚠️
docker pull myapp:v1.2.3    # aniq versiya        # ✅

7. Integratsiya — bu bilim qayerda kerak bo'ladi

  • 28.2-dars: Dockerfile — image qurish
  • 28.3-dars: Docker Compose — ko'p konteyner
  • 28.5-dars: Kubernetes — konteyner orkestratsiyasi
  • 27.9-dars (o'tilgan): Mikroservis — har xizmat konteyner
  • 28.7-dars: CI/CD — konteyner deploy

8. Eng yaxshi amaliyotlar

  1. Bir konteyner — bir vazifa (dastur/baza alohida).

  2. Ma'lumot — volume'da (container o'tkinchi).

  3. Aniq tag (versiya, latest emas — deploy).

  4. Yengil image (slim, alpine).

  5. Sirlar — imageda emas (muhit/secret).

  6. Port ochish (-p).

  7. .dockerignore (keraksiz fayllar).

  8. Izchillik — dev va prod bir xil image.


9. Amaliy topshiriq

Vazifa 1: Bashorat qiling

python
1.  # Docker qanday muammoni hal qiladi?
2.  # image nima?
3.  # container nima?
4.  # image vs container?
5.  # konteyner vs VM?
6.  # nega konteyner yengil?
7.  # Dockerfile nima?
8.  # registry nima?
9.  # volume nima?
10. # docker build nima?
11. # docker run nima?
12. # konteyner o'tkinchimi?
Javoblar
  1. "Mening mashinamda ishlaydi" (muhit farqi)
  2. O'zgarmas shablon (dastur+bog'liqlik)
  3. Imagedan ishlaydigan nusxa
  4. Image shablon (sinf), container nusxa (obyekt)
  5. Konteyner yengil (host yadro), VM og'ir (to'liq OS)
  6. Host OS yadrosini ulashadi
  7. Image qurish retsepti
  8. Obrazlar ombori (Docker Hub)
  9. Doimiy saqlash (container tashqarisi)
  10. Dockerfile'dan image qurish
  11. Imagedan container ishga tushirish
  12. Ha (volume — doimiy)

Vazifa 2: Xatolarni tuzating

bash
1.  # baza container ichida saqlash      # volume

2.  docker build -t myapp:latest         # versiya

3.  # bir konteynerda dastur+baza+kesh    # alohida

4.  ENV PAROL=secret                      # muhit/secret

5.  docker run myapp   # port yo'q        # -p
Javoblar
bash
1.  docker run -v data:/... (volume)

2.  docker build -t myapp:v1.2

3.  har xizmat alohida konteyner

4.  muhit o'zgaruvchisi (run) yoki secret

5.  docker run -p 8000:8000 myapp

Vazifa 3: Image va container

Modellang:

  1. Image
  2. Container
  3. Bir → ko'p
  4. Holat

Vazifa 4: Hayotiy sikl

Modellang:

  1. created
  2. running
  3. stopped
  4. removed

Vazifa 5: VM vs konteyner

Taqqoslang:

  1. VM (to'liq OS)
  2. Konteyner (yadro ulash)
  3. Resurs
  4. Tezlik

Vazifa 6: Ish oqimi

Modellang:

  1. build
  2. run
  3. push
  4. Registry

Vazifa 7: O'ylash

Docker "mening mashinamda ishlaydi" muammosini hal qiladi: muhitni (dastur + bog'liqliklar) konteynerga "muhrlaydi". Nima uchun bu muammo dasturchilikda shunchalik keng tarqalgan va zararli edi (Docker'dan oldin), va nega "muhitni kod bilan qadoqlash" (izchillik) shunchalik kuchli g'oya — bu faqat qulaylik emas, balki ishonchlilik masalasi?

Javob

Qisqa javob: "Mening mashinamda ishlaydi" muammosi keng tarqalgan va zararli edi, chunki: dastur muhitga bog'liq (Python versiyasi, kutubxona versiyalari, OS, muhit o'zgaruvchilari, o'rnatilgan tizim paketlari) — bu bog'liqliklar ko'rinmas (kodda emas, mashinaga o'rnatilgan) va har mashinada farqli (dasturchi mashinasi ≠ hamkasb ≠ server). Natija: dastur bir joyda ishlaydi, boshqada yiqiladi — sabab muhit farqi (kod bir xil!), lekin buni topish qiyin (ko'rinmas bog'liqlik). Bu zararli, chunki: vaqt isrofi (soatlab "nega ishlamaydi?" — muhit sozlash), "deploy qo'rquvi" (serverda ishlaydimi? — noaniqlik), takrorlanmaslik (bir marta sozlangan muhitni qayta yaratish qiyin — "qanday o'rnatgandim?"). "Muhitni kod bilan qadoqlash" kuchli, chunki bu ishonchlilik masalasi (nafaqat qulaylik): agar muhit kod bo'lsa (Dockerfile — retsept), u takrorlanadigan (har safar bir xil natija — determinizm), versiyalanadigan (git — o'zgarishlar kuzatiladi), ulashiladigan (jamoa bir xil), hujjatlangan (Dockerfile — muhit qanday qurilishini ko'rsatadi). "Ishlaydi" endi tasodif emas (mashinaga bog'liq), balki kafolat (konteyner har joyda bir xil). Bu determinizm (bir xil kirish → bir xil chiqish) tamoyilini muhitga kengaytiradi: kod deterministik bo'lishi mumkin, lekin muhit deterministik bo'lmasa — tizim deterministik emas. Docker muhitni deterministik qiladi (konteyner). Muhandislik saboqlari: ko'rinmas bog'liqlik — xatolar manbai (muhit — eng ko'rinmas); "ishlaydi" mashinaga bog'liq bo'lmasligi kerak (kafolat, tasodif emas); muhitni kod qilish — takrorlanuvchanlik (ishonchlilik); izchillik — deploy qo'rquvini yo'qotadi (har joyda bir xil).

1. Nega muammo keng tarqalgan edi

Dastur muhitga bog'liq (versiya, kutubxona, OS). Bu bog'liqliklar ko'rinmas (mashinaga o'rnatilgan) va har mashinada farqli.

2. Nega zararli

  • Vaqt isrofi (muhit sozlash — soatlab)
  • Deploy qo'rquvi (serverda ishlaydimi?)
  • Takrorlanmaslik (muhitni qayta yaratish qiyin)

3. Nega "muhitni kod qilish" kuchli

Muhit = kod (Dockerfile) Foyda
Takrorlanadigan Har safar bir xil
Versiyalanadigan Git (kuzatuv)
Ulashiladigan Jamoa bir xil
Hujjatlangan Qanday qurilishi aniq

4. Ishonchlilik masalasi

"Ishlaydi" — tasodif emas (mashinaga bog'liq), kafolat (konteyner bir xil). Determinizm muhitga kengaytiriladi.

5. Muhandislik saboqlari

  1. Ko'rinmas bog'liqlik — xatolar manbai
  2. "Ishlaydi" mashinaga bog'liq bo'lmasin
  3. Muhitni kod qilish — takrorlanuvchanlik
  4. Izchillik — deploy qo'rquvini yo'qotadi

6. Xulosa

  1. Muhit ko'rinmas, har mashinada farqli (muammo)
  2. Zararli: vaqt, qo'rquv, takrorlanmaslik
  3. Muhit = kod — takrorlanadigan (ishonchlilik)
  4. Docker muhitni deterministik qiladi

Nimani mustahkamlaydi: 2.1, 2.8-bo'limlar.


Xulosa

Bu darsda Docker tushunchasini o'rgandik.

Eng muhim uch fikr:

  1. Docker va image/container. Docker — dasturni va uning barcha bog'liqliklarini (Python, kutubxonalar, sozlamalar) bitta konteyner ga qadoqlaydigan platforma: har joyda bir xil ishlaydi ("mening mashinamda ishlaydi" muammosini yo'q qiladi — muhit farqi). Image (obraz) — dastur va bog'liqliklarning o'zgarmas shabloni (retseptdan qurilgan); Container (konteyner) — imagedan ishga tushgan nusxa. Analogiya: image — sinf (shablon), container — obyekt (nusxa); bir image → ko'p container. Image o'zgarmas, container ishlaydigan holat.

  2. Konteyner vs VM, tushunchalar. Konteyner vs VM: virtual mashina har biri to'liq OS (og'ir — GB, sekin — daqiqalar), konteyner host OS yadrosini ulashadi (yengil — MB, tez — soniyalar); konteyner — jarayon izolyatsiyasi (yengil), VM — apparat virtualizatsiyasi (og'ir). Asosiy tushunchalar: Dockerfile (image qurish retsepti), Registry (obrazlar ombori — Docker Hub), Volume (doimiy saqlash — container tashqarisida), Network (konteyner aloqasi), Tag (versiya). Hayotiy sikl: created → running → stopped → removed (container o'tkinchi — volume doimiy).

  3. Ish oqimi va izchillik. Docker ish oqimi: build (Dockerfile'dan image), run (imagedan container — port, volume bilan), push/pull (registry orqali ulashish/deploy); boshqarish: docker ps, stop, logs, exec. Docker foydali: rivojlanish muhiti (bir buyruq — hammasi tayyor), CI/CD, mikroservis, deploy, izolyatsiya. Asosiy qiymati — izchillik va portativlik: konteyner muhitni "muhrlaydi", har joyda aynan bir xil ishlaydi. Bu ishonchlilik masalasi (nafaqat qulaylik): muhitni kod qilish (Dockerfile) — takrorlanadigan, versiyalanadigan, ulashiladigan; "ishlaydi" tasodif emas (mashinaga bog'liq), kafolat (determinizmni muhitga kengaytiradi). Docker — Kubernetes 28.5-bob, CI/CD 28.7-bob, cloud 28.13-bob uchun asos.

Keyingi darsda Dockerfile yozish ni o'rganamiz: imageni qurish retseptini (FROM, COPY, RUN, CMD buyruqlari), qatlamlar tushunchasi va samarali Dockerfile yozish amaliyotini.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!