Docker Hub ve Registry Kullanımı
Önceki iki derste image'ların ne olduğunu ve nasıl yönetileceğini öğrendik. Peki bu image'lar nerede saklanıyor? Nereden geliyorlar? Nasıl paylaşılıyorlar? İşte bu derste Docker Hub ve registry dünyasına dalacağız.
Bir kütüphane düşün. Evinde birkaç kitap var — bunlar senin local image'ların. Ama dünyanın en büyük kütüphanesine de üyeliğin var: istediğin kitabı ödünç alabilirsin (pull), kendi yazdığın kitabı da oraya koyabilirsin (push). Hatta istersen özel bir kütüphane kurabilirsin — sadece senin ekibinin erişebildiği (private registry).
Docker Hub, Docker dünyasının bu büyük kütüphanesi. Ama tek seçenek değil. Bu derste Docker Hub'ı, alternatif registry'leri ve hatta kendi registry'ni kurmayı öğreneceğiz.
Docker Hub Nedir?
Docker Hub (hub.docker.com), Docker'ın resmi image registry'si. Dünyanın en büyük container image deposu. 100.000'den fazla hazır image barındırıyor ve her gün milyonlarca geliştirici tarafından kullanılıyor.
docker pull nginx yazdığında aslında Docker Hub'dan çekiyorsun. docker run postgres:16 yazdığında, image yerelde yoksa yine Docker Hub'a gidiyor.
Docker Hub'da Image Aramak
docker search nginx
# NAME DESCRIPTION STARS OFFICIAL
# nginx Official build of Nginx 19000 [OK]
# bitnami/nginx Bitnami nginx Docker Image 180
# nginxinc/nginx-unpri Unprivileged Nginx 120
# Sadece resmi image'lar
docker search --filter is-official=true nginx
# 100'den fazla yıldızı olanlar
docker search --filter stars=100 pythonImage İsimlendirme Anatomisi
Docker image isimlerinin bir yapısı var ve bunu anlamak çok önemli:
[registry/][namespace/]repository[:tag]Bunu örneklerle parçalayalım:
# 1. Official image — en kısa hali
nginx:1.25
# Registry: docker.io (yazılmaz, varsayılan)
# Namespace: library (official, yazılmaz)
# Repository: nginx
# Tag: 1.25
# 2. Kullanıcı image'ı
tolgahan/myapp:v1.0
# Registry: docker.io (varsayılan)
# Namespace: tolgahan (kullanıcı adı)
# Repository: myapp
# Tag: v1.0
# 3. GitHub Container Registry
ghcr.io/tolgahan/myapp:v1.0
# Registry: ghcr.io
# Namespace: tolgahan
# Repository: myapp
# Tag: v1.0
# 4. Özel registry
registry.mycompany.com:5000/backend/api:v2.3.1
# Registry: registry.mycompany.com:5000
# Namespace: backend
# Repository: api
# Tag: v2.3.1Bu yapıyı anlamak önemli çünkü pull ve push yaparken doğru formatta yazmak gerekiyor.
Official Images — Güvenilir Kaynaklar
Docker Hub'da "Official Image" rozeti taşıyan image'lar, Docker tarafından doğrulanmış ve bakımı yapılan image'lar. Bunları her zaman tercih etmelisin.
Official image'ların ne avantajı var? Docker ekibi tarafından güvenlik taramasından geçiyorlar. Düzenli güncelleniyor, CVE fix'leri hızla uygulanıyor. Best practice'lere uygun Dockerfile'lar kullanılıyor. Detaylı dokümantasyonu var. Ve multi-platform desteği var (amd64, arm64).
# Popüler official image'lar
docker pull nginx # Web sunucusu
docker pull postgres:16 # PostgreSQL
docker pull redis:7 # Cache
docker pull node:20 # Node.js
docker pull python:3.12 # Python
docker pull alpine:3.19 # Minimal Linux (~7MB)
docker pull ubuntu:22.04 # Ubuntu
docker pull mysql:8 # MySQLVerified Publisher image'ları da var — bunlar Docker tarafından doğrulanmış şirketlerin image'ları (Bitnami, Datadog, Elastic gibi). Official kadar güvenilir olmasa da, rastgele birinin yüklediği image'lardan çok daha güvenli.
Docker Hub'a Giriş ve Push
Giriş Yapma
docker login
# Username: tolgahan
# Password: ********
# Login SucceededGiriş bilgilerin ~/.docker/config.json dosyasında saklanır. ⚠️ Bu dosya şifrenizi base64 ile saklar — şifrelenmemiş! CI/CD'de Access Token kullanmak çok daha güvenli.
Token ile Giriş (CI/CD İçin Önerilen)
Docker Hub'da Account Settings → Security → New Access Token ile token oluşturabilirsin:
echo $DOCKER_TOKEN | docker login --username tolgahan --password-stdinBu yöntem şifreyi komut satırına yazmaktan çok daha güvenli.
Image Push Etme
# 1. Image'ı build et
docker build -t myapp:v1.0 .
# 2. Docker Hub formatında tag'le
docker tag myapp:v1.0 tolgahan/myapp:v1.0
# 3. Push et
docker push tolgahan/myapp:v1.0İlk push yavaş olabilir ama sonraki push'lar çok hızlı — katmanlar paylaşımlı, sadece değişenler gönderilir.
Private Repository — Hassas Image'lar
Bazı image'ları herkese açık istemezsin — şirket kodu, internal araçlar, vb. Docker Hub'da private repository oluşturabilirsin:
# hub.docker.com → Create Repository → Visibility: Private
# Private repo'ya push (giriş gerekir)
docker push tolgahan/private-app:v1
# Pull (giriş yapmayan biri çekemez)
docker pull tolgahan/private-app:v1
# Error: pull access denied (giriş yapmadan)Ücretsiz Docker Hub hesabında 1 private repository hakkın var. Pro ve Team planlarında sınırsız.
Pull Rate Limiting — Dikkat Et!
Docker Hub, pull sayısını sınırlıyor:
Anonim: 100 pull / 6 saat (IP bazlı)
Giriş yapmış: 200 pull / 6 saat (hesap bazlı)
Pro/Team: 5000 pull / gün
CI/CD pipeline'ında anonim pull yapıyorsan, bu limite çok hızlı ulaşabilirsin. Çözümler:
# 1. Docker Hub'a giriş yap (limiti 200'e çıkarır)
docker login
# 2. Registry mirror kullan
# /etc/docker/daemon.json
{
"registry-mirrors": ["https://mirror.gcr.io"]
}
# 3. Sık kullanılan image'ları kendi registry'ne kopyala
docker pull nginx:1.25-alpine
docker tag nginx:1.25-alpine registry.mycompany.com/mirror/nginx:1.25-alpine
docker push registry.mycompany.com/mirror/nginx:1.25-alpineDocker Hub Alternatifleri
Docker Hub tek seçenek değil. İşte en popüler alternatifler:
GitHub Container Registry (GHCR)
GitHub ekosistemini kullanıyorsan, GHCR doğal bir seçim:
echo $GITHUB_TOKEN | docker login ghcr.io -u USERNAME --password-stdin
docker tag myapp:v1 ghcr.io/tolgahan/myapp:v1
docker push ghcr.io/tolgahan/myapp:v1GitHub repo'sunla entegre, GitHub Actions ile kolay CI/CD, ücretsiz planda cömert limitler.
AWS ECR, Google Artifact Registry, Azure ACR
Bulut sağlayıcıların kendi registry'leri var. Eğer zaten o bulut platformunu kullanıyorsan, entegrasyon avantajı büyük:
# AWS ECR
aws ecr get-login-password --region eu-west-1 | \
docker login --username AWS --password-stdin 123456789.dkr.ecr.eu-west-1.amazonaws.com
# Google Artifact Registry
gcloud auth configure-docker europe-west1-docker.pkg.dev
# Azure ACR
az acr login --name myregistryKendi Registry'ni Kur
Docker, resmi bir registry image'ı sunuyor. Kendi özel registry'ni birkaç dakikada kurabilirsin:
# Basit registry başlat
docker run -d \
--name registry \
-p 5000:5000 \
-v registry-data:/var/lib/registry \
--restart=unless-stopped \
registry:2
# Image'ı tag'le ve push et
docker tag myapp:v1 localhost:5000/myapp:v1
docker push localhost:5000/myapp:v1
# Registry'deki image'ları listele
curl http://localhost:5000/v2/_catalog
# {"repositories":["myapp"]}Bu basit kurulum test ve geliştirme için harika. Ama production'da TLS (HTTPS) ve authentication eklemen gerekir:
# TLS sertifikası oluştur
mkdir -p /opt/registry/{certs,auth,data}
openssl req -newkey rsa:4096 -nodes -sha256 \
-keyout /opt/registry/certs/domain.key \
-x509 -days 365 \
-out /opt/registry/certs/domain.crt \
-subj "/CN=registry.mycompany.com"
# Kullanıcı oluştur
docker run --rm --entrypoint htpasswd \
httpd:2 -Bbn admin secretpassword \
> /opt/registry/auth/htpasswd
# Production-ready registry başlat
docker run -d \
--name registry \
--restart=unless-stopped \
-p 443:443 \
-v /opt/registry/data:/var/lib/registry \
-v /opt/registry/certs:/certs \
-v /opt/registry/auth:/auth \
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
-e REGISTRY_AUTH=htpasswd \
-e REGISTRY_AUTH_HTPASSWD_REALM="My Registry" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
registry:2Image Güvenlik Taraması
Image'ları push etmeden önce güvenlik taraması yapmak çok önemli. Bilinen güvenlik açıklarını (CVE) tespit edebilirsin:
Docker Scout
docker scout cves nginx:1.25
# ✗ HIGH CVE-2024-1234 openssl 3.0.2
# ✗ MEDIUM CVE-2024-5678 curl 7.88.1Trivy (Açık Kaynak)
docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
aquasec/trivy image --severity CRITICAL,HIGH nginx:1.25Production'a göndermeden önce en azından CRITICAL seviye açıkları kontrol et.
CI/CD ile Otomatik Build ve Push
GitHub Actions ile her git push'ta otomatik image build ve push yapabilirsin:
# .github/workflows/docker-publish.yml
name: Docker Build and Push
on:
push:
branches: [main]
tags: ['v*']
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: |
tolgahan/myapp:latest
tolgahan/myapp:${{ github.sha }}Yaygın Hatalar ve Çözümleri
"toomanyrequests: You have reached your pull rate limit"
Pull limiti aşılmış. Çözüm: docker login ile giriş yap veya mirror kullan.
"Get https://registry:5000/v2/: http: server gave HTTP response to HTTPS client"
Kendi registry'ne HTTPS olmadan push etmeye çalışıyorsun. Test için insecure registry tanımlayabilirsin:
// /etc/docker/daemon.json
{
"insecure-registries": ["registry.mycompany.com:5000"]
}Ama production'da doğru çözüm TLS sertifikası kurmak.
"unauthorized: authentication required"
Registry'ye giriş yapmamışsın veya token süresi dolmuş. docker login ile tekrar giriş yap.
Docker Hub Webhook'ları
Docker Hub'a image push edildiğinde otomatik aksiyon tetikleyebilirsin. Mesela: image push'landığında sunucuda otomatik deploy yap, Slack'e bildirim gönder, CDN cache'ini temizle.
hub.docker.com → Repository → Webhooks → Create Webhook ile bir URL tanımlarsın. Docker Hub, her push'ta bu URL'ye POST request gönderir:
{
"push_data": {
"tag": "v1.0",
"pushed_at": 1705312200
},
"repository": {
"repo_name": "tolgahan/myapp",
"repo_url": "https://hub.docker.com/r/tolgahan/myapp"
}
}Sunucunda bu webhook'u dinleyen basit bir script ile "push geldi → deploy yap" otomasyonu kurabilirsin.
Registry API — Programatik Erişim
Docker Registry, HTTP API sunar. Sadece CLI değil, programatik olarak da erişebilirsin:
# Docker Hub'daki tag'leri listele
curl -s "https://hub.docker.com/v2/repositories/library/nginx/tags/?page_size=5" | jq '.results[].name'
# "latest"
# "1.25"
# "1.25-alpine"
# Repository bilgisi (yıldız sayısı, pull sayısı)
curl -s "https://hub.docker.com/v2/repositories/library/nginx/" | jq '{stars: .star_count, pulls: .pull_count}'
# Özel registry'deki tüm repository'ler
curl http://localhost:5000/v2/_catalog
# Özel registry'deki tag'ler
curl http://localhost:5000/v2/myapp/tags/listBu API'yi CI/CD scriptlerinde, monitoring araçlarında veya kendi otomasyon çözümlerinde kullanabilirsin.
Gerçek Dünya Senaryosu: Multi-Registry Pipeline
Büyük organizasyonlarda image'lar birden fazla registry'ye push edilir — yedeklilik ve farklı ortamlara yakınlık için. İşte tipik bir CI/CD pipeline'ı:
#!/bin/bash
# deploy.sh — Build, tag, push to multiple registries
APP_NAME="myapp"
VERSION=$(git describe --tags --always)
COMMIT=$(git rev-parse --short HEAD)
echo "Building ${APP_NAME}:${VERSION}..."
docker build -t ${APP_NAME}:${VERSION} \
-t ${APP_NAME}:${COMMIT} \
-t ${APP_NAME}:latest .
# Docker Hub'a push
echo "Pushing to Docker Hub..."
for TAG in ${VERSION} ${COMMIT} latest; do
docker tag ${APP_NAME}:${TAG} tolgahan/${APP_NAME}:${TAG}
docker push tolgahan/${APP_NAME}:${TAG}
done
# GHCR'a push (yedek)
echo "Pushing to GHCR..."
for TAG in ${VERSION} ${COMMIT} latest; do
docker tag ${APP_NAME}:${TAG} ghcr.io/tolgahan/${APP_NAME}:${TAG}
docker push ghcr.io/tolgahan/${APP_NAME}:${TAG}
done
echo "Done! Pushed ${APP_NAME}:${VERSION} to 2 registries."Neden birden fazla registry? Docker Hub çökerse (oluyor!) GHCR'dan çekebilirsin. Farklı bölgelerdeki ekipler farklı registry'leri kullanabilir. Ve bazı müşteriler belirli bir cloud vendor'ın registry'sini tercih edebilir.
Registry Karşılaştırması
Hangi registry'yi seçeceğin, kullanım senaryona bağlı. İşte hızlı bir karşılaştırma:
Docker Hub — En yaygın, en büyük topluluk, official image'lar burada. Ama pull rate limit var ve ücretsiz planda private repo sınırlı.
GitHub Container Registry (GHCR) — GitHub ekosistemiyle harika entegrasyon. GitHub Actions ile CI/CD çok kolay. Ücretsiz planda cömert limitler.
AWS ECR — AWS kullanıyorsan doğal seçim. ECS, EKS, Lambda ile tam entegrasyon. Image scanning dahili. Lifecycle policy ile eski image'ları otomatik sil.
Google Artifact Registry — GCP kullanıyorsan tercih et. Cloud Build ile entegre. Multi-region desteği.
Azure ACR — Azure ekosistemiyle entegre. Azure DevOps ile CI/CD.
Self-hosted (registry:2) — Tam kontrol. Hassas image'lar için ideal. Ama bakım senin sorumluluğunda.
Genel tavsiyem: başlangıçta Docker Hub yeterli. Büyüdükçe kullandığın cloud platformunun registry'sine geç. Kritik image'lar için birden fazla registry'de yedek tut.
.env Dosyası Güvenliği İpucu
Registry'lere giriş yaparken şifreleri düz metin olarak saklamaktan kaçın:
# ❌ Tehlikeli — şifre shell history'de kalır
docker login --username tolgahan --password mysecretpassword
# ✅ Güvenli — stdin'den oku
echo $DOCKER_TOKEN | docker login --username tolgahan --password-stdin
# ✅✅ En güvenli — credential helper kullan
# macOS: osxkeychain
# Linux: secretservice veya passCI/CD'de secret management kullan (GitHub Secrets, AWS Secrets Manager, HashiCorp Vault) — şifreleri repo'ya veya environment'a düz metin olarak koyma.
Bu Derste Ne Öğrendik?
Docker Hub, Docker'ın resmi ve en büyük image registry'si. Official image'ları her zaman tercih et.
Image isimleri
[registry/][namespace/]repository[:tag]formatında. Bu yapıyı bilmek pull ve push için gerekli.Pull rate limit var — giriş yap, mirror kullan veya image'ları kendi registry'ne kopyala.
Docker Hub dışında GHCR, AWS ECR, Google AR, Azure ACR alternatifleri var. Kullandığın bulut platformuyla uyumlu olanı seç.
Kendi özel registry'ni Docker'ın official
registry:2image'ıyla kurabilirsin. Production'da TLS ve authentication ekle.Image'ları push etmeden önce güvenlik taraması yap (Scout, Trivy).
CI/CD ile her git push'ta otomatik build + push yapabilirsin.
Bir sonraki derste base image seçimi, tag stratejileri ve image boyut optimizasyonunu öğreneceğiz.
AI Asistan
Sorularını yanıtlamaya hazır