Docker: Docker Swarm

آخر تحديث: 2026-08-26

هل تواجه مثيل Docker واحد صعوبة في التعامل مع حركة المرور؟ Swarm يتيح لك التوسع من مثيل واحد إلى 3 مثيلات ونشر إصدارات جديدة بدون توقف.

1. ما ستتعلمه



2. قصة عمليات التجارة الإلكترونية

(1) نقطة الألم: خادم واحد لا يمكنه التعامل مع حركة المرور

ارتفعت حركة المرور لأعمال التجارة الإلكترونية لتشارلي بشكل كبير، ولم يستطع مثيل Docker واحد التعامل — خلال ساعات الذروة، وصل استخدام CPU إلى 100%، وانتهت مهلة استجابات API، وتدفقت شكاوى المستخدمين. كان بحاجة إلى التوسع إلى خوادم متعددة، لكن بدء الحاويات يدويًا على ثلاثة خوادم منفصلة كان معقدًا للغاية.

(2) حلول مجموعات Docker Swarm

هيأ تشارلي مجموعة Swarm من 3 عقد، ووسع API إلى 5 نسخ، ونشر الإصدار الجديد باستخدام التحديثات المتدرجة بدون توقف.

BASH
# تهيئة مجموعة Swarm
docker swarm init --advertise-addr 10.0.0.1

# نشر خدمة بـ 5 نسخ
docker service create --replicas 5 --name api -p 8080:80 myapp:v2

# تحديث متدرج إلى v3
docker service update --image myapp:v3 api

(3) الفوائد: من جهاز واحد إلى مجموعة — تم في 5 دقائق

تم دمج ثلاثة خوادم في مجموعة، مع توزيع API تلقائيًا عبر خمس نسخ وإجراء تحديثات متدرجة بدون توقف. استغرق الانتقال من خادم واحد إلى مجموعة خمس دقائق فقط.



3. بنية Swarm

(1) أدوار العقد

100%
graph TB
    MGR1["عقدة المدير 1<br/>القائد"] --- MGR2["عقدة المدير 2<br/>احتياطي"]
    MGR1 --- MGR3["عقدة المدير 3<br/>احتياطي"]
    MGR1 --> WRK1["عقدة العامل 1"]
    MGR2 --> WRK2["عقدة العامل 2"]
    MGR3 --> WRK3["عقدة العامل 3"]
الدور المسؤوليات العدد تشغيل الحاويات
المدير إدارة المجموعة، الجدولة، API عدد فردي (3/5/7) ✅ اختياري
العامل تنفيذ المهام، تشغيل الحاويات أي عدد ✅ مطلوب

(1) الخدمة مقابل الحاوية

البُعد الحاوية الخدمة
طريقة الإنشاء docker run docker service create
عدد النسخ 1 نسخ قابلة للتكوين
الشفاء الذاتي يتطلب سياسة إعادة تشغيل ✅ يحافظ تلقائيًا على عدد النسخ
موازنة الحمل لا شيء ✅ Routing Mesh
التحديثات المتدرجة يدوي ✅ مدمج
حالات الاستخدام تطوير جهاز واحد إنتاج المجموعة


4. تهيئة Swarm

▶ مثال: التهيئة بـ swarm init (الصعوبة: ⭐⭐)

BASH
# على عقدة المدير: تهيئة swarm
docker swarm init --advertise-addr 10.0.0.1

# المخرجات تتضمن رمز الانضمام للعمال
# docker swarm join --token SWMTKN-xxx 10.0.0.1:2377
BASH
# على عقد العمال: الانضمام إلى swarm
docker swarm join --token SWMTKN-xxx 10.0.0.1:2377

# سرد جميع العقد
docker node ls
💻 المخرجات:

TEXT 📖 للعرض فقط
ID            HOSTNAME   STATUS   AVAILABILITY   MANAGER STATUS
abc123 *      manager1   Ready    Active         Leader
def456        worker1    Ready    Active
ghi789        worker2    Ready    Active


5. إدارة الخدمات

▶ مثال: نشر service create (الصعوبة: ⭐⭐)

BASH
# إنشاء خدمة بـ 3 نسخ
docker service create \
  --name web \
  --replicas 3 \
  --publish 80:80 \
  nginx:1.25-alpine

