Hızlı Özet (TL;DR)
Geleneksel Dockerfile yapılarında derleyiciler (SDK), kaynak kodlar ve geliştirme araçları son imajın içine gömülerek 1 GB’ı aşan hantal ve güvenlik açıklarıyla dolu imajlar üretilir. Docker Multi-Stage Build mimarisi, derleme ortamı ile çalışma zamanı ortamını birbirinden tamamen ayırır. Uygulama ilk aşamada derlenir, nihai aşamada ise yalnızca derlenmiş binary/çalıştırılabilir dosya ultra hafif bir tabana (Alpine veya Distroless) kopyalanarak imaj boyutu 30-50 MB seviyesine indirilir.
Geleneksel Build ve Multi-Stage Build Karşılaştırması
İki konteynerleştirme yaklaşımı arasındaki farklar:
| Özellik | Standart Tek Aşamalı Dockerfile | Multi-Stage Build Mimarisi |
|---|---|---|
| Nihai İmaj Boyutu | 800 MB – 1.5 GB | 30 MB – 80 MB (%95 tasarruf) |
| İçerilen Paketler | gcc, git, npm, pip ve geliştirme araçları | Yalnızca derlenmiş çıktı ve runtime kütüphaneleri |
| Saldırı Yüzeyi (CVE) | Yüzlerce potansiyel işletim sistemi zafiyeti | Minimum paket içeriği ile sıfıra yakın zafiyet |
| Dağıtım (CI/CD) Hızı | Registry’den indirme dakikalar sürer | Birkaç saniye içinde sunucuya çekilir ve başlar |
| Konteyner Kullanıcısı | Genellikle varsayılan root yetkisi | Ayrıcalıksız non-root kullanıcı yapılandırması |
Örnek Multi-Stage Node.js Dockerfile Mimarisi
Aşağıdaki Dockerfile, üretim ortamı için optimize edilmiş çift aşamalı yapıyı göstermektedir:
# 1. Aşama: Derleme (Builder)
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# 2. Aşama: Çalışma Zamanı (Production Runner)
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
# Güvenlik: Non-root kullanıcı tanımlama
USER node
# Yalnızca derlenmiş dosyaları ve üretim modüllerini taşı
COPY --from=builder --chown=node:node /app/package*.json ./
COPY --from=builder --chown=node:node /app/dist ./dist
RUN npm ci --only=production
EXPOSE 3000
CMD ["node", "dist/index.js"]
Konteyner Güvenliği İçin 3 Kritik Kontrol
- Root Olarak Çalıştırmayın: Konteyner içindeki işlem root yetkisine sahipse, konteyner kaçış zafiyetlerinde saldırgan ana sunucuya tam erişim sağlayabilir.
USERdirektifi ile yetkisiz kullanıcı atanmalıdır. - Hassas Dosyaları (.dockerignore):
.env,.gitve gizli anahtarlar asla imaja dahil edilmemelidir. - Distroless Tabanlar: Kabuk (Bash/Sh) dahi içermeyen Google Distroless imajları tersine kabuk (reverse shell) saldırılarını tamamen engeller.
Yüksek performanslı, güvenli ve mikroservis uyumlu kurumsal yazılım altyapıları için Özel Yazılım Geliştirme ve kurumsal sunucu çözümlerimiz için Ortak Dosya Sunucusu ve Yedekleme sayfalarımızı ziyaret edebilirsiniz.