Mundarija (22)
- 1. Kirish va motivatsiya
- 2. Nazariya — chuqur tushuntirish
- 2.1. Dockerfile nima
- 2.2. Asosiy buyruqlar (FROM, COPY, RUN, CMD)
- 2.3. Qatlamlar va kesh
- 2.4. Qatlam tartibi (optimizatsiya)
- 2.5. CMD va ENTRYPOINT
- 2.6. .dockerignore
- 2.7. Yaxshi Dockerfile amaliyoti
- 2.8. Dockerfile — muhit kodi
- 3. Tez ma'lumotnoma
- 4. Batafsil misollar
- Misol 1 — Dockerfile qatlamlarga bo'lish
- Misol 2 — Qatlam keshi (o'zgarish ta'siri)
- Misol 3 — Qatlam tartibi (optimizatsiya taqqoslash)
- Misol 4 — .dockerignore va image hajmi
- 5. To'g'ri va noto'g'ri tushunishlar
- 6. Keng tarqalgan xatolar va yechimlari
- 7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 8. Eng yaxshi amaliyotlar
- 9. Amaliy topshiriq
- Xulosa
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:
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 tushirishDockerfile — 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:
# 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:
# 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
# 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 emas4. Batafsil misollar
Dockerfile OS vositasi; misollar Python bilan qurilish/kesh mantiqini modellashtiradi.
Misol 1 — Dockerfile qatlamlarga bo'lish
"""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:
=== 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 qatlamNima ko'rsatdi: 2.1, 2.2, 2.3-bo'limlar.
Misol 2 — Qatlam keshi (o'zgarish ta'siri)
"""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:
=== 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 quriladiNima ko'rsatdi: 2.3, 2.4-bo'limlar.
Misol 3 — Qatlam tartibi (optimizatsiya taqqoslash)
"""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:
=== 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
"""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:
=== 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 imageNima 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
COPY . . # kesh buziladi # ⚠️
RUN pip install ...
# yaxshi:
COPY requirements.txt . # avval (kesh) # ✅
RUN pip install ...
COPY . .2. Og'ir asosiy image
FROM python:3.14 # to'liq (og'ir) # ⚠️
FROM python:3.14-slim # yengil # ✅3. .env ni imagega nusxalash
COPY .env . # sir imageda! # ⚠️
# .dockerignore'ga .env + run vaqtida muhit # ✅4. Ko'p alohida RUN (ko'p qatlam)
RUN apt update
RUN apt install -y curl # 2 qatlam # ⚠️
RUN apt update && apt install -y curl # 1 qatlam # ✅5. root sifatida ishga tushirish
CMD ["python", "app.py"] # root (xavfli) # ⚠️
USER appuser # ✅
CMD ["python", "app.py"]6. latest asosiy tag
FROM python:latest # qaysi versiya? # ⚠️
FROM python:3.14-slim # aniq # ✅7. pip keshini saqlash (katta image)
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
Yengil asos (
slim,alpine).Qatlam tartibi (kam o'zgaradiganlar avval).
.dockerignore(sir/keraksiz).RUN birlashtirish (kam qatlam).
Sirlar imageda emas (run/secret).
USER(root emas — xavfsizlik).Aniq tag (versiya,
latestemas).Multi-stage (build va ishga tushirish alohida).
9. Amaliy topshiriq
Vazifa 1: Bashorat qiling
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
- Image qurish retsepti
- Asosiy image (nimadan boshlash)
- Fayllarni image ichiga nusxalash
- Build vaqtida buyruq (o'rnatish)
- Konteyner ishga tushirish buyrug'i
- RUN build vaqti, CMD ishga tushirish vaqti
- Har buyruq bir o'zgarishlar to'plami
- O'zgarmagan qatlam qayta qurilmaydi
- O'zgargan qatlamdan keyingilar qayta quriladi
- CMD almashtiriladi, ENTRYPOINT o'zgarmas
- COPY chetlab o'tadigan fayllar
- Yengil image (kichik, tez)
Vazifa 2: Xatolarni tuzating
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 # noaniqJavoblar
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-slimVazifa 3: Dockerfile
Yozing:
- FROM
- WORKDIR
- COPY, RUN
- CMD
Vazifa 4: Qatlamlar
Tahlil:
- Buyruqlar
- Qatlamlar
- Kesh
- Tartib
Vazifa 5: Kesh
Modellang:
- Qatlamlar
- O'zgarish
- Qayta qurish
- Tez/sekin
Vazifa 6: dockerignore
Modellang:
- Fayllar
- Naqshlar
- Chetlab
- 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
- Kesh — universal tamoyil (nima o'zgardi)
- Tartib — keshni maksimal saqlash
- "Ishlaydi" ko'rinadi, "yaxshi" ko'rinmas
- Kichik detal — katta ta'sir (har build)
6. Xulosa
- Kesh — fundamental (hamma joyda)
- Qatlam tartibi — kesh mantiqi (nima o'zgardi)
- "Ishlaydi ≠ yaxshi" (tezlik, hajm ko'rinmas)
- Detallar muhim (takroriy ta'sir)
Nimani mustahkamlaydi: 2.3, 2.4-bo'limlar.
Xulosa
Bu darsda Dockerfile yozishni o'rgandik.
Eng muhim uch fikr:
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).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.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.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!