Docker Image Optimizasyonu
Küçük ve güvenli Docker image'ları, hızlı deployment ve düşük attack surface sağlar. Bu rehberde best practice'leri inceleyeceğiz.
Base Image Seçimi
# KÖTÜ - Tam OS image'ı (800MB+)
FROM ubuntu:22.04
İYİ - Minimal image (5MB)
FROM alpine:3.18
EN İYİ - Distroless (security için)
FROM gcr.io/distroless/static-debian12
Multi-stage Build
# Dockerfile
# Build stage
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
Production stage
FROM node:18-alpine
WORKDIR /app
Non-root user
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
Sadece gerekli dosyaları kopyala
COPY --from=builder --chown=appuser:appgroup /app/dist ./dist
COPY --from=builder --chown=appuser:appgroup /app/node_modules ./node_modules
EXPOSE 3000
CMD ["node", "dist/index.js"]
Layer Optimizasyonu
# KÖTÜ - Her RUN yeni layer
RUN apt-get update
RUN apt-get install -y curl
RUN apt-get install -y wget
RUN apt-get clean
İYİ - Tek layer, temizlik dahil
RUN apt-get update &&
apt-get install -y --no-install-recommends
curl
wget &&
apt-get clean &&
rm -rf /var/lib/apt/lists/*
.dockerignore Dosyası
# .dockerignore
.git
.gitignore
node_modules
npm-debug.log
Dockerfile*
docker-compose*
.env
*.md
.vscode
coverage
tests
Güvenlik Best Practices
# Non-root user kullan
USER 1000:1000
Read-only filesystem
docker run --read-only --tmpfs /tmp myapp
Capability drop
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE myapp
Security scanning
docker scan myimage:latest
trivy image myimage:latest
Image Build ve Push
# Buildkit ile build (paralel, cache optimize)
DOCKER_BUILDKIT=1 docker build -t myapp:v1.0 .
Multi-platform build
docker buildx build --platform linux/amd64,linux/arm64 -t myapp:v1.0 --push .
Image push
docker tag myapp:v1.0 registry.example.com/myapp:v1.0
docker push registry.example.com/myapp:v1.0
Sonuç
Optimize edilmiş image'lar %80'e varan boyut küçülmesi sağlar ve güvenlik risklerini azaltır.