← Kursa Dön
📄 Text · 35 min

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 python

Image İ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.1

Bu 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      # MySQL

Verified 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 Succeeded

Giriş 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-stdin

Bu 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-alpine

Docker 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:v1

GitHub 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 myregistry

Kendi 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:2

Image 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.1

Trivy (Açık Kaynak)

docker run --rm \
    -v /var/run/docker.sock:/var/run/docker.sock \
    aquasec/trivy image --severity CRITICAL,HIGH nginx:1.25

Production'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/list

Bu 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 pass

CI/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:2 image'ı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.