Bir Docker imajı build ettikten sonra onu başka bir makinede (bir sunucuda, bir meslektaşınızın bilgisayarında, bir CI/CD sisteminde) kullanmak istediğinizde, imajı bir yerden bir yere elle taşımak yerine bir registry‘e gönderip oradan çekersiniz. Docker Hub bu işin en yaygın kullanılan halka açık registry’sidir, ama kurumsal projelerde genellikle private (özel) bir registry de devreye girer.
Registry nedir?
Registry, Docker imajlarını depolayan ve dağıtan bir sunucudur — imajlar için bir GitHub gibi düşünebilirsiniz. Her imaj bir veya birden fazla etiketle (tag) tanımlanır ve registry/repo:etiket formatında adreslenir:
docker.io/library/nginx:1.27 # Docker Hub'daki resmi nginx imajı
ghcr.io/kullanici-adi/api:2.4 # GitHub Container Registry'deki özel imaj
docker.io/kullanici-adi/api:latest # Kendi Docker Hub hesabınızdaki imaj
Registry adı belirtilmezse Docker varsayılan olarak Docker Hub’ı (docker.io) kullanır — docker pull nginx demek, aslında docker.io/library/nginx:latest demektir.
Docker Hub’a giriş yapmak ve imaj göndermek (push)
# Docker Hub hesabınızla giriş yapın
docker login
# Yerel imajınızı, Docker Hub kullanıcı adınızla eşleşecek
# şekilde yeniden etiketleyin
docker tag benim-api:1.0 kullanici-adi/benim-api:1.0
# Registry'e gönderin
docker push kullanici-adi/benim-api:1.0
Kritik nokta: bir imajı push etmeden önce, imaj adının registry kullanıcı adınızla başlaması gerekir. docker tag yeni bir imaj kopyalamaz — aynı imaja ikinci bir isim/etiket ekler, disk alanı ekstra kullanmaz.
Bir imajı çekmek (pull)
docker pull kullanici-adi/benim-api:1.0
docker run -d kullanici-adi/benim-api:1.0
Etiketleri anlamlı kullanın: :latest yerine :1.0, :2024-06-01 veya bir Git commit hash’i gibi sabit, izlenebilir etiketler tercih edin. Böylece hangi sürümün production’da çalıştığını her zaman kesin olarak bilirsiniz.
Neden private (özel) bir registry?
Ticari projelerde imajlarınızı herkese açık Docker Hub’a göndermek genellikle istenmez — kodunuz ve yapılandırmanız imajın katmanlarında gizlidir. Bu durumda seçenekleriniz:
- Docker Hub private repo: Aynı Docker Hub’da, sadece yetkili kullanıcıların erişebildiği özel depolar (ücretli planlarda sınırsız).
- GitHub Container Registry (ghcr.io): GitHub reponuzla entegre, CI/CD’de (GitHub Actions) token ile otomatik giriş yapılabilen popüler bir seçenek.
- Bulut sağlayıcı registry’leri: AWS ECR, Google Artifact Registry, Azure Container Registry — genellikle o bulutun diğer servisleriyle (Kubernetes, sunucusuz fonksiyonlar) doğrudan entegre çalışır.
- Kendi sunucunuzda self-hosted registry: Docker’ın resmi
registryimajıyla kendi private registry’nizi birkaç dakikada ayağa kaldırabilirsiniz.
Kendi registry’nizi çalıştırmak
# Basit, self-hosted bir registry başlat
docker run -d -p 5000:5000 --name kayit-defteri registry:2
# İmajı bu özel registry'ye push et
docker tag benim-api:1.0 localhost:5000/benim-api:1.0
docker push localhost:5000/benim-api:1.0
# Başka bir makineden çekmek için host adresini kullan
docker pull sunucu-ip:5000/benim-api:1.0
GitHub Actions ile otomatik push örneği
CI/CD pipeline’ınızda her main dalına yapılan push sonrası imajı otomatik build edip registry’e göndermek çok yaygın bir desendir:
- name: Docker Hub'a giriş yap
run: echo "${{ secrets.DOCKERHUB_TOKEN }}" | docker login -u kullanici-adi --password-stdin
- name: İmajı build et ve gönder
run: |
docker build -t kullanici-adi/benim-api:${{ github.sha }} .
docker push kullanici-adi/benim-api:${{ github.sha }}
Bu akışı bir sonraki, CI/CD odaklı yazımızda uçtan uca bir GitHub Actions pipeline’ı üzerinden daha detaylı inceliyoruz.
İmajlarınızı artık build edip, kalıcı veriyle çalıştırıp, birbirleriyle konuşturup, bir registry üzerinden paylaşabiliyorsunuz — Docker’ın temel iş akışının tamamını tamamladınız. Sıradaki bölümde bu bilgileri gerçek bir production ortamına, CI/CD’den izlemeye kadar taşıyoruz.