Dockerfile optimizasyonu: daha küçük, hızlı ve güvenli imajlar
Beceri rehberi

Dockerfile optimizasyonu: daha küçük, hızlı ve güvenli imajlar

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 5 dk okuma

Çok aşamalı derleme, temel imaj seçimi, katman sırası, dockerignore ve önbellek: Dockerfile optimizasyonunun ölçerek ilerleyen adımları.

Büyük ve yavaş imaj neden sorundur?

Docker imajı büyüdükçe her şey yavaşlar: derleme, kayıt defterine gönderme, kümede çekme, yeni sürüm dağıtma ve otomatik ölçekleme sırasında yeni düğümde ayağa kalkma. Daha büyük imaj aynı zamanda daha fazla paket demektir; her paket potansiyel bir güvenlik açığı ve saldırı yüzeyi taşır. Küçük imaj, hızlı pipeline, ucuz depolama ve daha az açık anlamına gelir.

Optimizasyon farklı hedeflere hizmet eder ve bunlar karıştırılmamalıdır: imaj boyutunu küçültmek (çalışma zamanı ve dağıtım hızı için) ve derleme süresini kısaltmak (geliştirici ve pipeline hızı için). Bazen bu hedefler aynı yönde ilerler, bazen birini iyileştirmek diğerini zorlaştırır.

Önce ölçün: imaj neyden oluşuyor?

Katman mantığını anlamadan optimizasyon tahmine döner. Bir imaj, Dockerfile'daki talimatların ürettiği salt okunur katmanlardan oluşur; her RUN, COPY ve ADD yeni bir katman ekler ve eklenen dosyalar sonraki bir katmanda silinse bile önceki katmanda yer tuttuğu için imaj boyutu azalmaz. Bu yüzden "indir, kur, sil" adımları aynı RUN talimatında yapılmalıdır.

Katmanları incelemek için docker history komutu her katmanın boyutunu gösterir; dive gibi araçlar katman içeriklerini ayrıntılı görselleştirir. Önce en büyük katmanları bulun: çoğunlukla bir temel imaj, bağımlılık kurulumu veya kopyalanan gereksiz dosyalar baş sorumludur.

Çok aşamalı derleme (multi-stage build)

Yüksek kazanç sağlayan tekniklerden biridir. Derleme araçları (derleyici, geliştirme bağımlılıkları, test paketleri) üretim imajında gerekmez. Çok aşamalı derlemede ilk aşamada uygulama derlenir, son aşamada yalnızca çalışması için gereken çıktı küçük bir temel imaja kopyalanır. Örnek bir Node.js uygulaması için yapı şöyledir:

FROM node:lts AS build WORKDIR /app COPY package.json package-lock.json ./ RUN npm ci COPY . . RUN npm run build

FROM node:lts-slim WORKDIR /app COPY --from=build /app/dist ./dist COPY --from=build /app/package.json ./ RUN npm ci --omit=dev CMD ["node", "dist/server.js"]

Derleme aşaması, derleyici ve geliştirme bağımlılıklarıyla büyür ama son imaja girmez. Derlenen diller (Go, Rust gibi) için son aşama çok daha küçük, hatta neredeyse boş bir imaj olabilir; Java ve .NET için çalışma zamanı imajı ile derleme imajı ayrılır.

Temel imaj seçimi ve boyut küçültme teknikleri

  • Daha küçük temel imaj: Tam dağıtım imajı yerine slim varyantları ya da minimal imajlar kullanın. Alpine tabanlı imajlar çok küçüktür ancak farklı bir C kütüphanesi (musl) kullanır; bazı derlenmiş bağımlılıklarda uyumsuzluk çıkarabilir. Distroless imajlar kabuk ve paket yöneticisi içermez; daha güvenlidir ama hata ayıklamayı zorlaştırır.
  • Gereksiz paketleri kurmamak: Paket yöneticisinde önerilen ek paketleri devre dışı bırakın, yalnızca gerekenleri kurun, önbelleği aynı RUN içinde temizleyin.
  • dockerignore dosyası: Depo geçmişi, test verisi, yerel bağımlılık klasörleri ve gizli dosyaların derleme bağlamına girmesini önler; hem boyutu hem derleme süresini hem güvenliği iyileştirir.
  • Bağımlılıkları üretim modunda kurmak: Geliştirme bağımlılıklarını son imajdan çıkarın.
  • Gereksiz dosyaları atmak: Belgeler, örnekler, önbellek klasörleri ve derleme artıkları.

Temel imajı seçerken boyutun yanında bakımın düzenli sürmesini, güvenlik yamalarının hızını ve ekibinizin imajı tanımasını da hesaba katın.

Derleme süresi ve önbellek

Docker, değişmeyen katmanları önbellekten kullanır; ancak bir katman değiştiğinde ondan sonraki tüm katmanlar yeniden derlenir. Bu yüzden Dockerfile'da en az değişen şeyler yukarıda, en sık değişenler aşağıda olmalıdır. Yukarıdaki örnekteki gibi önce yalnızca bağımlılık tanım dosyalarını kopyalayıp bağımlılıkları kurmak, sonra kaynak kodu kopyalamak, kod değiştiğinde bağımlılık kurulumunun yeniden çalışmasını engeller.

