Ana içeriğe geç
Kategoriye Dön

Özel Docker Registry Kurulumu: Image Depolama ve Yönetimi

Özel Docker Registry kurulumu, TLS ile güvenli registry, kimlik doğrulama, image push/pull işlemleri, Harbor ile kurumsal registry ve CI/CD entegrasyonu.

Okuma süresi: 14 dk Konteyner & Orkestrasyon
dockerregistryimageharborkonteynerci/cddepolamaözel registry

İçindekiler

Özel Docker Registry Kurulumu

Docker Hub gibi genel registry'ler pratik olsa da, özel image'larınızı barındırmak için kendi registry'nizi kurmak güvenlik, hız ve maliyet açısından avantajlıdır. Bu rehberde basit Docker Registry'den kurumsal Harbor'a kadar farklı seçenekleri ele alacağız.

Neden Özel Registry?

AvantajAçıklama
GüvenlikÖzel image'lar dışarıya açık değil
HızYerel ağda hızlı pull/push
MaliyetDocker Hub rate limit yok
KontrolTam image yaşam döngüsü kontrolü
UyumlulukVeri yerelleştirme gereksinimleri

1. Basit Docker Registry (registry:2)

Temel Kurulum

hljs bash
# Registry konteynerini başlat
docker run -d \
  --name registry \
  --restart always \
  -p 5000:5000 \
  -v registry-data:/var/lib/registry \
  registry:2

# Registry'nin çalıştığını doğrula
curl http://localhost:5000/v2/
# Çıktı: {}

Image Push ve Pull

hljs bash
# Image'ı tag'le
docker tag myapp:latest localhost:5000/myapp:latest

# Registry'ye push et
docker push localhost:5000/myapp:latest

# Registry'den pull et
docker pull localhost:5000/myapp:latest

# Registry'deki image'ları listele
curl http://localhost:5000/v2/_catalog
# Çıktı: {"repositories":["myapp"]}

# Image tag'lerini listele
curl http://localhost:5000/v2/myapp/tags/list

2. TLS ile Güvenli Registry

Self-Signed Sertifika Oluşturma

hljs bash
# Sertifika dizini oluştur
mkdir -p /etc/docker/certs/registry

# Self-signed sertifika oluştur
openssl req -newkey rsa:4096 -nodes -sha256 \
  -keyout /etc/docker/certs/registry/domain.key \
  -x509 -days 365 \
  -out /etc/docker/certs/registry/domain.crt \
  -subj "/CN=registry.example.com" \
  -addext "subjectAltName=DNS:registry.example.com,IP:192.168.1.100"

# Sertifikayı Docker'ın güvendiği sertifikalara ekle
mkdir -p /etc/docker/certs.d/registry.example.com:5000
cp /etc/docker/certs/registry/domain.crt \
   /etc/docker/certs.d/registry.example.com:5000/ca.crt

# Docker'ı yeniden başlat
systemctl restart docker

TLS ile Registry Başlatma

hljs bash
docker run -d \
  --name registry \
  --restart always \
  -p 5000:5000 \
  -v registry-data:/var/lib/registry \
  -v /etc/docker/certs/registry:/certs \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  registry:2

# HTTPS ile test et
curl https://registry.example.com:5000/v2/ \
  --cacert /etc/docker/certs/registry/domain.crt

3. Kimlik Doğrulama ile Registry

hljs bash
# htpasswd dosyası oluştur
mkdir -p /etc/docker/registry/auth
docker run --rm \
  --entrypoint htpasswd \
  httpd:2 -Bbn admin GucluSifre123! > /etc/docker/registry/auth/htpasswd

# Kullanıcı ekle
docker run --rm \
  --entrypoint htpasswd \
  httpd:2 -Bbn developer DevSifre456! >> /etc/docker/registry/auth/htpasswd

# Kimlik doğrulama ile registry başlat
docker run -d \
  --name registry \
  --restart always \
  -p 5000:5000 \
  -v registry-data:/var/lib/registry \
  -v /etc/docker/certs/registry:/certs \
  -v /etc/docker/registry/auth:/auth \
  -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="Registry Realm" \
  -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
  registry:2

# Giriş yap
docker login registry.example.com:5000

4. Docker Compose ile Registry