# سرد الخدمات
docker service ls

# التحقق من مهام الخدمة (الحاويات)
docker service ps web

▶ مثال: توسيع Service Scale (الصعوبة: ⭐⭐)

BASH
# التوسع إلى 5 نسخ
docker service scale web=5

# التحقق
docker service ps web

▶ مثال: service update — تحديث متدرج (الصعوبة: ⭐⭐⭐)

BASH
# تحديث متدرج: تحديث حاويتين في كل مرة مع تأخير 30 ثانية
docker service update \
  --image nginx:1.26-alpine \
  --update-parallelism 2 \
  --update-delay 30s \
  --update-failure-action rollback \
  web

# التحقق من حالة التحديث
docker service inspect web --format='{{.UpdateStatus.State}}'

(1) استراتيجية التحديث المتدرج

المعامل القيمة الافتراضية الوصف
--update-parallelism 1 كم حاوية تُحدث في كل دفعة؟
--update-delay 0s وقت الانتظار بين الدفعات
--update-failure-action pause إجراء الفشل (pause/rollback/continue)
--update-monitor 5s وقت المراقبة بعد التحديث

▶ مثال: تراجع الخدمة (الصعوبة: ⭐⭐)

BASH
# التراجع إلى الإصدار السابق
docker service rollback web


6. الأسرار وإدارة التكوين

▶ مثال: إنشاء واستخدام Docker Secrets (الصعوبة: ⭐⭐⭐)

BASH
# إنشاء سر من ملف
echo "my_super_secret_password" | docker secret create db_password -

# استخدام السر في خدمة
docker service create \
  --name api \
  --secret db_password \
  -e DB_PASSWORD_FILE=/run/secrets/db_password \
  myapp:1.0
🔒 الأمان: الأسرار مخزنة في سجل Raft على عقدة المدير (مشفرة) وتُرسل فقط إلى العامل الذي يشغل الخدمة. يتم الوصول إليها داخل الحاوية عبر الملف /run/secrets/<name> ولا تُكشف في متغيرات البيئة.



7. Routing Mesh

(1) آليات توجيه الشبكة

Routing Mesh في Swarm يسمح لأي منفذ على أي عقدة بالتوجيه إلى أي نسخة من خدمة — حتى لو لم تكن تلك النسخة على العقدة الحالية.

100%
graph LR
    A["العقدة 1<br/>:80"] -->|"طلب"| B["Routing Mesh"]
    C["العقدة 2<br/>:80"] --> B
    B -->|"round-robin"| D["النسخة 1<br/>العقدة 1"]
    B --> E["النسخة 2<br/>العقدة 2"]
    B --> F["النسخة 3<br/>العقدة 3"]
النمط الصيغة الوصف
VIP (افتراضي) --publish 80:80 IP افتراضي + موازنة حمل
DNSRR --endpoint-mode dnsrr DNS round-robin، بدون VIP


8. مقارنة Swarm مع Compose

البُعد Docker Compose Docker Swarm
عدد العقد عقدة واحدة مجموعة متعددة العقد
التوفر العالي ✅ تكرار المدير
الشفاء الذاتي للخدمة سياسة إعادة التشغيل ✅ الحفاظ على عدد النسخ
التحديثات المتدرجة يدوي ✅ مدمج
موازنة الحمل Nginx/DNS Round-Robin ✅ Routing Mesh
الأسرار متغيرات البيئة ✅ تخزين مشفر
طريقة النشر docker compose up docker stack deploy

▶ مثال: نشر ملف Compose إلى Swarm باستخدام stack deploy (الصعوبة: ⭐⭐⭐)

BASH
# نشر ملف compose كـ stack
docker stack deploy -c docker-compose.yml mystack

# سرد stacks
docker stack ls

# سرد الخدمات في stack
docker stack services mystack

# إزالة stack
docker stack rm mystack


9. مثال كامل: نشر مجموعة ثلاثية العقد

BASH
# ============================================
# شرح كامل: مجموعة Swarm ثلاثية العقد
# يغطي: init, join, service, scale, update
# ============================================

# --- على المدير (10.0.0.1) ---
# 1. تهيئة Swarm
docker swarm init --advertise-addr 10.0.0.1

