Docker Build Sürecini Hızlandırma: Cache ve Multi-stage Build Kullanımı

müfettiş

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

Docker Build Sürecini Hızlandırma: Cache ve Multi-stage Build Kullanımı​


Giriş: "Build Süresi Neden 10 Dakika?"​

CI/CD süreçlerinin en büyük düşmanı yavaş "Build" süreleridir. Bir geliştirici tek satır kod değiştirdiğinde, yeni Docker imajının oluşması için 10 dakika bekliyorsa, orada bir verimsizlik vardır. Ayrıca 1 GB boyutundaki imajları sunuculara transfer etmek hem ağ trafiğini tıkar hem de dağıtımı (Deployment) geciktirir.

Bu makalede, Dockerfile'ınızı optimize ederek build süresini saniyelere, imaj boyutunu ise megabaytlara nasıl düşüreceğinizi inceleyeceğiz.

1. Layer Caching (Katman Önbelleği) Sanatı​

Docker, Dockerfile içindeki her satırı (RUN, COPY, ADD) ayrı bir "Katman" (Layer) olarak işler ve bunları önbelleğe alır. Eğer bir satır değişmezse, Docker o işlemi tekrar yapmaz, önbellekten getirir.Altın Kural: En az değişen şeyleri en üste, en sık değişen şeyleri (kaynak kod) en alta yazın.

Kötü Örnek:

Kod:
COPY . .  (Kaynak kod her değiştiğinde bu satır değişir)
RUN npm install (Kod değiştiği için önbellek bozulur, her seferinde kütüphaneleri tekrar indirir!)

İyi Örnek:

Dockerfile

Kod:
COPY package.json . (Sadece kütüphane listesi değişince burası değişir)
RUN npm install (Kütüphaneler değişmediyse burayı önbellekten çeker - HIZ KAZANCI)
COPY . . (Kaynak kod değişse bile üst satırlar tekrar çalışmaz)

2. Multi-stage Builds (Çok Aşamalı İnşa)​

Uygulamayı derlemek için gereken araçlar (GCC, Maven, Go Compiler), uygulamanın çalışması için gerekli değildir. Bunları son imaja koymak güvenlik açığıdır ve boyutu şişirir.Multi-stage build ile "İnşaat Sahası" ve "Oturma Odası"nı ayırırız.

Örnek (Golang Uygulaması):

Dockerfile


Kod:
# Aşama 1: Builder (İnşaat Sahası) - 1 GB Boyutunda
FROM golang:1.19 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp main.go

# Aşama 2: Runner (Oturma Odası) - 10 MB Boyutunda
FROM alpine:latest
WORKDIR /root/
# Sadece derlenmiş dosyayı kopyala, kaynak kod ve compiler çöpe gider
COPY --from=builder /app/myapp .
CMD ["./myapp"]
Bu yöntemle imaj boyutu 1 GB'dan 10 MB'a düşer!

3. .dockerignore Dosyası​

Tıpkı .gitignore gibi, Docker'ın da .dockerignore dosyası vardır.node_modules, .git klasörü, yerel loglar veya test dosyalarını buraya ekleyin. Böylece COPY . . dediğinizde gereksiz dosyalar Docker Daemon'a gönderilmez (Build Context). Bu hem süreci hızlandırır hem de imajı küçültür.

Sonuç​

Optimize edilmiş bir Dockerfile; daha hızlı CI/CD pipeline'ı, daha az disk kullanımı ve daha güvenli (saldırı yüzeyi küçültülmüş) uygulamalar demektir. Multi-stage build ve Layer Caching, bir DevOps mühendisinin standart yetkinliği olmalıdır.
 
Geri
Üst