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

28.2-dars: Dockerfile yozish

28-QISM — INFRATUZILMA · 2-dars


1. Kirish va motivatsiya

Image — dastur va bog'liqliklarning o'zgarmas shabloni 28.1-bob, lekin u qayerdan keladi? Uni qurish kerak — va qurish retseptini yozish kerak. Dockerfile — imageni qurish uchun buyruqlar ketma-ketligi: "python asosini ol, kodni nusxala, kutubxonalarni o'rnat, dasturni ishga tushir". Yaxshi Dockerfile — tez, yengil, ishonchli image; yomon Dockerfile — sekin build, ulkan image, xavfsizlik teshiklari. Dockerfile yozishni bilish — konteynerlashning asosiy ko'nikmasi.

Dockerfile — imageni qurish retsepti (matn fayl, buyruqlar ketma-ketligi): FROM (asosiy image — nimadan boshlash), WORKDIR (ishchi papka), COPY (fayllarni nusxalash), RUN (buyruq bajarish — o'rnatish), ENV (muhit o'zgaruvchisi), EXPOSE (port), CMD/ENTRYPOINT (ishga tushirish buyrug'i). Har buyruq bir qatlam (layer) yaratadi — Docker qatlamlarni keshlaydi (o'zgarmagan qatlam qayta qurilmaydi — tezlik). Yaxshi Dockerfile: yengil asos, samarali qatlam tartibi, keraksiz narsalarsiz, sirlarsiz. Dockerfile — imageni qurish kodi. Retsept — takrorlanadigan image.

Real vaziyat. Bir loyihada Dockerfile har build'da 5 daqiqa olardi (har o'zgarishda barcha kutubxonalar qayta o'rnatilardi) va image 1.5 GB edi (to'liq OS). Dockerfile qayta yozildi: yengil asos (python:3.14-slim), qatlam tartibi optimallashtirildi (avval kutubxonalar — kamdan o'zgaradi, keyin kod — tez-tez o'zgaradi — kesh ishlaydi), .dockerignore qo'shildi. Build 20 soniyaga tushdi (kesh), image 200 MB bo'ldi. Dockerfile — build tezligi va image hajmi.

Bu darsda Dockerfile yozishni o'rganamiz.

Bu darsda:

  • Dockerfile nima
  • Asosiy buyruqlar (FROM, COPY, RUN, CMD)
  • Qatlamlar va kesh
  • Qatlam tartibi (optimizatsiya)
  • CMD va ENTRYPOINT
  • .dockerignore
  • Yaxshi Dockerfile amaliyoti
  • Amaliy: Dockerfile modeli

ℹ Dockerfile OS vositasi; misollar Python bilan qurilish/kesh mantiqini modellashtiradi (deterministik).


2. Nazariya — chuqur tushuntirish

2.1. Dockerfile nima

Imageni qurish retsepti:

dockerfile
FROM python:3.14-slim        # asosiy image
WORKDIR /app                 # ishchi papka
COPY requirements.txt .      # bog'liqliklar ro'yxati
RUN pip install -r requirements.txt   # o'rnatish
COPY . .                     # kod
CMD ["python", "app.py"]     # ishga tushirish

Dockerfile — imageni qurish retsepti (matn fayl): Docker uni yuqoridan pastga o'qib, har buyruqni bajaradi va image quradi. Har buyruq bir qadam (asos ol, kod nusxala, kutubxona o'rnat, ishga tushir). Sabab: image takrorlanadigan bo'lishi kerak (kod bilan tavsiflangan — Dockerfile git'da, jamoa bir xil quradi); qo'lda emas (retsept — avtomatik, izchil). Dockerfile — "muhit kodi" (28.1 — muhitni kod qilish). Har o'zgarish Dockerfile'da (versiyalangan). Dockerfile — image qurish kodi. Retsept — izchil qurish.

2.2. Asosiy buyruqlar (FROM, COPY, RUN, CMD)