# 2. الحصول على رمز انضمام العامل
docker swarm join-token worker

# --- على العمال (10.0.0.2, 10.0.0.3) ---
# 3. الانضمام إلى swarm (الصق الرمز من الخطوة 2)
docker swarm join --token SWMTKN-xxx 10.0.0.1:2377

# --- على المدير ---
# 4. التحقق من المجموعة
docker node ls

# 5. نشر خدمة web بـ 5 نسخ
docker service create \
  --name web \
  --replicas 5 \
  --publish 80:80 \
  --restart-condition on-failure \
  nginx:1.25-alpine

# 6. التحقق من التوزيع عبر العقد
docker service ps web

# 7. تحديث متدرج إلى v1.26
docker service update \
  --image nginx:1.26-alpine \
  --update-parallelism 2 \
  --update-delay 30s \
  web

# 8. محاكاة فشل عقدة
docker node update --availability drain worker1
docker service ps web  # النسخ أعيد جدولتها

# 9. استعادة العقدة
docker node update --availability active worker1

# 10. تقليص الحجم
docker service scale web=2

# 11. التنظيف
docker service rm web
docker swarm leave --force  # على المدير

❓ أسئلة شائعة

س ما هو الحد الأدنى لعدد الخوادم المطلوبة لـ Swarm؟
ج يمكن تشغيله على خادم واحد فقط (للتطوير/الاختبار). للإنتاج، نوصي بـ 3 مديرين أو أكثر (عدد فردي، لأن توافق Raft يتطلب أغلبية) بالإضافة إلى N من العمال. مطلوب مدير واحد على الأقل، لكن المجموعة تصبح غير قابلة للإدارة إذا فشل مدير واحد.
س أين تُخزن بيانات Swarm؟
ج في سجلات Raft على عقد المدير (/var/lib/docker/swarm/). تحتوي هذه السجلات على حالة المجموعة وتعريفات الخدمة والأسرار والمزيد. إذا فشلت عقدة مدير، تنتخب عقد المدير الأخرى قائدًا جديدًا باستخدام بروتوكول Raft. يوصى بعمل نسخ احتياطية لسجلات Raft بانتظام.
س كيف يقوم Routing Mesh بموازنة الحمل؟
ج وضع VIP (IP الافتراضي) في Swarm: كل خدمة تُعين IP افتراضي. عندما يصل طلب إلى VIP، يقوم موازن الحمل IPVS في النواة بتوزيعه عبر النسخ المختلفة. جميع العقد تستمع على المنفذ المنشور، لذا يمكن توجيه الطلبات إلى نسخة على أي عقدة.
س كيف أقوم بتكوين TLS لـ Swarm؟
ج Swarm لديه mTLS (TLS متبادل) مدمج، يشفر تلقائيًا التواصل بين العقد. الشهادات تُولد تلقائيًا أثناء التهيئة، بدون حاجة لتكوين يدوي. التواصل بين المديرين وبين المديرين والعمال مشفر.
س ما التغييرات المطلوبة للترحيل من Compose إلى Swarm؟
ج معظم ملفات docker-compose.yml يمكن استخدامها كما هي مع docker stack deploy. ملاحظات مهمة: ① استبدل build بـ image (Swarm لا يدعم build)؛ ② volumes تدعم فقط وحدات التخزين المسماة و NFS؛ ③ depends_on يدعم فقط started — لا يدعم service_healthy؛ ④ أضف كتلة deploy لتكوين استراتيجيات replicas و update.

📖 ملخص


📝 تمارين

  1. تمرين أساسي (الصعوبة: ⭐): هيئ Swarm على جهاز واحد، وأنشئ خدمة Nginx بـ 3 نسخ، وتحقق من أن docker service ps يعرض توزيع النسخ.
  2. تمرين متقدم (الصعوبة: ⭐⭐): نفذ تحديثًا متدرجًا (nginx: 1.25 → 1.26) ولاحظ عملية التحديث في docker service ps.
  3. تحدٍ (الصعوبة: ⭐⭐⭐): أعد مجموعة Swarm على ثلاثة أجهزة افتراضية، وانشر خدمة API بخمس نسخ، وحاكِ فشل عقدة عامل، وتحقق من أن النسخ تهاجر تلقائيًا إلى عقد أخرى.
Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%