Container İmajları Derlemek
Bu sayfada
Container İmajları Derlemek
İmaj, container'ların çalıştığı pakettir. Uygulamanızın her bileşeni için bir imaj derleyeceksiniz; imajın içinde tüm ön koşullar kurulu ve yapılandırılmış halde, çalışmaya hazır gelir.
İmajı, container'ın dosya sistemi artı container başlarken Docker'ın hangi komutu çalıştıracağını söyleyen bir miktar metadata olarak düşünebilirsiniz.
Kaynaklar
Komut satırına genel bakış
İmajlarla çalışmak için image komutlarını kullanıyorsunuz. Derleme komutunun
kısayolları da var:
docker image --help
docker build --help
docker history --helpTemel imajlar
İmajlar bir hiyerarşi halinde derlenebilir: belirli bir Linux dağıtımını kuran bir işletim sistemi imajıyla başlayıp, onun üzerine uygulama çalışma ortamınızı ekleyebilirsiniz.
İmaj derlemeye başlamadan önce derleme çıktısını ayrıntılı hale getirelim; böylece her Dockerfile komutunu çalışırken göreceksiniz:
# macOS veya Linux'ta:
export BUILDKIT_PROGRESS=plain
# VEYA PowerShell ile:
$env:BUILDKIT_PROGRESS='plain'BuildKit Docker'ın derleme motoru ve Docker 23'ten beri varsayılan. Varsayılan ayarda çıktıyı derli toplu bir özete sıkıştırıyor, bu da komutları tek tek görmenizi engelliyor.
BUILDKIT_PROGRESS=plainher adımı yazdırır — Dockerfile sözdizimini öğrenirken istediğiniz şey budur.
Çok basit bir temel imaj derleyeceğiz:
docker build -t courselabs/base ./labs/images/base-tveya--tagimaja bir isim verir- derleme komutunu Dockerfile'ın bulunduğu klasörün yoluyla bitirirsiniz
📋 Sahip olduğunuz tüm imajları listeleyin, sonra 'courselabs' ile başlayanları filtreleyin.
Nasıl yapılacağını bilmiyor musunuz?
# tum yerel imajlari listele:
docker image ls
# ve courselabs imajlarini filtrele:
docker image ls 'courselabs/*'Bunlar yerel Docker motorunuzun önbelleğinde duran imajlar.
Yeni temel imaj, resmi Ubuntu imajının üzerine hiçbir şey eklemiyor. O imaj da çok farklı sürümlerde yayınlanıyor.
📋 Ana Ubuntu imajını çekin, ardından Ubuntu 24.04 sürümünün imajını çekin.
Nasıl yapılacağını bilmiyor musunuz?
docker pull ubuntu
# imaj surumleri etiket adinda belirtilir:
docker pull ubuntu:24.04Tüm Ubuntu imajlarınızı ve kendi temel imajınızı listeleyin:
docker image ls --filter reference=ubuntu --filter reference=courselabs/baseID'lere bakın — üçü de farklı.
ubuntu:24.04gerçekten farklı bir imaj: başka bir Ubuntu sürümü. İnce olancourselabs/base. Dockerfile'ıubuntu:26.04üzerine hiçbir şey eklemiyor (latestşu an onu gösteriyor), ama BuildKit her derlemede yeni bir imaj dışa aktardığı için sonuç kendi ID'sini alıyor.Yine de içerik birebir aynı — katmanları karşılaştırın:
docker image inspect courselabs/base --format '{{.RootFS.Layers}}' docker image inspect ubuntu --format '{{.RootFS.Layers}}'Katman ID'leri aynı, imaj ID'si farklı. Ders iki katmanlı: imajlar katman paylaşır ve sürüm pinlemek önemlidir, çünkü
latestkayar, sürüm etiketi kaymaz.
Komutlar ve entrypoint'ler
Dockerfile sözdizimini öğrenmek kolay:
- her imaj başka bir imajdan,
FROMile başlamak zorunda - derlemenin parçası olarak komut çalıştırmak için
RUNkullanırsınız CMDise container başladığında çalışacak komutu belirler
curl aracını kuran basit bir örnek:
📋 labs/images/curl Dockerfile'ından courselabs/curl adında bir imaj
derleyin.
Nasıl yapılacağını bilmiyor musunuz?
docker build -t courselabs/curl ./labs/images/curlArtık bu imajdan bir container çalıştırabilirsiniz ama beklediğiniz gibi davranmayabilir:
# sadece curl'u calistirir:
docker run courselabs/curl
# URL'i curl'a GECIRMEZ:
docker run courselabs/curl docker.courselabs.co
# curl'u kullanmak icin curl komutunu da yazmak gerekiyor:
docker run courselabs/curl curl --head docker.courselabs.co
CMDkomutu container'ın çalıştıracağı komutu tam olarak belirler. Container komutuna seçenek geçiremezsiniz — ama komutu tamamen değiştirebilirsiniz.
Güncellenmiş şu Dockerfile daha kullanışlı bir imaj üretiyor:
Bu Dockerfile'dan bir v2 imajı derleyin:
docker build -t courselabs/curl:v2 -f labs/images/curl/Dockerfile.v2 labs/images/curl-fbayrağı Dockerfile adını belirtir; standart adı kullanmıyorsanızgerekiyor
Bu imajdan container'ları daha mantıklı bir sözdizimiyle çalıştırabilirsiniz:
docker run courselabs/curl:v2 --head docker.courselabs.coContainer komutundaki
--headargümanı ve URL, entrypoint'e geçiriliyor
📋 Boyutları karşılaştırmak için tüm courselabs/curl imajlarını listeleyin.
Nasıl yapılacağını bilmiyor musunuz?
docker image ls courselabs/curlv2 imajı daha küçük — yani dosya sisteminde daha az şey var ve saldırı yüzeyi daha küçük.
İmaj hiyerarşisi
FROM imajı olarak genellikle işletim sistemi imajları kullanılmaz.
Uygulamanızın ön koşullarının mümkün olduğunca fazlasının zaten kurulmuş
olmasını istersiniz.
Resmi imajları kullanmalısınız; bunlar proje ekiplerinin baktığı uygulama ve çalışma ortamı imajlarıdır.
Şu Dockerfile, resmi Nginx imajının üzerine birkaç özel HTML içeriği paketliyor:
docker build -t courselabs/web ./labs/images/web --pull
pullargümanı Docker'a, derlemeye başlamadan önce FROM imajının en güncel sürümünü indirmesini söyler.
- klasör yoluna context (bağlam) denir; içinde Dockerfile ve onun atıf
yaptığı dosyalar bulunur — bu örnekte
index.htmldosyası
📋 Yeni imajınızdan, 80 portunu yayınlayarak bir container çalıştırın ve tarayıcıdan açın.
Nasıl yapılacağını bilmiyor musunuz?
# bos olan herhangi bir yerel portu kullanin, ornegin 8090:
docker run -d -p 8090:80 courselabs/web
curl localhost:8090Container, resmi imajda yapılandırılmış Nginx kurulumunu kullanarak sizin HTML dökümanınızı sunuyor
Docker imajları katmanlardan oluşur. İmaj mantıksal olarak tek bir pakettir ama fiziksel olarak katman adı verilen çok sayıda küçük dosya halinde saklanır.
Katmanlar salt okunurdur ve imajlar arasında paylaşılabilirler — imajlarınızı doğru derlerseniz disk alanını ve ağ bant genişliğini çok verimli kullanırsınız.
Web imajınızı inceleyin; çıktının sonunda katman ID'lerini göreceksiniz:
docker inspect courselabs/web📋 Web imajınızın temel aldığı imajı inceleyin. Paylaştıkları katman var mı? O imajın temel aldığı imaj nasıl?
Nasıl yapılacağını bilmiyor musunuz?
Temel imaj, Alpine üzerinde çalışan Nginx:
docker pull nginx:1.31.7-alpine
docker inspect nginx:1.31.7-alpineAlpine'ı da kontrol edebilirsiniz:
docker pull alpine:3.24
docker inspect alpine:3.24Paylaşılan katmanların tamamını görebiliyorsunuz — web imajı Nginx katmanlarının üzerine, Nginx imajı da Alpine katmanlarının üzerine derleniyor.
İmaj hiyerarşisinin tamamı şöyle:
alpine:3.24
└─ nginx:1.31.7-alpine
└─ courselabs/web Bazı imajlar tüm zinciri etiketinde taşır — örneğin
golang:1.17.3-alpine3.15. Nginx etiketi Alpine işletim sistemi sürümünü
içermiyor, dolayısıyla onu deneme yanılma ile bulmanız gerekiyor (ya da imaj
derlendiğinde hangi işletim sistemi sürümünün güncel olduğunu bilmeniz).
Lab
Sıra Dockerfile yazmada sizde.
Bu klasörde basit bir Java uygulaması var ve zaten
labs/images/java/HelloWorld.class dosyasına derlenmiş durumda.
Bu uygulamayı paketleyen bir Docker imajı derleyin ve çalıştığını doğrulamak
için bir container başlatın. Container'ınızın çalıştırması gereken komut
java HelloWorld.
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 rm -f $(docker ps -aq)PowerShell'de komut ikamesi sözdizimi farklı:
docker rm -f @(docker ps -aq)⚠️ Her iki sürüm de makinenizdeki tüm container'ları kaldırır, yalnızca bu lab'ın container'larını değil. Başka bir işiniz çalışıyorsa önce
docker psile kontrol edin.