Buyruq Vazifasi
FROM Asosiy image (nimadan boshlash)
WORKDIR Ishchi papka
COPY Fayllarni image ichiga nusxalash
RUN Build vaqtida buyruq (o'rnatish)
ENV Muhit o'zgaruvchisi
EXPOSE Port (hujjat)
CMD Konteyner ishga tushirish buyrug'i

Asosiy buyruqlar: FROM — asosiy image (nimadan qurish — python:3.14-slim, har Dockerfile FROM bilan boshlanadi); WORKDIR — ishchi papka (keyingi buyruqlar shu papkada); COPY — fayllarni host'dan image ichiga (COPY . . — kod); RUN — build vaqtida buyruq bajarish (RUN pip install — o'rnatish, qatlam yaratadi); ENV — muhit o'zgaruvchisi; EXPOSE — port hujjati; CMD — konteyner ishga tushganda buyruq (CMD ["python", "app.py"]). Farq: RUN — qurish vaqti (image), CMD — ishga tushirish vaqti (container). Buyruqlar — qurishning qadamlari. Har biri bir amal.

2.3. Qatlamlar va kesh

Har buyruq bir qatlam:

Har Dockerfile buyrug'i → bir QATLAM (layer)
FROM python:3.14   → qatlam 1
COPY requirements  → qatlam 2
RUN pip install    → qatlam 3
COPY . .           → qatlam 4
   Docker qatlamlarni KESHLAYDI
   o'zgarmagan qatlam → qayta qurilmaydi (tez)

