انتقل إلى المحتوى الرئيسي
العودة إلى الفئة

إعداد Docker Registry الخاص: تخزين الصور وإدارتها

إعداد Docker Registry الخاص، registry آمن مع TLS، المصادقة، عمليات push/pull للصور، registry مؤسسي مع Harbor وتكامل CI/CD.

وقت القراءة: 14 dk الحاويات والتنسيق
dockerregistryصورةharborحاويةci/cdتخزينregistry خاص
الكاتب
REXE Teknoloji Network & Security Team
المحرر
REXE Teknoloji Technical Editorial
أول نشر
آخر تحديث

إعداد Docker Registry الخاص

رغم أن الـ registries العامة مثل Docker Hub مريحة، إلا أن استضافة registry خاص بك للصور الخاصة يوفر مزايا في الأمان والسرعة والتكلفة. يتناول هذا الدليل الخيارات من Docker Registry البسيط إلى Harbor المؤسسي.

لماذا registry خاص؟

الميزةالوصف
الأمانالصور الخاصة غير مكشوفة للعموم
السرعةpull/push سريع على الشبكة المحلية
التكلفةلا حدود لمعدل Docker Hub
التحكمتحكم كامل في دورة حياة الصور
الامتثالمتطلبات توطين البيانات

1. Docker Registry البسيط (registry:2)

الإعداد الأساسي

hljs bash
# تشغيل حاوية الـ registry
docker run -d \
  --name registry \
  --restart always \
  -p 5000:5000 \
  -v registry-data:/var/lib/registry \
  registry:2

# التحقق من تشغيل الـ registry
curl http://localhost:5000/v2/
# الناتج: {}

Push و Pull للصور

hljs bash
# وضع تاغ للصورة
docker tag myapp:latest localhost:5000/myapp:latest

# رفع إلى الـ registry
docker push localhost:5000/myapp:latest

# سحب من الـ registry
docker pull localhost:5000/myapp:latest

# عرض قائمة الصور في الـ registry
curl http://localhost:5000/v2/_catalog

2. Registry آمن مع TLS

hljs bash
# إنشاء مجلد الشهادات
mkdir -p /etc/docker/certs/registry

# إنشاء شهادة موقّعة ذاتياً
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"

# إضافة الشهادة إلى شهادات Docker الموثوقة
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

systemctl restart docker

تشغيل الـ Registry مع TLS

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

3. Registry مع المصادقة

hljs bash
# إنشاء ملف htpasswd
mkdir -p /etc/docker/registry/auth
docker run --rm \
  --entrypoint htpasswd \
  httpd:2 -Bbn admin StrongPass123! > /etc/docker/registry/auth/htpasswd

# تشغيل الـ registry مع المصادقة
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

# تسجيل الدخول
docker login registry.example.com:5000

4. Registry مع Docker Compose

hljs yaml
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
    ports:
      - "8080:80"
    environment:
      - REGISTRY_TITLE=REXE Private Registry
      - REGISTRY_URL=https://registry.example.com:5000
      - SINGLE_REGISTRY=true

volumes:
  registry-data:

5. Harbor — Registry المؤسسي

hljs bash
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
cp harbor.yml.tmpl harbor.yml
nano harbor.yml
hljs yaml
hostname: registry.example.com

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

harbor_admin_password: StrongPass123!
data_volume: /data/harbor
hljs bash
./install.sh
docker login registry.example.com

6. تنظيف الـ Registry (Garbage Collection)

hljs bash
# تنظيف الطبقات غير المستخدمة
docker exec registry registry garbage-collect \
  /etc/docker/registry/config.yml

# تشغيل تجريبي
docker exec registry registry garbage-collect \
  --dry-run \
  /etc/docker/registry/config.yml

7. تكامل CI/CD

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 }}

الخلاصة

Docker Registry الخاص ضروري لأمان الصور وإدارتها في البيئات المؤسسية. اختر registry:2 للحالات البسيطة، وHarbor للميزات المؤسسية (RBAC، فحص الأمان، النسخ المتماثل). مع registry خاص على خوادم REXE يمكنك تخزين صورك بأمان ودمجها في CI/CD pipelines.

الأسئلة الشائعة

لماذا أستخدم registry خاصاً بدلاً من Docker Hub؟

أسباب مهمة عديدة: 1) الأمان — صورك الخاصة غير مكشوفة للعموم، 2) السرعة — pull/push أسرع بكثير على الشبكة المحلية، 3) لا حدود للمعدل — حسابات Docker Hub المجانية لها حدود pull بالساعة، 4) التحكم في البيانات — صورك تبقى على خادمك، 5) الامتثال — بعض القطاعات تتطلب توطين البيانات.

أحصل على خطأ insecure registry، كيف أحله؟

إذا كنت تستخدم registry بـ HTTP (بدون TLS) تحتاج إخبار Docker بالثقة به كـ registry غير آمن. أضف {"insecure-registries": ["registry.example.com:5000"]} إلى /etc/docker/daemon.json وأعد تشغيل Docker. استخدام TLS في الإنتاج موصى به بشدة.

قرص الـ registry امتلأ، كيف أنظفه؟

خطوتان: 1) أولاً احذف الصور عبر API (DELETE /v2/IMAGE/manifests/DIGEST)، 2) ثم شغّل garbage collection (docker exec registry registry garbage-collect /etc/docker/registry/config.yml). بدون garbage collection يُحذف فقط الـ manifest — الطبقات تبقى على القرص.

ما الفرق بين Harbor وregistry:2؟

registry:2 مخزن صور بسيط وخفيف. Harbor يقدم ميزات مؤسسية: RBAC (التحكم في الوصول القائم على الأدوار)، فحص الثغرات (تكامل Trivy)، نسخ الصور، webhooks، سجلات التدقيق وواجهة ويب. registry:2 للفرق الصغيرة، Harbor للمؤسسات الكبيرة.

لا أستطيع سحب الصور من registry الخاص في Kubernetes، لماذا؟

Kubernetes يحتاج بيانات اعتماد الـ registry. أنشئ بيانات الاعتماد كـ secret بـ kubectl create secret docker-registry وأضف imagePullSecrets إلى deployment. بديلاً أضف imagePullSecrets إلى service account لجعله صالحاً على مستوى الـ namespace.

مقالات ذات صلة

حركة الشبكةالداخل Gbpsالخارج Gbps