Gelişmiş derleme altyapısında (BuildKit) paket yöneticisi önbelleğini derlemeler arasında kalıcı tutan önbellek bağlama özellikleri, paralel aşama derleme ve uzak önbellek paylaşımı vardır. Pipeline'larda önbelleğin derleme ajanları arasında nasıl paylaşılacağı, süreyi belirgin biçimde etkiler. Güncel özellikler için resmî Docker belgelerine bakın.

Güvenlik ve sertleştirme

Küçültmek güvenliğin yarısıdır; kalanı yapılandırmadır. Konteyneri root yerine yetkisiz bir kullanıcıyla çalıştırın, sürüm etiketlerini sabitleyin (hatta mümkünse özet değeriyle imajı sabitleyin) ki aynı Dockerfile her gün farklı bir temel imaj çekmesin. Gizli bilgileri (parola, anahtar) imajın içine ENV veya COPY ile koymayın; derleme sırasında gerekiyorsa derleme sırlarını destekleyen mekanizmayı kullanın, çünkü imaj katmanları geçmişte saklanır.

İmajları yayımlamadan önce açık tarayıcısından geçirin, kayıt defterinde imza ve kaynak doğrulaması gibi yöntemleri değerlendirin. Küçük bir temel imaj güvenlik taramasındaki bulgu sayısını da genellikle azaltır.

Sık yapılan hatalar

  • Her şeyi kopyalamak: COPY . . satırından önce dockerignore ayarlanmamış olması.
  • Silme işlemini ayrı katmanda yapmak: Dosya önceki katmanda kalır, boyut küçülmez.
  • En üstte kaynak kodu kopyalamak: Her kod değişikliğinde bağımlılıklar yeniden kurulur.
  • Etiketi latest bırakmak: Tekrarlanabilirlik kaybolur.
  • Kabuksuz imajı hata ayıklama kolaylığı düşünmeden seçmek: Sorun anında müdahale zorlaşır; geçici hata ayıklama konteyneri gibi planlar önceden yapılmalıdır.
  • Boyutu tek ölçüt saymak: Başlangıç süresi, uyumluluk ve bakım yükü de önemlidir.
  • Optimizasyonu ölçmeden yapmak: Önce ve sonra boyut ve süreyi karşılaştırın.

Öğrenme yolu ve Mindset bağlamı

Önce Docker temelleri: imaj, konteyner, Dockerfile, volume ve ağ. Bu temel hazır olduğunda katman mantığını, önbellek davranışını ve çok aşamalı derlemeyi öğrenin; sonra güvenlik, imaj taraması ve CI/CD'de derleme hattı gelir. Kendi uygulamanızın imajını bir hedef boyuta indirmeye çalışmak en öğretici alıştırmadır.

Temel Docker Eğitimi programı Docker'a giriş, imaj ve konteyner yönetimi, Dockerfile ile özel imaj oluşturma, volume ve ağ, Docker Compose ve CI/CD entegrasyonunu kapsar. Konteyner İmaj Optimizasyonu ve Docker İleri Seviye programı ise imaj anatomisi ve katman mantığı, çok aşamalı derleme, temel imaj seçimi ve boyut optimizasyonu, güvenlik ve sertleştirme, derleme hattı ve önbellek yönetimi ile imaj doğrulama ve teslim modüllerini içerir.

İlgili Mindset programı

Konteyner İmaj Optimizasyonu ve Docker İleri Seviye

Sık sorulanlar

Sık sorulan sorular

Alpine imajı her zaman uygun seçim midir?

Hayır. Alpine çok küçüktür, ancak glibc yerine musl kullandığı için bazı derlenmiş paketlerde uyumsuzluk ve performans farkı çıkarabilir. Slim varyantları çoğu zaman uyumluluk ve boyut arasında iyi bir denge sunar. Seçimi uygulamanızın bağımlılıklarını gerçekten test ederek yapın.

Çok aşamalı derleme tam olarak neyi çözer?

Derleme için gereken araçların üretim imajına girmesini engeller. İlk aşamada kodu derleyip bağımlılıkları kurar, son aşamada yalnızca çalışmak için gereken çıktıyı küçük bir temel imaja kopyalarsınız. Böylece derleyici, test paketleri ve geliştirme bağımlılıkları son imajda yer almaz; boyut ve saldırı yüzeyi birlikte azalır.

dockerignore dosyası ne işe yarar?

Derleme bağlamına hangi dosya ve klasörlerin gönderilmeyeceğini belirler. Depo geçmişi, yerel bağımlılık klasörleri, günlük ve test dosyaları gibi gereksiz içerik hariç tutulur. Bu hem derlemeyi hızlandırır hem de yanlışlıkla gizli dosyaların imaja girmesini önler. Bu dosyayı projenin başında oluşturmak iyi bir alışkanlıktır.

İmaj boyutunu nasıl ölçerim ve nereden başlarım?

docker images ile toplam boyuta, docker history ile katman bazında boyuta bakın. En büyük katmanı bulup kaynağını inceleyin: genellikle temel imaj, bağımlılık kurulumu veya fazla kopyalanan dosya sorumludur. Önce bu en büyük kalemi küçültmek, küçük ayarlamalarla uğraşmaktan daha verimli sonuç verir.

Docker İmajı Nasıl Küçültülür ve Hızlandırılır