Docker Multi-Stage Builds ile Optimizasyon Teknikleri
Docker, uygulamaların taşınabilir, güvenilir ve ölçeklenebilir bir şekilde dağıtılmasını sağlayan bir platformdur. Docker ile çalışırken ortaya çıkan en büyük sorunlardan biri, Docker imajlarının boyutlarının hızlı bir şekilde büyümesi ve bu durumun daha fazla disk alanı ve daha fazla ağ bant genişliği gerektirmesidir. Büyük Docker imajları, dağıtım sürelerini uzatarak daha yavaş CI/CD süreçlerine sebep olabilir. İşte bu gibi durumlarda Docker'''ın multi-stage build
özelliği devreye girer.
Multi-Stage Builds Nedir?
Multi-stage builds, Dockerfile içindeki farklı aşamalar (stages) kullanılarak, yalnızca nihai imajın oluşturulması için gereken artefaktların dahil edilmesini sağlar. Bu yaklaşım, geliştirme araçları ve diğer gereksiz dosyaları son Docker imajında tutmaktan kaçınarak imaj boyutunu önemli ölçüde azaltır.
Örneğin, yaygın bir kullanımı Go veya Node.js gibi dillerde yazılıp derlenmiş uygulamaların dağıtımında karşımıza çıkar. Bu tür uygulamaların geliştirme aşamasında çok sayıda araç ve kütüphane gerekmesine rağmen, üretim aşamasında yalnızca çalıştırılabilir bir dosya yeterli olabilir.
Docker Multi-Stage Build Nasıl Kullanılır?
Bir Dockerfile oluştururken her bir aşamayı FROM
komutuyla belirtebiliriz. Çok aşamalı bir yapı için temel Dockerfile yapısını aşağıdaki şekilde tanımlayabiliriz:
“`dockerfile
İlk Aşama: Derleme
FROM golang:1.17 AS builderWORKDIR /app
COPY . .
RUN go build -o myapp
İkinci Aşama: Çalıştırma
FROM alpine:latestWORKDIR /root/
COPY –from=builder /app/myapp .
CMD [“./myapp”] “`
Yukarıdaki Dockerfile, iki ana aşamadan oluşur. İlk aşama, Go dilinde yazılan bir uygulamayı derlerken, ikinci aşama sadece çalıştırılabilir dosyayı içeren daha küçük ve daha optimize bir imaj oluşturur.
Optimizasyon Teknikleri
– Katmanları Minimize Etmek: Dockerfile içinde gereksiz komutlar kullanarak ek katmanlar eklemekten kaçının. RUN
, COPY
ve ADD
komutlarını birleştirerek katmanları azaltabilirsiniz.
– Yalnızca Gereken Dosyaları Kopyalamak: Her zaman COPY . .
ile tüm dosyaları kopyalamayın. Bunun yerine, yalnızca gereken dosya ve klasörleri belirleyin.
– Sıkıştırılmış Temel İmajlar Kullanmak: Mümkün olduğunca küçük ve sıkıştırılmış temel imajlar kullanın (örneğin, alpine
).
– Cache Kullanımı: Docker'''ın katmanlı yapı sistemi, tekrarlayan build işlemlerinde cache kullanımı ile hız kazandırır. Bu sebeple, Dockerfile'''daki komutların sıralamasını değiştirmemeye çalışın.
Sunucu Seçimi ve Hosting Çözümleri
Optimizasyon tekniklerinin ardından, Docker imajlarının dağıtımı ve yönetimi için uygun alt yapı seçimi kritik önem taşır. Bulut sunucu ve fiziksel sunucu çözümleri, farklı ölçeklenebilirlik ve yönetim ihtiyaçlarına hitap eder. Docker konteynerlarını güvenle barındırmak ve yönetmek için çeşitli sunucu ve barındırma çözümlerine göz atabilir, ihtiyacınıza uygun yapıyı seçebilirsiniz.
Multi-stage builds ile Docker imajlarınızı optimize ederek, dağıtım zamanını ve kaynak kullanımını önemli ölçüde azaltabilirsiniz. Bu süreç, sunucu tarafında sağladığınız tasarruflarla birleştiğinde, uygulama dağıtım sistemlerinizi daha verimli hale getirir.