Altın İmaj Kütüphaneleri
Bu sayfada
Altın İmaj Kütüphaneleri
Docker Hub, önceden paketlenmiş ve çalışmaya hazır açık kaynak yazılım bulmak için harika bir yer. Ama Docker Hub'a herkes genel imaj gönderebiliyor, dolayısıyla orada bulduğunuza mutlaka güvenemezsiniz. Resmi imajlara güvenilebilir, ama sık güncelleniyorlar ve güncellemeleri takip etmeniz gerekiyor.
Geliştiricilerin uygulamaları için herhangi bir temel imaj kullanmasına izin vermek iyi bir fikir değil. Bilmeden, arka kapısı açılmış ya da bitcoin madenciliği yapan kötü niyetli bir imaj kullanabilirler. Temel imajın resmi olmasını şart koşmak daha iyi bir politika, ama bu kez verimliliğe mal olan ve uygulamalarınızı güvende tutmayı zorlaştıran çok sayıda sürüm ve varyantla karşı karşıya kalabilirsiniz.
Kendi temel imaj kümenizi — altın imajlar — oluşturup tüm uygulamaların bunları kullanmasını zorunlu kılmak en iyi yaklaşım. Böylece kendi onaylı imaj listenizi derleyip ihtiyacınıza göre şekillendirebiliyorsunuz.
Geliştiricinin Serbest Bölgesi
Önce problemi anlayalım. Şu iki Java uygulaması farklı temel imajlar ve farklı build kalıpları kullanıyor:
- app-1/Dockerfile — kullanımdan kaldırılmış
javaimajını kullanıyor ve uygulamayı derlemek için de çalıştırmak için de JDK sürümünü kullanıyor
- app-2/Dockerfile — Eclipse Temurin kullanıyor;
derleme için JDK, çalışma zamanı için JRE ile çok aşamalı bir build; bunlar Debian tabanlı imajlar
İki uygulamayı da Compose ile derleyin:
docker compose -f labs/golden-images/apps/docker-compose.yml build📋 Yeni imajları listeleyip karşılaştırın. Katmanları inceleyin — iki Java uygulaması katman önbelleğini iyi kullanıyor mu?
Nasıl yapılacağını bilmiyor musunuz?
İmaj referanslarının ikisi de courselabs/app ile başlıyor ve v1 etiketini
kullanıyor, dolayısıyla filtrede bunu kullanabilirsiniz:
docker image ls "courselabs/app*:v1"app-2'nin yaklaşık 200MB'lık bir imaj, app-1'in ise 600MB'ın üzerinde olduğunu göreceksiniz.
Katman ID'lerini kontrol etmek için imajları inceleyin:
docker inspect courselabs/app-1:v1app-1'de yaklaşık 12 katman bulacaksınız.
docker inspect courselabs/app-2:v1app-2'de yarısı kadar katman var — ama app-1 ile hiç ortak katman yok.
İkisi de Java uygulaması ve aynı çalışma ortamına ihtiyaç duyuyorlar, ama imaj hiyerarşileri tamamen ayrışmış. Paylaşılan katman yok, dolayısıyla Docker katman önbelleği hiç yeniden kullanılmıyor — imajların güvenliğini hiç düşünmesek bile disk alanı ve ağ bant genişliği için kötü haber.
Altın İmaj Kütüphanesi
Kendi temel kütüphanenizi kurmak için desteklemek istediğiniz platformlara ve varyantlara karar vermeniz gerekiyor. Bir denge kurmanız lazım: yönetilebilir kalması ve önbelleğin en iyi kullanılması için az sayıda altın imaj istiyorsunuz, ama uygulamalarınızı da desteklemeniz gerekiyor.
Bu kütüphanede Java uygulamaları için iki imaj kümesi var:
- Debian tabanlı JDK ve
Debian tabanlı JRE. Bunlar resmi Eclipse Temurin imajları üzerine kuruluyor ve bir Java sürümüne pinlenmiş — ama belirli bir işletim sistemi sürümüne değil, çünkü resmi imaj bu ayrıntıda bir seçenek sunmuyor
- Alpine tabanlı JDK ve
Alpine tabanlı JRE. Bunlar tamamen sürümlenmiş — açık bir Alpine sürümü ve açık bir OpenJDK apk sürümü. Sürümler build argümanı olduğu için güncellemek kolay. Bedeli bakım yükü: Alpine paketi yeniden derlediğinde apk sürüm dizgisi değişiyor ve onu takip etmeniz gerekiyor. (Bu lab'ın upstream sürümünü bozan şey tam olarak buydu — Alpine 3.15'ten bir paket pinlemişti ve o sürüm kullanım ömrünü tamamladı.)
- library/docker-compose.yml — kütüphane
imajlarının build ayrıntılarını taşıyor ve özel bir adlandırma geleneği kullanıyor
📋 Kütüphaneyi Compose ile derleyin; FROM satırlarındaki imajların en güncel
sürümlerini indirdiğinizden emin olun.
Nasıl yapılacağını bilmiyor musunuz?
docker compose -f ./labs/golden-images/library/docker-compose.yml build --pullYeni kütüphane imajlarının boyutlarını ve etiketlerini kontrol edin:
docker image ls "courselabs/java*"Alpine sürümleri Debian varyantlarından küçük — aşağıdaki sayılar tek bir çalıştırmadan, temel imajlar değiştikçe sizdekiler farklı olacak:
REPOSITORY TAG IMAGE ID CREATED SIZE
courselabs/java jdk-26.10 dbe839e1d807 About a minute ago 271MB
courselabs/java jre-26.10 ad98b2279e7f About a minute ago 184MB
courselabs/java jre-debian-26.10 79786bc38074 2 weeks ago 221MB
courselabs/java jdk-debian-26.10 0d6d8cde8cc0 2 weeks ago 422MBArtık Java uygulamaları için zorunlu kılabileceğimiz bir imaj kümemiz var — Alpine tercih edilen, Debian ise ek uyumluluk için mevcut.
Altın İmajları Kullanmak
İmaj kütüphanesini kullanmak, uygulama Dockerfile'larındaki FROM imajını
değiştirmekten ibaret; bunu yaparken onları standart çok aşamalı build
kalıbını kullanacak şekilde de düzeltebiliriz:
- app-1/Dockerfile.v2 ve
app-2/Dockerfile.v2 — ikisi de kütüphanedeki JDK ve JRE imajlarını kullanıyor
- apps/docker-compose-v2.yml — uygulamaları v2
Dockerfile'ları ve
v2etiketiyle derliyor
Yeni sürümleri derleyin:
docker compose -f labs/golden-images/apps/docker-compose-v2.yml build📋 v2 imajlarını listeleyip katmanları karşılaştırın. Artık önbelleği kullanıyor muyuz?
Nasıl yapılacağını bilmiyor musunuz?
Bu imajlar courselabs/app ile başlıyor ve v2 etiketini kullanıyor,
dolayısıyla filtrede bunu kullanabilirsiniz:
docker image ls "courselabs/app*:v2"İkisi de 200MB'ın altında — altın JRE imajıyla neredeyse aynı boyutta. Uygulama ikili dosyaları o kadar küçük ki temel imaja pek bir şey eklemiyorlar.
Katman ID'lerini kontrol etmek için temel imajı ve uygulama imajlarını inceleyin:
docker inspect courselabs/java:jre-26.10
docker inspect courselabs/app-1:v2
docker inspect courselabs/app-2:v2JRE imajında iki katman var — Alpine katmanı artı OpenJDK katmanı. app-1 imajı
bu katmanları yeniden kullanıp iki tane daha ekliyor: biri /app klasörünü
oluşturan, diğeri class dosyasını ekleyen. app-2 imajında da dört katman var —
üçünü app-1 ile paylaşıyor, yani yalnızca uygulama ikilisini taşıyan son
katman farklı.
Tek bir çalıştırmada orijinal v1 uygulama imajları aralarında yaklaşık 860MB disk tuttu, çünkü hiç katman paylaşmıyorlar. v2 uygulamaları toplamda yaklaşık 185MB tuttu — paylaştıkları JRE imajı. Sizdeki tam sayılar farklı olacak; asıl nokta oran.
Dockerfile'larınızdaki temel imajları kontrol etmek için build'inizde Anchore gibi bir araç kullanabilirsiniz; böylece temel imajlar kütüphaneden değilse build başarısız olur
İmaj Önbelleği
İmajlarınızın gerçekte ne kadar yer kapladığını görmek zor, çünkü Docker virtual size bildiriyor — yani imaj makinenizdeki tek imaj olsaydı ne kadar depolamaya ihtiyaç duyacağı.
İmaj listesinin çıktısı ne kadar katman paylaşımı olduğunu net göstermiyor:
docker image ls "courselabs/app*"v2 uygulamaları için 2x184MB var gibi görünüyor, ama bunun çoğunlukla tek bir paylaşılan katman kümesi olduğunu biliyoruz.
docker system komutları gerçekte ne kadar depolama kullanıldığını görmenizi
ve kullanılmayan veriyi temizlemenizi sağlıyor.
📋 İmajlarınızın ne kadar disk alanı kullandığını görmek ve kullanılmayan veriyi temizlemek için sistem komutlarını kullanın.
Nasıl yapılacağını bilmiyor musunuz?
Disk kullanımı Linux işletim sistemiyle aynı komutu kullanıyor:
docker system dfKaç imaj saklandığını, ne kadar disk kullandıklarını ve ne kadarının geri kazanılabileceğini göreceksiniz. Reclaimable imajlar hiçbir container tarafından kullanılmayanlar — hepsini kaldırmak istemezsiniz, çünkü bir sonraki container çalıştırmanızda imajı yeniden çekmeniz gerekir.
Ama kullanılmayan alanı güvenle temizleyebilirsiniz; bu, hiçbir imaj tarafından referans edilmeyen katmanları siliyor (bunlara dangling deniyor):
docker system prune -fÇok imaj derliyorsanız sisteminizi düzenli olarak temizlemek isteyeceksiniz. Build sunucularını temizleyen zamanlanmış bir job da iyi fikir — aktif bir sunucunun diski Docker imaj katmanlarıyla ne kadar hızlı dolduracağına şaşıracaksınız.
Lab
Altın imajımızı kullanması gereken bir Java uygulamamız daha var ve birkaç başka sorunu da bulunuyor:
- app-3/Dockerfile — imaj build için Maven
kullanıyor; onun için altın imajımız yok ama son uygulama imajında kullanılmıyor, dolayısıyla olduğu gibi kalabilir. Çalışma ortamı imajı ise kütüphanemizden değil, yine resmi bir Java varyantı.
- app-3/pom.xml — Maven'da POM dosyası uygulamanın
kullandığı tüm bağımlılıkları listeliyor. Ama mevcut kurulum kütüphanelerin en güncel sürümlerini açıkça kullanmıyor, dolayısıyla tam bir denetim izimiz yok.
Bu kurulum size çalışan bir imaj veriyor, ama kaynak kontrolünden hangi kütüphane sürümlerinin kurulu olduğunu anlayamıyorsunuz:
docker build -t app-3:v1 labs/golden-images/apps/app-3Hedefiniz bu dosyaları, çalışma ortamı için altın JRE imajını ve kütüphanelerin en güncel sürümlerini — micrometer ve JAR eklentisi — kullanacak şekilde düzeltmek.
Takıldınız mı? İpuçlarına bakın veya çözümü inceleyin.
Temizlik
Bu lab'ın container'larını kaldırın:
docker compose -f labs/golden-images/apps/docker-compose.yml down
docker compose -f ./labs/golden-images/library/docker-compose.yml down
docker compose -f labs/golden-images/apps/docker-compose-v2.yml downBu komut yalnızca bu lab'in baslattigi container'lari kaldırır. Tamamen temiz bir başlangıç istiyorsanız
docker psile hâlâ çalışan varsa görebilirsiniz.