Qatlamlar va kesh — har Dockerfile buyrug'i bir qatlam (layer) yaratadi (o'zgarishlar to'plami); Docker qatlamlarni keshlaydi: build'da o'zgarmagan qatlam qayta qurilmaydi (keshdan olinadi — tez). Muhim: agar bir qatlam o'zgarsa — u va undan keyingi barcha qatlamlar qayta quriladi (kesh buziladi). Shuning uchun qatlam tartibi muhim (28.2.4): kam o'zgaradiganlar avval (kesh saqlanadi), tez o'zgaradiganlar keyin. Kesh — build tezligini keskin oshiradi (o'zgarmagan qismlar qayta qurilmaydi). Qatlam — image qurilish bloki. Kesh — takrorlanmaydigan ishni tejash.

2.4. Qatlam tartibi (optimizatsiya)

Kam o'zgaradiganlar avval:

dockerfile
# YAXSHI: kutubxonalar (kam o'zgaradi) avval
COPY requirements.txt .
RUN pip install -r requirements.txt   # kesh saqlanadi
COPY . .                              # kod (tez-tez o'zgaradi)

# YOMON: kod avval → har o'zgarishda pip qayta ishlaydi
COPY . .
RUN pip install -r requirements.txt   # kesh buziladi

Qatlam tartibi optimizatsiyasi — kam o'zgaradigan qatlamlarni avval, tez o'zgaradiganlarni keyin joylash: kutubxonalar (requirements.txt — kamdan o'zgaradi) avval o'rnatiladi (kesh saqlanadi), kod (COPY . . — har o'zgarishda) keyin. Sabab: kod o'zgarganda faqat oxirgi qatlam qayta quriladi (kutubxonalar keshdan — tez); agar teskari bo'lsa (kod avval), har kod o'zgarishida kutubxonalar qayta o'rnatiladi (sekin). Bu Docker kesh mantiqini ishlatadi (o'zgargan qatlamdan keyingilari qayta quriladi). Tartib — build tezligi. To'g'ri tartib — tez build.

2.5. CMD va ENTRYPOINT

Konteyner ishga tushirish:

dockerfile
# CMD — standart buyruq (almashtiriladi)
CMD ["python", "app.py"]
# docker run myapp → python app.py
# docker run myapp bash → bash (CMD almashtirildi)

# ENTRYPOINT — asosiy buyruq (o'zgarmas)
ENTRYPOINT ["python", "app.py"]
# argumentlar qo'shiladi

CMD va ENTRYPOINT — konteyner ishga tushganda nima bajarish: CMD — standart buyruq (docker runda almashtiriladi — docker run myapp bash CMDni bekor qiladi); ENTRYPOINT — asosiy buyruq (o'zgarmas — argumentlar qo'shiladi, almashtirilmaydi). Ko'pincha birga: ENTRYPOINT (dastur) + CMD (standart argument). Farq: CMD moslashuvchan (almashtirish oson), ENTRYPOINT qat'iy (dastur doim ishlaydi). Muhim: exec shakli (["python", "app.py"] — ro'yxat, to'g'ridan) shell shakli (python app.py — shell orqali) dan afzal (signal boshqarish). CMD/ENTRYPOINT — konteyner ishga tushirish nuqtasi. Ishga tushirish buyrug'i.

2.6. .dockerignore

Keraksiz fayllarni chetlab o'tish:

# .dockerignore (COPY chetlab o'tadi)
.git
__pycache__
*.pyc
.env          # sirlar!
node_modules
venv

.dockerignore — COPY paytida chetlab o'tiladigan fayllar ro'yxati (.gitignore kabi): .git (tarix — keraksiz), __pycache__/*.pyc (kesh), .env (sirlar — imagega tushmasin!), venv/node_modules (qayta o'rnatiladi), katta fayllar. Sabab: keraksiz fayllar — katta image (sekin, ko'p joy), sirlar xavfi (.env imageda qolsa — sizib chiqadi), kesh buzilishi (o'zgaradigan fayllar). .dockerignore imageni yengil va xavfsiz qiladi. Bu .gitignore (git) ning Docker versiyasi. .dockerignore — imagega nima kirmasligini nazorat. Keraksizni chetlab o'tish.

2.7. Yaxshi Dockerfile amaliyoti

Yaxshi Dockerfile amaliyotlari: yengil asos (python:3.14-slim, alpine — kichik image); qatlam tartibi (kam o'zgaradiganlar avval — kesh); .dockerignore (keraksiz/sir fayllar); kam qatlam (RUN buyruqlarini birlashtirish — && bilan, kamroq qatlam); sirlarsiz (.env — imageda emas, run vaqtida); root emas (USER — xavfsizlik, root sifatida ishlatmaslik); multi-stage build (qurish va ishga tushirish alohida — build vositalar yakuniy imageda yo'q, kichikroq). Bu image hajmi, tezligi, xavfsizligini yaxshilaydi. Yaxshi Dockerfile — tez, yengil, xavfsiz image. Amaliyot — sifatli image.

2.8. Dockerfile — muhit kodi

Dockerfile — muhit kodi (infrastructure as code — 28.14 boshlanishi): muhit qanday qurilishi kod bilan tavsiflanadi (qo'lda emas). Bu takrorlanuvchanlik (har safar bir xil image), versiyalash (git — o'zgarishlar), hujjat (Dockerfile — muhit qanday qurilishini ko'rsatadi) beradi. Yaxshi Dockerfile — nafaqat ishlaydi, balki tez (kesh), yengil (kichik), xavfsiz (sirlarsiz, root emas). Bu Docker 28.1-bob, Compose 28.3-bob, CI/CD 28.7-bob uchun asos. Dockerfile — DevOps ning asosiy artefakti (muhitni kod bilan). Muhit kodi — takrorlanadigan, versiyalanadigan. Dockerfile — image qurish rejasi.


3. Tez ma'lumotnoma

dockerfile
# ODATIY PYTHON DOCKERFILE:
FROM python:3.14-slim         # yengil asos
WORKDIR /app                  # ishchi papka
COPY requirements.txt .       # bog'liqliklar (avval — kesh)
RUN pip install --no-cache-dir -r requirements.txt
COPY . .                      # kod (keyin — tez o'zgaradi)
EXPOSE 8000                   # port (hujjat)
USER appuser                  # root emas (xavfsizlik)
CMD ["python", "app.py"]      # ishga tushirish

# BUYRUQLAR:
# FROM — asosiy image | WORKDIR — papka
# COPY — fayl nusxala | RUN — build buyrug'i (o'rnatish)
# ENV — muhit o'zgaruvchisi | EXPOSE — port
# CMD — ishga tushirish (almashtiriladi)
# ENTRYPOINT — asosiy buyruq (o'zgarmas)

# QATLAM: har buyruq → qatlam (keshlanadi)
# TARTIB: kam o'zgaradiganlar avval (kesh)
# .dockerignore: .git, __pycache__, .env (sirlar)

Dockerfile xulosasi

Dockerfile — image qurish retsepti (FROM, COPY, RUN, CMD)
Har buyruq → qatlam (keshlanadi — o'zgarmagan qayta qurilmaydi)
Tartib: kam o'zgaradiganlar avval (kutubxona → kod)
CMD (almashtiriladi) · ENTRYPOINT (o'zgarmas)
.dockerignore (sir/keraksiz) · yengil asos · root emas

4. Batafsil misollar

Dockerfile OS vositasi; misollar Python bilan qurilish/kesh mantiqini modellashtiradi.

Misol 1 — Dockerfile qatlamlarga bo'lish

python
"""Dockerfile buyruqlarini tahlil qilish — har buyruq bir qatlam."""


def dockerfile_tahlil(satrlar: list) -> list:
    qatlamlar = []
    for satr in satrlar:
        satr = satr.strip()
        if not satr or satr.startswith("#"):
            continue   # bo'sh yoki izoh
        buyruq = satr.split()[0]
        qatlamlar.append({"buyruq": buyruq, "matn": satr})
    return qatlamlar


def main() -> None:
    dockerfile = [
        "FROM python:3.14-slim",
        "WORKDIR /app",
        "# bog'liqliklar",
        "COPY requirements.txt .",
        "RUN pip install -r requirements.txt",
        "COPY . .",
        "CMD [\"python\", \"app.py\"]",
    ]

    qatlamlar = dockerfile_tahlil(dockerfile)

    print("=== 1. Qatlamlar soni ===")
    print(f"  {len(qatlamlar)} qatlam (izohlar hisobga olinmaydi)")

    print("\n=== 2. Har qatlam (buyruq) ===")
    for i, q in enumerate(qatlamlar, 1):
        print(f"  {i}. {q['buyruq']}")

    print("\n=== 3. Buyruq turlari ===")
    buyruqlar = [q["buyruq"] for q in qatlamlar]
    print(f"  FROM: {buyruqlar.count('FROM')}, COPY: {buyruqlar.count('COPY')}")
    print(f"  RUN: {buyruqlar.count('RUN')}, CMD: {buyruqlar.count('CMD')}")

    print("\n=== 4. Birinchi buyruq FROM bo'lishi kerak ===")
    print(f"  birinchi: {qatlamlar[0]['buyruq']} (to'g'ri: FROM)")
    print("  ⭐ Har buyruq → bir qatlam")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Qatlamlar soni ===
  6 qatlam (izohlar hisobga olinmaydi)

=== 2. Har qatlam (buyruq) ===
  1. FROM
  2. WORKDIR
  3. COPY
  4. RUN
  5. COPY
  6. CMD

=== 3. Buyruq turlari ===
  FROM: 1, COPY: 2
  RUN: 1, CMD: 1

=== 4. Birinchi buyruq FROM bo'lishi kerak ===
  birinchi: FROM (to'g'ri: FROM)
  ⭐ Har buyruq → bir qatlam

Nima ko'rsatdi: 2.1, 2.2, 2.3-bo'limlar.

Misol 2 — Qatlam keshi (o'zgarish ta'siri)

python
"""Kesh mantiqi: o'zgargan qatlamdan keyingilar qayta quriladi."""


def build_simulyatsiya(qatlamlar: list, ozgargan_indeks: int) -> dict:
    natija = []
    kesh_buzildi = False
    for i, qatlam in enumerate(qatlamlar):
        if i == ozgargan_indeks:
            kesh_buzildi = True   # shu qatlamdan keyingilar qayta quriladi
        if kesh_buzildi:
            natija.append({"qatlam": qatlam, "holat": "QAYTA QURILDI"})
        else:
            natija.append({"qatlam": qatlam, "holat": "keshdan (tez)"})
    return {"qatlamlar": natija, "qayta_qurildi": sum(1 for n in natija if "QAYTA" in n["holat"])}


def main() -> None:
    qatlamlar = ["FROM", "COPY requirements", "RUN pip install", "COPY kod", "CMD"]

    print("=== 1. Faqat kod o'zgardi (4-qatlam) ===")
    r = build_simulyatsiya(qatlamlar, ozgargan_indeks=3)
    for n in r["qatlamlar"]:
        print(f"  {n['qatlam']}: {n['holat']}")

    print(f"\n=== 2. Qayta qurilgan qatlamlar ===")
    print(f"  {r['qayta_qurildi']} ta (faqat kod va keyingi)")
    print("  kutubxonalar keshdan (tez)")

    print("\n=== 3. requirements o'zgardi (2-qatlam) ===")
    r2 = build_simulyatsiya(qatlamlar, ozgargan_indeks=1)
    print(f"  qayta qurilgan: {r2['qayta_qurildi']} ta")
    print("  pip install ham qayta (kesh buzildi)")

    print("\n=== 4. Xulosa ===")
    print("  kod o'zgarishi: 2 qatlam qayta (tez)")
    print("  requirements o'zgarishi: 4 qatlam qayta (sekin)")
    print("  ⭐ O'zgargan qatlamdan keyingilar qayta quriladi")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Faqat kod o'zgardi (4-qatlam) ===
  FROM: keshdan (tez)
  COPY requirements: keshdan (tez)
  RUN pip install: keshdan (tez)
  COPY kod: QAYTA QURILDI
  CMD: QAYTA QURILDI

=== 2. Qayta qurilgan qatlamlar ===
  2 ta (faqat kod va keyingi)
  kutubxonalar keshdan (tez)

=== 3. requirements o'zgardi (2-qatlam) ===
  qayta qurilgan: 4 ta
  pip install ham qayta (kesh buzildi)

=== 4. Xulosa ===
  kod o'zgarishi: 2 qatlam qayta (tez)
  requirements o'zgarishi: 4 qatlam qayta (sekin)
  ⭐ O'zgargan qatlamdan keyingilar qayta quriladi

Nima ko'rsatdi: 2.3, 2.4-bo'limlar.

Misol 3 — Qatlam tartibi (optimizatsiya taqqoslash)

python
"""Tartib optimizatsiyasi: kod o'zgarishida qayta qurilish (yaxshi vs yomon)."""


def qayta_qurilish_soni(qatlamlar: list, kod_indeksi: int) -> int:
    # kod o'zgarganda: kod va keyingi qatlamlar qayta quriladi
    return len(qatlamlar) - kod_indeksi


def main() -> None:
    # YAXSHI tartib: kutubxona avval, kod keyin
    yaxshi = ["FROM", "COPY requirements", "RUN pip install", "COPY kod", "CMD"]
    # YOMON tartib: kod avval, kutubxona keyin
    yomon = ["FROM", "COPY kod", "COPY requirements", "RUN pip install", "CMD"]

    print("=== 1. YAXSHI tartib (kutubxona avval) ===")
    for i, q in enumerate(yaxshi):
        print(f"  {i}. {q}")

    print("\n=== 2. Kod o'zgarganda (yaxshi) ===")
    yaxshi_qayta = qayta_qurilish_soni(yaxshi, kod_indeksi=3)
    print(f"  qayta qurilgan: {yaxshi_qayta} qatlam (kod, CMD)")
    print("  pip install keshdan (tez)")

    print("\n=== 3. Kod o'zgarganda (yomon) ===")
    yomon_qayta = qayta_qurilish_soni(yomon, kod_indeksi=1)
    print(f"  qayta qurilgan: {yomon_qayta} qatlam")
    print("  pip install ham qayta (sekin)")

    print("\n=== 4. Taqqoslash ===")
    print(f"  yaxshi: {yaxshi_qayta} qatlam, yomon: {yomon_qayta} qatlam")
    print("  kam o'zgaradiganlar avval → kesh ishlaydi")
    print("  ⭐ To'g'ri tartib — tez build (kesh)")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. YAXSHI tartib (kutubxona avval) ===
  0. FROM
  1. COPY requirements
  2. RUN pip install
  3. COPY kod
  4. CMD

=== 2. Kod o'zgarganda (yaxshi) ===
  qayta qurilgan: 2 qatlam (kod, CMD)
  pip install keshdan (tez)

=== 3. Kod o'zgarganda (yomon) ===
  qayta qurilgan: 4 qatlam
  pip install ham qayta (sekin)

=== 4. Taqqoslash ===
  yaxshi: 2 qatlam, yomon: 4 qatlam
  kam o'zgaradiganlar avval → kesh ishlaydi
  ⭐ To'g'ri tartib — tez build (kesh)

Nima ko'rsatdi: 2.4-bo'lim.

Misol 4 — .dockerignore va image hajmi

python
"""dockerignore: keraksiz/sir fayllarni chetlab o'tish (image yengil, xavfsiz)."""


DOCKERIGNORE = {".git", "__pycache__", ".env", "venv", "node_modules"}


def copy_qilinadi(fayllar: list) -> dict:
    kiritilgan = []
    chetlab = []
    for fayl in fayllar:
        # dockerignore naqshiga mos keladimi
        if any(fayl == naqsh or fayl.startswith(naqsh + "/") for naqsh in DOCKERIGNORE):
            chetlab.append(fayl)
        else:
            kiritilgan.append(fayl)
    return {"kiritilgan": kiritilgan, "chetlab": chetlab}


def main() -> None:
    fayllar = ["app.py", "requirements.txt", ".git", ".env", "__pycache__", "utils.py", "venv"]

    natija = copy_qilinadi(fayllar)

    print("=== 1. Barcha fayllar ===")
    print(f"  {fayllar}")

    print("\n=== 2. Imagega kiritilgan ===")
    print(f"  {natija['kiritilgan']}")

    print("\n=== 3. Chetlab o'tilgan (.dockerignore) ===")
    print(f"  {natija['chetlab']}")

    print("\n=== 4. Nega muhim ===")
    print("  .env — sir (imagega tushmasligi kerak!)")
    print("  .git, venv — keraksiz (image yengil)")
    print(f"  {len(natija['chetlab'])} fayl chetlab o'tildi")
    print("  ⭐ .dockerignore — yengil va xavfsiz image")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Barcha fayllar ===
  ['app.py', 'requirements.txt', '.git', '.env', '__pycache__', 'utils.py', 'venv']

=== 2. Imagega kiritilgan ===
  ['app.py', 'requirements.txt', 'utils.py']

=== 3. Chetlab o'tilgan (.dockerignore) ===
  ['.git', '.env', '__pycache__', 'venv']

=== 4. Nega muhim ===
  .env — sir (imagega tushmasligi kerak!)
  .git, venv — keraksiz (image yengil)
  4 fayl chetlab o'tildi
  ⭐ .dockerignore — yengil va xavfsiz image

Nima ko'rsatdi: 2.6-bo'lim.


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

Noto'g'ri fikr To'g'risi
"Qatlam tartibi ahamiyatsiz" Kesh uchun muhim
"RUN = CMD" RUN build, CMD ishga tushirish
"COPY . . birinchi" Kutubxonalar avval (kesh)
"Har RUN alohida" Birlashtirish (kam qatlam)
"To'liq OS asos" Yengil (slim, alpine)
".env ni COPY qil" .dockerignore (sir)
"root normal" USER (xavfsizlik)
"CMD o'zgarmas" CMD almashtiriladi (ENTRYPOINT o'zgarmas)

6. Keng tarqalgan xatolar va yechimlari

1. COPY . . kutubxonadan avval

dockerfile
COPY . .                      # kesh buziladi        # ⚠️
RUN pip install ...
# yaxshi:
COPY requirements.txt .       # avval (kesh)          # ✅
RUN pip install ...
COPY . .

2. Og'ir asosiy image

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

3. .env ni imagega nusxalash

dockerfile
COPY .env .                   # sir imageda!          # ⚠️
# .dockerignore'ga .env + run vaqtida muhit           # ✅

4. Ko'p alohida RUN (ko'p qatlam)

dockerfile
RUN apt update
RUN apt install -y curl       # 2 qatlam              # ⚠️
RUN apt update && apt install -y curl   # 1 qatlam     # ✅

5. root sifatida ishga tushirish

dockerfile
CMD ["python", "app.py"]      # root (xavfli)          # ⚠️
USER appuser                                            # ✅
CMD ["python", "app.py"]

6. latest asosiy tag

dockerfile
FROM python:latest            # qaysi versiya?         # ⚠️
FROM python:3.14-slim         # aniq                    # ✅

7. pip keshini saqlash (katta image)

dockerfile
RUN pip install -r req.txt    # kesh qoladi            # ⚠️
RUN pip install --no-cache-dir -r req.txt              # ✅

7. Integratsiya — bu bilim qayerda kerak bo'ladi

  • 28.1-dars (o'tilgan): Docker — image tushunchasi
  • 28.3-dars: Docker Compose — ko'p image
  • 28.4-dars: Konteyner optimizatsiyasi — multi-stage
  • 28.7-dars: CI — Dockerfile'dan build
  • 28.14-dars: IaC — muhit kodi

8. Eng yaxshi amaliyotlar

  1. Yengil asos (slim, alpine).

  2. Qatlam tartibi (kam o'zgaradiganlar avval).

  3. .dockerignore (sir/keraksiz).

  4. RUN birlashtirish (kam qatlam).

  5. Sirlar imageda emas (run/secret).

  6. USER (root emas — xavfsizlik).

  7. Aniq tag (versiya, latest emas).

  8. Multi-stage (build va ishga tushirish alohida).


9. Amaliy topshiriq

Vazifa 1: Bashorat qiling

python
1.  # Dockerfile nima?
2.  # FROM nima?
3.  # COPY nima?
4.  # RUN nima?
5.  # CMD nima?
6.  # RUN vs CMD?
7.  # qatlam nima?
8.  # kesh qanday ishlaydi?
9.  # nega tartib muhim?
10. # CMD vs ENTRYPOINT?
11. # .dockerignore nima?
12. # nega slim asos?
Javoblar
  1. Image qurish retsepti
  2. Asosiy image (nimadan boshlash)
  3. Fayllarni image ichiga nusxalash
  4. Build vaqtida buyruq (o'rnatish)
  5. Konteyner ishga tushirish buyrug'i
  6. RUN build vaqti, CMD ishga tushirish vaqti
  7. Har buyruq bir o'zgarishlar to'plami
  8. O'zgarmagan qatlam qayta qurilmaydi
  9. O'zgargan qatlamdan keyingilar qayta quriladi
  10. CMD almashtiriladi, ENTRYPOINT o'zgarmas
  11. COPY chetlab o'tadigan fayllar
  12. Yengil image (kichik, tez)

Vazifa 2: Xatolarni tuzating

dockerfile
1.  COPY . .
    RUN pip install       # kesh buziladi

2.  FROM python:3.14       # og'ir

3.  COPY .env .            # sir

4.  RUN apt update
    RUN apt install curl   # ko'p qatlam

5.  FROM python:latest     # noaniq
Javoblar
dockerfile
1.  COPY requirements.txt . (avval); RUN pip install; COPY . .

2.  FROM python:3.14-slim

3.  .dockerignore'ga .env (run vaqtida muhit)

4.  RUN apt update && apt install -y curl

5.  FROM python:3.14-slim

Vazifa 3: Dockerfile

Yozing:

  1. FROM
  2. WORKDIR
  3. COPY, RUN
  4. CMD

Vazifa 4: Qatlamlar

Tahlil:

  1. Buyruqlar
  2. Qatlamlar
  3. Kesh
  4. Tartib

Vazifa 5: Kesh

Modellang:

  1. Qatlamlar
  2. O'zgarish
  3. Qayta qurish
  4. Tez/sekin

Vazifa 6: dockerignore

Modellang:

  1. Fayllar
  2. Naqshlar
  3. Chetlab
  4. Sir

Vazifa 7: O'ylash

Dockerfile'dagi qatlam tartibi (kam o'zgaradiganlar avval) — kichik detal, lekin build tezligiga katta ta'sir. Nima uchun bu "keshni tushunish" (nima qayta qurilishini bilish) Docker'dan tashqarida ham muhim tamoyil (kesh — kompyuter fanida hamma joyda), va nega "ishlaydigan" Dockerfile bilan "yaxshi" Dockerfile orasidagi farq ko'pincha e'tibordan chetda qoladi?

Javob

Qisqa javob: "Keshni tushunish" Docker'dan tashqarida ham muhim, chunki: kesh — kompyuter fanining fundamental tamoyili (takrorlanadigan ishni saqlab, qayta bajarmaslik) — u hamma joyda: protsessor keshi (RAM'dan tez), brauzer keshi (sahifa), CDN (kontent), ma'lumotlar bazasi keshi, funksiya memoizatsiyasi (13-qism), HTTP kesh. Keshning asosiy savoli doim bir xil: "nima o'zgardi, nima qayta hisoblash kerak?" (kesh yaroqsizligi — cache invalidation). Dockerfile qatlam tartibi aynan shu: "nima o'zgarganda nima qayta quriladi?" — kam o'zgaradiganlarni oldinga qo'yib, keshni maksimal saqlash. Bu tamoyilni tushungan dasturchi uni hamma joyda ko'radi (kesh — universal optimizatsiya). "Ishlaydigan" va "yaxshi" Dockerfile farqi e'tibordan chetda qoladi, chunki: ikkalasi ham "ishlaydi" (natija bir xil — image quriladi, dastur ishlaydi) — farq ko'rinmas (tezlik, hajm, xavfsizlik — funksionallikda emas); yangi dasturchi "ishladi" ni ko'radi (yashil belgi), lekin build 5 daqiqa yoki image 1.5 GB ekanini sezmaydi (yoki muhim deb bilmaydi); farq vaqt o'tishi bilan chiqadi (har build sekin — kunlar davomida soatlar isrof; katta image — sekin deploy, ko'p joy). Bu "ishlaydi ≠ yaxshi" tamoyili (27.1 toza kod, 27.6 arxitektura kabi): funksionallik minimum, sifat (tezlik, hajm, xavfsizlik) — professional farq. Muhandislik saboqlari: kesh — universal tamoyil (nima o'zgardi → nima qayta hisoblash); "keshni ishlatish" — nima o'zgarishini bilib, tartibga solish; "ishlaydi" ko'rinadi, "yaxshi" (tezlik, hajm) ko'rinmas — lekin muhim; kichik detallar (qatlam tartibi) katta ta'sir (har build, har deploy).

1. Nega kesh universal

Kesh — takrorlanadigan ishni saqlash (qayta bajarmaslik). Hamma joyda: protsessor, brauzer, CDN, baza, memoizatsiya. Asosiy savol: "nima o'zgardi?".

2. Dockerfile tartibi = kesh mantiqi

Kam o'zgaradiganlar avval → kesh saqlanadi. "Nima o'zgarganda nima qayta quriladi?" — universal kesh savoli.

3. Nega "ishlaydi ≠ yaxshi" chetda qoladi

Jihat Ko'rinishi
Ishlaydi Ko'rinadi (yashil belgi)
Yaxshi (tezlik, hajm) Ko'rinmas (funksionallikda emas)

4. Farq vaqt bilan chiqadi

Har build sekin — kunlarda soatlar isrof. Katta image — sekin deploy. "Ishladi" darrov, "yaxshi" keyin seziladi.

5. Muhandislik saboqlari

  1. Kesh — universal tamoyil (nima o'zgardi)
  2. Tartib — keshni maksimal saqlash
  3. "Ishlaydi" ko'rinadi, "yaxshi" ko'rinmas
  4. Kichik detal — katta ta'sir (har build)

6. Xulosa

  1. Kesh — fundamental (hamma joyda)
  2. Qatlam tartibi — kesh mantiqi (nima o'zgardi)
  3. "Ishlaydi ≠ yaxshi" (tezlik, hajm ko'rinmas)
  4. Detallar muhim (takroriy ta'sir)

Nimani mustahkamlaydi: 2.3, 2.4-bo'limlar.


Xulosa

Bu darsda Dockerfile yozishni o'rgandik.

Eng muhim uch fikr:

  1. Dockerfile va asosiy buyruqlar. Dockerfile — imageni qurish retsepti (matn fayl, buyruqlar ketma-ketligi): Docker uni yuqoridan pastga o'qib image quradi — takrorlanadigan (kod bilan tavsiflangan, git'da, jamoa bir xil). Asosiy buyruqlar: FROM (asosiy image — python:3.14-slim), WORKDIR (ishchi papka), COPY (fayllarni image ichiga), RUN (build vaqtida buyruq — o'rnatish), ENV (muhit o'zgaruvchisi), EXPOSE (port), CMD (ishga tushganda buyruq). Farq: RUN — qurish vaqti (image), CMD — ishga tushirish vaqti (container).

  2. Qatlamlar, kesh va tartib. Har Dockerfile buyrug'i bir qatlam (layer) yaratadi; Docker qatlamlarni keshlaydi (o'zgarmagan qatlam qayta qurilmaydi — tez). Muhim: bir qatlam o'zgarsa — u va undan keyingi barcha qatlamlar qayta quriladi. Shuning uchun qatlam tartibi: kam o'zgaradiganlar (kutubxonalar — requirements.txt) avval (kesh saqlanadi), tez o'zgaradiganlar (kod — COPY . .) keyin — kod o'zgarganda faqat oxirgi qatlam qayta quriladi (kutubxonalar keshdan). To'g'ri tartib — tez build.

  3. CMD/ENTRYPOINT, dockerignore, amaliyot. CMD — standart buyruq (docker runda almashtiriladi), ENTRYPOINT — asosiy buyruq (o'zgarmas — argumentlar qo'shiladi); exec shakli (["python", "app.py"]) afzal. .dockerignore — COPY chetlab o'tadigan fayllar (.git, __pycache__, .env — sirlar imagega tushmasin!) — yengil va xavfsiz image. Yaxshi Dockerfile amaliyoti: yengil asos, qatlam tartibi, .dockerignore, kam qatlam (RUN &&), sirlarsiz, USER (root emas), multi-stage build. Dockerfile — muhit kodi (infrastructure as code — takrorlanuvchanlik, versiyalash, hujjat); "ishlaydigan" va "yaxshi" (tez, yengil, xavfsiz) farqi muhim (kesh — universal tamoyil). Docker 28.1-bob, Compose 28.3-bob, CI/CD 28.7-bob uchun asos.

Keyingi darsda Docker Compose ni o'rganamiz: ko'p konteynerli ilovalarni (dastur + baza + kesh) bitta YAML fayl bilan ta'riflash va bir buyruq (docker compose up) bilan ishga tushirish.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

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