L09 — Container: image, katman, multi-stage, compose#
A6'da uygulamayı elle kurdun: VM, systemd, nginx, PostgreSQL. Bu lab aynı uygulamayı bir image'a paketler ve docker compose ile app + DB'yi tek komutla ayağa kaldırır. Sonra aynı Dockerfile'ı multi-stage yaparak image'ı küçültür, önce/sonra boyut farkını gözünle görürsün.
Gerekenler#
docker+docker compose(yerel; K8s gerekmez).curl. İnternet (base image çekmek için).
Görev#
- Naive image'ı derle (önce).
starter/Dockerfile.naivetek stage'dir ve build araçlarını (build-essential) final image'a taşır — bilerek şişkin. - Multi-stage image'ı yaz (sonra).
Dockerfileiskeletini doldur: birbuildstage bağımlılıkları kurar,runtimestage yalnız gerekli olanı kopyalar. - Compose ile app + DB.
compose.yamliskeletini doldur:appservisi image'ı build eder,dbservisi PostgreSQL çalıştırır, appDB_HOST=dbile bağlanır. - Katman cache'ini gözlemle.
app.py'de küçük bir değişiklik yap, tekrar build et. Hangi katmanlarCACHED, hangileri yeniden çalıştı? Neden?report.txt'e yaz. - Raporla.
report.txt'e şunları yaz: naive boyutu, slim boyutu, fark, ve "katman cache niçin sırayla bozulur" açıklaması (kendi cümlelerinle).
Kabul kriterleri#
-
bash verify.shsıfır hatayla geçiyor. -
Dockerfilemulti-stage: en az ikiFROMve birCOPY --from=. -
compose.yamlapp+dbservisi içeriyor; hiçbir image:latestdeğil. -
report.txtnaive ve slim boyutlarını rakamla ve farkı içeriyor. -
report.txtkatman cache'inin niçin bozulduğunu kendi cümlelerinle anlatıyor.
İpucu (çözüm değil)#
- Multi-stage'in kazancı: build araçları (derleyici, pip cache,
.git) final image'a girmez.COPY --from=build /install /usr/localyalnız kurulmuş paketi taşır. - Katman cache: Docker her
COPY/RUNsatırını bir katman olarak cache'ler. Bir satır değişirse o satır ve sonrası yeniden çalışır. Bu yüzdenCOPY requirements.txt pip installsatırlarınıCOPY . .'dan önce koy — kod değişince bağımlılıklar yeniden kurulmaz.- Non-root çalıştır:
USER 10001(numeric UID, imajda kullanıcı yaratmaya gerek yok).
Takılırsan solution/'a bak — ama önce kendin dene.