Docker Image Boyutu Küçültme Teknikleri: Alpine vs. Slim Images

müfettiş

Moderatör
Katılım
20 Ocak 2024
Mesajlar
325
Tepkime puanı
1
Puanları
18

Docker Image Boyutu Küçültme Teknikleri: Alpine vs. Slim Images​


Giriş: "Diyet Zamanı"​

Docker imajlarınız 1 GB boyutunda mı? Bu, dağıtım (deployment) süresinin yavaş olması, depolama maliyetlerinin artması ve daha geniş bir saldırı yüzeyi (Attack Surface) demektir.

İdeal bir Docker imajı, sadece ve sadece uygulamanın çalışması için gereken dosyaları içermelidir. Fazladan her megabayt, potansiyel bir güvenlik açığıdır. Bu makalede, imajlarınızı küçültmek için kullanacağınız Temel İmaj (Base Image) stratejilerini inceleyeceğiz.

1. Standart İmajlar (Ubuntu/Debian)​

FROM ubuntu:latest veya FROM node:latest

  • Boyut: ~700MB - 1GB (Uygulamayla birlikte).
  • İçerik: Tam bir işletim sistemi. Systemd, Bash, Apt, Curl, Wget ve yüzlerce kütüphane.
  • Kullanım: Geliştirme (Development) ortamında hata ayıklamak için iyidir ama Prod ortamı için çok şişmandır.

2. Slim İmajlar (Debian-Slim)​

FROM node:slim veya FROM python:slim

  • Boyut: ~150MB - 300MB.
  • İçerik: Gereksiz dokümantasyonların, man sayfalarının ve bazı araçların atıldığı Debian sürümüdür.
  • Avantajı: Standart glibc kütüphanesini kullanır. Yani uyumluluk sorunu çok azdır. Çoğu uygulama "kutudan çıktığı gibi" çalışır.
  • Karar: Uyumluluk ve boyut arasındaki en iyi dengedir. Çoğu proje için önerilen başlangıç noktasıdır.

3. Alpine Linux (Minimalist)​

FROM node:alpine

  • Boyut: ~50MB - 100MB. (Alpine'in kendisi sadece 5MB'dır!)
  • İçerik: Aşırı minimalisttir. Paket yöneticisi olarak apk kullanır.
  • Kritik Fark (Musl libc): Alpine, standart glibc yerine daha hafif olan musl libc kütüphanesini kullanır.
    • Risk: Python, Node.js veya C++ ile yazılmış bazı kütüphaneler glibc'ye bağımlıdır. Alpine üzerinde çalıştırırken garip hatalar alabilir veya performans sorunları yaşayabilirsiniz (Özellikle DNS çözümlemesinde).
  • Karar: Eğer uygulamanız musl ile uyumluysa, boyut açısından rakipsizdir.

4. Distroless (Google'ın Radikal Çözümü)​

FROM gcr.io/distroless/nodejs

  • Boyut: En küçük.
  • İçerik: İçinde Shell (Bash/Sh) bile yoktur. Paket yöneticisi yoktur. Sadece uygulamanız ve çalışma zamanı (Runtime) vardır.
  • Avantajı (Güvenlik): Bir hacker konteynerinize sızsa bile, komut çalıştıracak bir Shell bulamaz. Saldırıyı ilerletemez.
  • Dezavantajı: Hata ayıklamak (Debug) çok zordur çünkü içine docker exec ile giremezsiniz (Shell yok!).

İmaj Küçültme İpuçları​

  1. Zincirleme RUN Komutları:
    • Kötü:

      Dockerfile

      Kod:
      RUN apt-get update
      RUN apt-get install -y vim
      RUN rm -rf /var/lib/apt/lists/*
      (3 ayrı katman oluşturur. Silinen dosyalar önceki katmanda yer kaplamaya devam eder).
    • İyi:

      Dockerfile

      Kod:
      RUN apt-get update && \
          apt-get install -y vim && \
          rm -rf /var/lib/apt/lists/*
      (Tek katman. Geçici dosyalar aynı katmanda silindiği için imaj büyümez).
  2. .dockerignore Kullanın: .git klasörü, Markdown dosyaları ve testleri imaja kopyalamayın.

Sonuç​

  • Varsayılan: Slim imajları kullanın.
  • Boyut Takıntısı: Alpine deneyin (Testleri iyi yapın).
  • Maksimum Güvenlik: Distroless kullanın.
  • Asla: Prod ortamında tam Ubuntu veya latest etiketli şişman imajları kullanmayın.
 
Geri
Üst