Kazanimlar:
- Konteyner ve Dockerfile kavramlarını, temel talimatları ve katman mantığını kavrayıp yapay zekaya üretime hazır Dockerfile ürettirebilme
- Çok aşamalı build ve küçük temel imaj ile imaj boyutunu düşürüp deploy hızını ve güvenliği artırabilme
- Secret'ı imaja gömmeme, root yerine yetkisiz kullanıcı ile çalıştırma ve imajı tarama güvenlik ilkelerini uygulayabilme
"Benim bilgisayarımda çalışıyordu" cümlesi, yazılım tarihinin en pahalı cümlesidir. Aynı kod, farklı bir sunucuda farklı kütüphane sürümü yüzünden patlar. Konteyner (container) teknolojisi tam bu sorunu çözer: uygulamanızı, çalışması için gereken her şeyle — kütüphaneler, çalışma ortamı, ayarlar — birlikte tek bir taşınabilir pakete koyar. Bu paket her yerde birebir aynı çalışır. En yaygın konteyner aracı Docker'dır.
Bir konteynerin tarifine Dockerfile denir: uygulamanızın hangi temel imajdan (base image — üzerine inşa edilen hazır katman) başlayacağını, hangi dosyaların kopyalanacağını, hangi komutların çalışacağını sırayla anlatan metin dosyasıdır. Bu tariften bir imaj (image) üretilir; imaj çalıştırıldığında bir konteyner olur. YZ, Dockerfile yazmakta ve — daha da değerlisi — onu küçültüp güvenli hale getirmekte çok yeteneklidir. Ama üretilen tarifin ne yaptığını ve nereye secret sızdırabileceğini anlamak sizin işinizdir.
Dockerfile'ın temel talimatları
Bir Dockerfile'ı denetlemek için başlıca talimatları bilmelisiniz:
- `FROM`: Temel imajı seçer (örneğin python:3.12-slim). İmajın boyutu ve güvenliği büyük ölçüde buradan gelir.
- `WORKDIR`: Çalışma dizinini belirler.
- `COPY` / `ADD`: Dosyaları imaja kopyalar.
- `RUN`: Build sırasında bir komut çalıştırır (örneğin bağımlılık kurar). Her RUN yeni bir katman (layer) oluşturur.
- `ENV`: Ortam değişkeni tanımlar.
- `EXPOSE`: Konteynerin hangi portu dinlediğini belgeler.
- `CMD` / `ENTRYPOINT`: Konteyner başlayınca çalışacak komutu belirler.
Kritik bir kavram katman (layer): Docker her talimatı bir katman olarak önbelleğe alır. Sık değişen adımları sona koyarsanız, değişmeyen katmanlar önbellekten gelir ve build hızlanır.
İpucu: İmaj boyutunu küçültmenin en büyük iki kaldıracı: (1) slim veya alpine gibi küçük temel imaj seçmek; (2) çok aşamalı build (multi-stage build) kullanmak — derleme araçlarını bir aşamada bırakıp yalnızca son ürünü ince bir imaja taşımak. YZ bu ikisini isteyince ustalıkla uygular.
Neden küçük imaj bu kadar önemli? Çünkü imaj boyutu sadece disk meselesi değildir. Büyük bir imaj her deploy'da daha uzun indirilir (pull), kayıt defterinde (registry) daha çok yer kaplar, ölçeklenirken yeni Pod'ların ayağa kalkmasını yavaşlatır ve daha fazla paket barındırdığı için daha geniş bir saldırı yüzeyi (attack surface) — yani saldırganın istismar edebileceği açık alan — sunar. 1 GB'lık bir imaj yerine 100 MB'lık bir imaj kullanmak; deploy süresini kısaltır, maliyeti düşürür ve güvenliği artırır. Bir Dockerfile'ı optimize etmek, bu üç faydayı aynı anda toplamaktır. YZ'den optimize bir Dockerfile isterken "en küçük son imaj" hedefini açıkça söyleyin; böylece derleme aşamasını ayırmayı ve gereksiz paketleri atmayı önceliklendirir.
Adım adım: YZ ile Dockerfile üretmek ve optimize etmek
- Uygulamayı tarif et. Dil, sürüm, giriş komutu, dinlenen port.
- İlk taslağı ürettir. Çalışan basit bir Dockerfile iste.
- Optimize ettir. Aynı YZ'den çok aşamalı build, küçük temel imaj ve katman sıralaması iyileştirmesi iste.
- Güvenliği denetle. Secret gömülmüş mü, root olarak mı çalışıyor, gereksiz araç var mı?
- Build edip boyutu ölç. docker build sonrası docker images ile boyutu gör.
- Tara. docker scout veya trivy gibi bir açık tarayıcıyla bilinen zafiyetleri kontrol et.
Güvenlik: konteynere özgü riskler
Konteyner güvenliği kolayca gözden kaçar. Üç kural:
- Secret'ı imaja gömme. ENV API_KEY=... veya COPY .env gibi satırlar secret'ı imajın katmanlarına kalıcı yazar; imajı alan herkes okuyabilir. Secret'ı çalışma anında (runtime) ortam değişkeni veya kasadan verin.
- Root olarak çalıştırma. Varsayılan olarak konteynerler root (tam yetkili kullanıcı) çalışır; bir açık, konteynerden kaçışa dönüşebilir. USER talimatıyla yetkisiz bir kullanıcıya düşün.
- Küçük ve güncel temel imaj. Şişkin imajlar hem yavaş hem de daha çok zafiyet barındırır. slim/alpine seçin, sürümü sabitleyin (:latest kullanmayın).
Dikkat: Bir secret'ı RUN içinde kullanıp sonra silseniz bile, o ara katmanda kalır ve docker history ile geri okunabilir. Build sırasında secret gerekiyorsa Docker'ın --secret mekanizmasını kullanın, ENV/COPY ile değil.
Optimizasyon etkisi tablosu
Teknik
Ne yapar
Tipik etki
slim/alpine temel imaj
Gereksiz paketleri atar
900 MB → 120 MB
Çok aşamalı build
Derleme araçlarını dışarıda bırakır
700 MB → 90 MB
.dockerignore
Gereksiz dosyaları build'e almaz
Daha hızlı build, küçük bağlam
Katman sıralaması
Önbellek isabetini artırır
Build 5 dk → 40 sn
Sürüm sabitleme (:15)
Tekrarlanabilirlik + güvenlik
Ani bozulmayı önler
Üç mini vaka
Vaka 1 — 1.1 GB'lık imaj 95 MB'a indi. Bir ekibin Node.js imajı 1.1 GB'tı; her deploy dakikalarca sürüyordu. YZ'ye "bunu çok aşamalı build ve alpine ile optimize et" dediler. YZ derleme aşamasını ayırıp yalnızca üretilen dosyaları ince imaja taşıdı; sonuç 95 MB oldu, deploy süresi üçte bire düştü.
Vaka 2 — gömülü secret yakalandı. Bir mühendis, YZ'nin ürettiği Dockerfile'da ENV DB_PASSWORD=prod_secret satırını fark etti. YZ, "çalışsın" diye parolayı imaja gömmüştü. Mühendis bunu kaldırıp parolayı çalışma anında ortam değişkeninden okumaya çevirdi. Aksi halde imajı çeken herkes parolayı okuyabilirdi.
Vaka 3 — root'tan kaçış riski. Bir tarama aracı, YZ'nin ürettiği imajın root olarak çalıştığını ve bir kritik zafiyet içerdiğini bildirdi. Ekip USER appuser ekleyip temel imajı güncel sürüme çıkardı; tarama temizlendi. Ders: her imajı yayına almadan önce tarayın ve yetkisiz kullanıcıya düşürün.
Dört kopyalanabilir şablon
1) Optimize Dockerfile üretme:
[DİL/ÇATI] uygulaması için üretime hazır bir Dockerfile yaz.Kurallar:- Çok aşamalı build kullan; son imaj mümkün olan en küçük olsun.- Temel imaj slim/alpine ve sürümü sabit (":latest" kullanma).- Konteyneri root DEĞİL, yetkisiz bir USER ile çalıştır.- Secret'ı ASLA imaja gömme; runtime'da ortam değişkeni bekle.- .dockerignore önerisini de ekle.Giriş komutu: [X], dinlenen port: [Y].
2) Var olan Dockerfile'ı optimize et:
Şu Dockerfile'ı küçültmek ve hızlandırmak için incele. Katmansıralaması, çok aşamalı build, temel imaj ve gereksiz paketleraçısından somut değişiklikler öner; her değişikliğin tahminiboyut/hız etkisini yaz. Dockerfile: [İÇERİK]
3) Güvenlik denetimi:
Bu Dockerfile'ı güvenlik açısından denetle: gömülü secret,root kullanıcı, sabitlenmemiş sürüm, gereksiz araçlar, güncelolmayan temel imaj var mı? Bulguları önem sırasıyla vedüzeltmeleriyle listele. Dockerfile: [İÇERİK]
4) Build hatası çözme:
Şu docker build hatası neden oluyor ve nasıl çözülür? Bana köknedeni ve minimum değişiklikle çözümü ver. Secret gördüğün yerdegerçek değer üretme, yer tutucu kullan.Hata: [LOG] Dockerfile: [İÇERİK]
Zayıf prompt / Güçlü prompt
Zayıf: "Node uygulamam için Dockerfile yaz."
Sonuç: dev bir temel imaj, root kullanıcı, tek aşama, muhtemelen secret'a açık; boyut ve güvenlik düşünülmemiş bir çıktı.
Güçlü: "Node 20 uygulamam için üretime hazır Dockerfile yaz: çok aşamalı build, node:20-alpine temel imaj (sürüm sabit), yetkisiz USER ile çalışsın, secret gömme, 3000 portu dinliyor, giriş node dist/server.js. .dockerignore da öner."
Fark: ikinci istem sürümü, optimizasyon tekniğini, güvenlik kuralını ve giriş komutunu verir; çıktı küçük, güvenli ve doğrudan kullanılabilir olur.
Sık yapılan hatalar
- Secret'ı `ENV`/`COPY` ile imaja gömmek. Katmanlarda kalır, geri okunur.
- Root olarak çalıştırmak. USER talimatını atlamak ciddi güvenlik riskidir.
- `:latest` kullanmak. Tekrarlanamaz build ve beklenmedik bozulmalar yaratır.
- Çok aşamalı build'i atlamak. Derleme araçları son imajı gereksiz şişirir.
- `.dockerignore` yazmamak. .git, node_modules gibi devasa dizinler build'e girer.
- İmajı taramadan yayınlamak. Bilinen zafiyetleri fark etmeden prod'a çıkarmak.
Özetle
Konteynerler, uygulamayı her yerde aynı çalışan taşınabilir paketlere koyar; tarifi Dockerfile'dır. YZ, üretime hazır ve optimize Dockerfile'lar üretmekte güçlüdür — ama çok aşamalı build, küçük temel imaj, yetkisiz kullanıcı ve secret'sızlık kurallarını açıkça istemeniz gerekir. İmaj boyutunu küçültmek deploy'u hızlandırır; secret'ı gömmemek, root'tan kaçmak ve imajı taramak güvenliği sağlar. Her tarifin ne yaptığını ve nereye sızıntı açtığını doğrulamak sizin sorumluluğunuzdadır.
Uygulama görevi
Basit bir uygulama seçin. YZ'den "Optimize Dockerfile üretme" şablonuyla bir Dockerfile ürettirin. Sonra: (1) "Güvenlik denetimi" şablonuyla gömülü secret ve root kullanıcı olup olmadığını denetletin; (2) mümkünse docker build yapıp docker images ile boyutu ölçün; (3) bir sonraki adım olarak imajı küçültmek için hangi tekniğin en çok etki edeceğini not edin.
Kontrol listesi
- [ ] İstememe dil/çatı sürümünü, giriş komutunu ve portu ekledim.
- [ ] Dockerfile'da hiçbir gömülü secret yok; secret runtime'da bekleniyor.
- [ ] Konteyner root değil, yetkisiz bir USER ile çalışıyor.
- [ ] Temel imaj küçük (slim/alpine) ve sürümü sabit (:latest yok).
- [ ] Çok aşamalı build ve .dockerignore kullandım.
- [ ] İmajı bir zafiyet tarayıcısıyla taradım.