hljs yaml
# registry-compose.yml
version: '3.8'

services:
  registry:
    image: registry:2
    restart: always
    ports:
      - "5000:5000"
    environment:
      REGISTRY_HTTP_TLS_CERTIFICATE: /certs/domain.crt
      REGISTRY_HTTP_TLS_KEY: /certs/domain.key
      REGISTRY_AUTH: htpasswd
      REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
      REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
      REGISTRY_STORAGE_DELETE_ENABLED: "true"
    volumes:
      - registry-data:/var/lib/registry
      - ./certs:/certs:ro
      - ./auth:/auth:ro

  registry-ui:
    image: joxit/docker-registry-ui:latest
    restart: always
    ports:
      - "8080:80"
    environment:
      - REGISTRY_TITLE=REXE Private Registry
      - REGISTRY_URL=https://registry.example.com:5000
      - SINGLE_REGISTRY=true
    depends_on:
      - registry

volumes:
  registry-data:

5. Harbor — Kurumsal Registry

Harbor, CNCF tarafından desteklenen kurumsal düzeyde bir container registry'dir.

hljs bash
# Harbor installer'ı indir
wget https://github.com/goharbor/harbor/releases/download/v2.9.0/harbor-online-installer-v2.9.0.tgz
tar xzf harbor-online-installer-v2.9.0.tgz
cd harbor

# Yapılandırma dosyasını düzenle
cp harbor.yml.tmpl harbor.yml
nano harbor.yml
hljs yaml
# harbor.yml (temel ayarlar)
hostname: registry.example.com

https:
  port: 443
  certificate: /etc/harbor/certs/domain.crt
  private_key: /etc/harbor/certs/domain.key

harbor_admin_password: GucluSifre123!

database:
  password: DbSifre789!

data_volume: /data/harbor
hljs bash
# Harbor'ı kur
./install.sh

# Harbor'a giriş yap
docker login registry.example.com
# Kullanıcı: admin
# Şifre: GucluSifre123!

# Proje oluştur ve image push et
docker tag myapp:latest registry.example.com/myproject/myapp:latest
docker push registry.example.com/myproject/myapp:latest

6. Registry Temizleme (Garbage Collection)

hljs bash
# Kullanılmayan katmanları temizle
docker exec registry registry garbage-collect \
  /etc/docker/registry/config.yml

# Dry-run (silmeden önce kontrol)
docker exec registry registry garbage-collect \
  --dry-run \
  /etc/docker/registry/config.yml

# Image sil (API ile)
curl -X DELETE \
  https://registry.example.com:5000/v2/myapp/manifests/DIGEST \
  --cacert /etc/docker/certs/registry/domain.crt \
  -u admin:GucluSifre123!

7. CI/CD Entegrasyonu

GitHub Actions ile

hljs yaml
# .github/workflows/build-push.yml
name: Build and Push

on:
  push:
    branches: [main]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Login to Private Registry
        uses: docker/login-action@v3
        with:
          registry: registry.example.com:5000
          username: ${{ secrets.REGISTRY_USER }}
          password: ${{ secrets.REGISTRY_PASSWORD }}

      - name: Build and Push
        uses: docker/build-push-action@v5
        with:
          context: .
          push: true
          tags: registry.example.com:5000/myapp:${{ github.sha }}

Kubernetes'te Özel Registry Kullanımı

hljs bash
# Registry kimlik bilgilerini secret olarak ekle
kubectl create secret docker-registry registry-secret \
  --docker-server=registry.example.com:5000 \
  --docker-username=admin \
  --docker-password=GucluSifre123! \
  --docker-email=admin@example.com
hljs yaml
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  template:
    spec:
      imagePullSecrets:
        - name: registry-secret
      containers:
        - name: myapp
          image: registry.example.com:5000/myapp:latest

Sonuç

Özel Docker Registry, kurumsal ortamlarda image güvenliği ve yönetimi için vazgeçilmezdir. Basit kullanım için registry:2, kurumsal özellikler (RBAC, güvenlik tarama, replikasyon) için Harbor tercih edin. REXE sunucularında özel registry ile image'larınızı güvenle saklayabilir ve CI/CD pipeline'larınıza entegre edebilirsiniz.