Ö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.
İç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?
| Avantaj | Açıklama |
|---|---|
| Güvenlik | Özel image'lar dışarıya açık değil |
| Hız | Yerel ağda hızlı pull/push |
| Maliyet | Docker Hub rate limit yok |
| Kontrol | Tam image yaşam döngüsü kontrolü |
| Uyumluluk | Veri yerelleştirme gereksinimleri |
1. Basit Docker Registry (registry:2)
Temel Kurulum
# 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
# 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
# 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
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
# 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
# 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.
# 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
# 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
# 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)
# 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
# .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ı
# 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
# 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.
İlgili Makaleler
K3s ile Kubernetes Kurulumu: Hafif Konteyner Orkestrasyonu
K3s ile tek node ve çok node Kubernetes cluster kurulumu, kubectl kullanımı, deployment ve service oluşturma, Helm ile uygulama yönetimi. VPS üzerinde Kubernetes rehberi.
Docker Volume ve Network Yönetimi: Kalıcı Depolama ve Ağ Yapılandırması
Docker volume türleri (named, bind mount, tmpfs), volume yönetimi, Docker network modları (bridge, host, overlay), özel ağ oluşturma ve konteyner iletişimi. Kapsamlı rehber.
Konteyner Loglama: Docker ve Kubernetes Log Yönetimi
Docker log sürücüleri, docker logs komutu, Kubernetes pod logları, merkezi log toplama (Loki, ELK Stack), log rotasyonu ve production ortamında log yönetimi en iyi pratikleri.