labs

Bu lab modernize edildi ama ucтan uca dogrulanmadi. Takilirsaniz bize bildirin.

Registry Üzerindeki İmajlara Erişmek

30 dkdockerGitHub'da gor
Bu sayfada

Registry Üzerindeki İmajlara Erişmek

Registry, Docker imajlarını saklayan sunucudur. En popüleri Docker Hub ama registry API'si standart; kendi registry'nizi bulutta veya yerelde özel imaj deponuz olarak çalıştırabilirsiniz.

Kurumlar kendi registry'lerini çalıştırıyor: build pipeline'ından çıkan sürümleri uzun vadeli saklamak için, ya da imajları üretim ortamıyla aynı ağ bölgesinde erişilebilir kılmak için.

Kaynaklar

Komut satırına genel bakış

Registry'lerle çalışmak için de image komutlarını kullanıyorsunuz. En popüler komutların kısayolları var:

docker image --help

docker pull --help

docker push --help

docker tag --help

İmaj göndermek

Derlediğiniz imajlar yalnızca sizin makinenizde saklanır.

İmajları paylaşmak için onları bir registry'ye göndermeniz gerekiyor — Docker Hub gibi. Docker Hub'da imaj adının kullanıcı adınızı içermesi gerekir; Docker Hub sahipliği bununla belirliyor.

Docker Hub'a kayıt olduğunuzdan emin olun. Sonra Docker ID'nizi bir değişkene kaydedin, sonraki komutlarda kullanacağız:

# Linux veya macOS'ta:
dockerId='<docker-hub-kullanici-adiniz>'

# VEYA PowerShell ile:
$dockerId='<docker-hub-kullanici-adiniz>'

Bu, e-posta adresiniz değil, Hub kullanıcı adınız. Benim kendi kullandığım: $dockerId='sixeyed'

Artık adında Docker ID'niz bulunan bir imaj derleyebilirsiniz:

docker build -t ${dockerId}/curl:26.10 -f labs/images/curl/Dockerfile.v2 labs/images/curl

docker image ls '*/curl'

📋 Şimdi kendi curl:26.10 imajınızı Docker Hub'a gönderin.

Nasıl yapılacağını bilmiyor musunuz?
# henuz giris yapmadiysaniz:
docker login -u ${dockerId}

# imajinizi gonderin:
docker push ${dockerId}/curl:26.10

Docker Hub imajları herkese açıktır (özel imaj da oluşturabilirsiniz). Şu komutu çalıştırıp imajınızı Docker Hub'da açın:

echo "https://hub.docker.com/r/${dockerId}/curl/tags"

Etiketler ve referanslar

İmaj adları (doğru adıyla referans) üç parçadan oluşur:

  • container registry'nin alan adı
  • repository adı — uygulamayı ve sahibini belirtir
  • etiket (tag) — herhangi bir şey olabilir ama genellikle sürümleme için

    kullanılır

Tek bir imajın birden fazla referansı olabilir; bunlar takma ad gibidir — imajın kopyası değil, aynı imajın farklı adlarıdır.

Etiketler tipik olarak sürümleme için kullanılır; yani sixeyed/curl:26.09 ve sixeyed/curl:26.10 için aynı sahibin yayınladığı aynı uygulamanın farklı sürümleri diyebilirsiniz.

tag komutuyla imajınıza yeni bir referans ekleyin:

docker tag ${dockerId}/curl:26.10 ${dockerId}/curl:26.11

docker image ls '*/curl'

Artık bir sürü curl imajınız var ama tüm takma adların imaj ID'si aynı

📋 Tüm curl imaj etiketlerinizi Docker Hub'a gönderin.

Nasıl yapılacağını bilmiyor musunuz?
# etiketleri tek tek gonderebilirsiniz:
docker push ${dockerId}/curl:26.11

# ya da repository'nin tum yerel etiketlerini:
docker push --all-tags ${dockerId}/curl

Bol miktarda Layer already exists çıktısı göreceksiniz — registry'ler de Docker motoruyla aynı katman önbellekleme yaklaşımını kullanıyor.

Yerel registry çalıştırmak

Gerçek uygulamaların Docker imajları büyük olabilir — yüzlerce megabayt, hatta gigabaytlar. Büyük imajları indirmek container'ların başlama süresine ekleniyor, bu yüzden kurumlar genellikle kendi registry'lerini bulutta veya veri merkezinde çalıştırıyor.

Tüm registry'ler aynı şekilde çalışır, dolayısıyla neredeyse birbirinin yerine geçebilirler. Azure veya AWS üzerinde çalışıyorsanız Azure Container Registry ya da Amazon Elastic Container Registry kullanırdınız.

Yerel ortamda, resmi Docker Registry imajını kullanarak container içinde kendi registry'nizi barındırabilirsiniz:

docker run -d -p 5000:5000 --name registry registry:3.1.2

docker logs registry

Yerel registry alan adınız localhost:5000; yerelde push ve pull yapmak için bunu imaj referanslarına dahil edebilirsiniz.

Tam imaj referans biçimi şöyle:

  • [registry-alan-adi]/[repository-adi]:[etiket]

📋 Alpine imajını etiketleyip yerel registry'nize gönderin.

Nasıl yapılacağını bilmiyor musunuz?
# tag komutu bir takma ad olusturur, bu ad registry alan adini icerebilir:
docker tag alpine localhost:5000/alpine

# referansta alan adi olmasi, Docker'a hangi registry'yi kullanacagini soyler:
docker push localhost:5000/alpine

Docker Desktop localhost registry'lerine izin verecek şekilde yapılandırılmış, ama her Docker kurulumunda bu yok. Push sırasında hata alırsanız güvensiz registry'lere izin vermeniz gerekiyor.

Açık kaynak registry'nin Docker Hub gibi bir web arayüzü yok ama REST API ile çalışabilirsiniz:

curl --head localhost:5000/v2/

curl localhost:5000/v2/alpine/tags/list

Her imajın bir etiketi vardır — siz vermezseniz Docker varsayılanı kullanır.

Yerel imajınızı kaldırıp registry'den yeniden çekebilirsiniz:

docker image rm localhost:5000/alpine

docker pull localhost:5000/alpine

📋 Alpine imajı için birkaç etiket daha oluşturup gönderin — registry'de mevcut olduklarını kontrol edin.

Nasıl yapılacağını bilmiyor musunuz?
# imaj etiketinde herhangi bir metin kullanabilirsiniz:
docker tag alpine localhost:5000/alpine:26.11

docker tag alpine localhost:5000/alpine:local

docker push --all-tags localhost:5000/alpine

curl localhost:5000/v2/alpine/tags/list

Varsayılan etiketi ve yeni etiketlerinizi görmelisiniz.

Lab

İmaj referansları, Docker'ın registry'yi bulmasına ve uygulamanın belirli bir sürümünü tanımlamasına yetecek kadar bilgi taşır.

Docker, registry ve etiket için varsayılan değerler kullanıyor. Bu varsayılanlar neler? kiamol/ch05-pi imajının tam referansı nedir?

Resmi imajların tamamı Docker Hub'da değil. Microsoft, mcr.microsoft.com adresinde kendi imaj registry'si olan MCR'yi kullanıyor. MCR'den dotnet/runtime imajının 10.0 sürümünü çekmek için hangi komutu kullanırdınız?

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 ps ile kontrol edin.