تثبيت Kubernetes مع K3s: تنسيق الحاويات الخفيف
إعداد كلاستر Kubernetes أحادي ومتعدد العقد مع K3s، استخدام kubectl، إنشاء deployments وservices، إدارة التطبيقات مع Helm. دليل Kubernetes لبيئات VPS.
إعداد Docker Registry الخاص، registry آمن مع TLS، المصادقة، عمليات push/pull للصور، registry مؤسسي مع Harbor وتكامل CI/CD.
رغم أن الـ registries العامة مثل Docker Hub مريحة، إلا أن استضافة registry خاص بك للصور الخاصة يوفر مزايا في الأمان والسرعة والتكلفة. يتناول هذا الدليل الخيارات من Docker Registry البسيط إلى Harbor المؤسسي.
| الميزة | الوصف |
|---|---|
| الأمان | الصور الخاصة غير مكشوفة للعموم |
| السرعة | pull/push سريع على الشبكة المحلية |
| التكلفة | لا حدود لمعدل Docker Hub |
| التحكم | تحكم كامل في دورة حياة الصور |
| الامتثال | متطلبات توطين البيانات |
# تشغيل حاوية الـ 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/
# الناتج: {}
# وضع تاغ للصورة
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
# إنشاء مجلد الشهادات
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
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
# إنشاء ملف 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
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:
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
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
./install.sh
docker login registry.example.com
# تنظيف الطبقات غير المستخدمة
docker exec registry registry garbage-collect \
/etc/docker/registry/config.yml
# تشغيل تجريبي
docker exec registry registry garbage-collect \
--dry-run \
/etc/docker/registry/config.yml
# .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.
أسباب مهمة عديدة: 1) الأمان — صورك الخاصة غير مكشوفة للعموم، 2) السرعة — pull/push أسرع بكثير على الشبكة المحلية، 3) لا حدود للمعدل — حسابات Docker Hub المجانية لها حدود pull بالساعة، 4) التحكم في البيانات — صورك تبقى على خادمك، 5) الامتثال — بعض القطاعات تتطلب توطين البيانات.
إذا كنت تستخدم registry بـ HTTP (بدون TLS) تحتاج إخبار Docker بالثقة به كـ registry غير آمن. أضف {"insecure-registries": ["registry.example.com:5000"]} إلى /etc/docker/daemon.json وأعد تشغيل Docker. استخدام TLS في الإنتاج موصى به بشدة.
خطوتان: 1) أولاً احذف الصور عبر API (DELETE /v2/IMAGE/manifests/DIGEST)، 2) ثم شغّل garbage collection (docker exec registry registry garbage-collect /etc/docker/registry/config.yml). بدون garbage collection يُحذف فقط الـ manifest — الطبقات تبقى على القرص.
registry:2 مخزن صور بسيط وخفيف. Harbor يقدم ميزات مؤسسية: RBAC (التحكم في الوصول القائم على الأدوار)، فحص الثغرات (تكامل Trivy)، نسخ الصور، webhooks، سجلات التدقيق وواجهة ويب. registry:2 للفرق الصغيرة، Harbor للمؤسسات الكبيرة.
Kubernetes يحتاج بيانات اعتماد الـ registry. أنشئ بيانات الاعتماد كـ secret بـ kubectl create secret docker-registry وأضف imagePullSecrets إلى deployment. بديلاً أضف imagePullSecrets إلى service account لجعله صالحاً على مستوى الـ namespace.
إعداد كلاستر Kubernetes أحادي ومتعدد العقد مع K3s، استخدام kubectl، إنشاء deployments وservices، إدارة التطبيقات مع Helm. دليل Kubernetes لبيئات VPS.
أنواع Docker volume (named, bind mount, tmpfs)، إدارة الـ volumes، أوضاع شبكات Docker (bridge, host, overlay)، إنشاء شبكات مخصصة والتواصل بين الحاويات. دليل شامل.
مشغلات سجلات Docker، أمر docker logs، سجلات pods في Kubernetes، جمع السجلات المركزي (Loki, ELK Stack)، تدوير السجلات وأفضل ممارسات إدارة السجلات في بيئة الإنتاج.