Docker: Docker Swarm
آخر تحديث: 2026-08-26
هل تواجه مثيل Docker واحد صعوبة في التعامل مع حركة المرور؟ Swarm يتيح لك التوسع من مثيل واحد إلى 3 مثيلات ونشر إصدارات جديدة بدون توقف.
1. ما ستتعلمه
- بنية مجموعة Swarm وتهيئتها
- الفرق بين الخدمة والحاوية
- التحديثات المتدرجة واستراتيجيات التراجع
- الأسرار وإدارة التكوين
- توجيه الشبكة متعدد العقد
2. قصة عمليات التجارة الإلكترونية
(1) نقطة الألم: خادم واحد لا يمكنه التعامل مع حركة المرور
ارتفعت حركة المرور لأعمال التجارة الإلكترونية لتشارلي بشكل كبير، ولم يستطع مثيل Docker واحد التعامل — خلال ساعات الذروة، وصل استخدام CPU إلى 100%، وانتهت مهلة استجابات API، وتدفقت شكاوى المستخدمين. كان بحاجة إلى التوسع إلى خوادم متعددة، لكن بدء الحاويات يدويًا على ثلاثة خوادم منفصلة كان معقدًا للغاية.
(2) حلول مجموعات Docker Swarm
هيأ تشارلي مجموعة Swarm من 3 عقد، ووسع API إلى 5 نسخ، ونشر الإصدار الجديد باستخدام التحديثات المتدرجة بدون توقف.
# تهيئة مجموعة 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) أدوار العقد
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 (الصعوبة: ⭐⭐)
# على عقدة المدير: تهيئة swarm
docker swarm init --advertise-addr 10.0.0.1
# المخرجات تتضمن رمز الانضمام للعمال
# docker swarm join --token SWMTKN-xxx 10.0.0.1:2377
# على عقد العمال: الانضمام إلى swarm
docker swarm join --token SWMTKN-xxx 10.0.0.1:2377
# سرد جميع العقد
docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
abc123 * manager1 Ready Active Leader
def456 worker1 Ready Active
ghi789 worker2 Ready Active
5. إدارة الخدمات
▶ مثال: نشر service create (الصعوبة: ⭐⭐)
# إنشاء خدمة بـ 3 نسخ
docker service create \
--name web \
--replicas 3 \
--publish 80:80 \
nginx:1.25-alpine
# سرد الخدمات
docker service ls
# التحقق من مهام الخدمة (الحاويات)
docker service ps web
▶ مثال: توسيع Service Scale (الصعوبة: ⭐⭐)
# التوسع إلى 5 نسخ
docker service scale web=5
# التحقق
docker service ps web
▶ مثال: service update — تحديث متدرج (الصعوبة: ⭐⭐⭐)
# تحديث متدرج: تحديث حاويتين في كل مرة مع تأخير 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 | وقت المراقبة بعد التحديث |
▶ مثال: تراجع الخدمة (الصعوبة: ⭐⭐)
# التراجع إلى الإصدار السابق
docker service rollback web
6. الأسرار وإدارة التكوين
▶ مثال: إنشاء واستخدام Docker Secrets (الصعوبة: ⭐⭐⭐)
# إنشاء سر من ملف
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
/run/secrets/<name> ولا تُكشف في متغيرات البيئة.
7. Routing Mesh
(1) آليات توجيه الشبكة
Routing Mesh في Swarm يسمح لأي منفذ على أي عقدة بالتوجيه إلى أي نسخة من خدمة — حتى لو لم تكن تلك النسخة على العقدة الحالية.
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 (الصعوبة: ⭐⭐⭐)
# نشر ملف 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. مثال كامل: نشر مجموعة ثلاثية العقد
# ============================================
# شرح كامل: مجموعة 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 # على المدير
❓ أسئلة شائعة
/var/lib/docker/swarm/). تحتوي هذه السجلات على حالة المجموعة وتعريفات الخدمة والأسرار والمزيد. إذا فشلت عقدة مدير، تنتخب عقد المدير الأخرى قائدًا جديدًا باستخدام بروتوكول Raft. يوصى بعمل نسخ احتياطية لسجلات Raft بانتظام.docker stack deploy. ملاحظات مهمة: ① استبدل build بـ image (Swarm لا يدعم build)؛ ② volumes تدعم فقط وحدات التخزين المسماة و NFS؛ ③ depends_on يدعم فقط started — لا يدعم service_healthy؛ ④ أضف كتلة deploy لتكوين استراتيجيات replicas و update.📖 ملخص
- Swarm = تنسيق الحاويات المدمج في Docker: المديرون يتولون الجدولة، بينما العمال يشغلون الحاويات
- Service بدلاً من Container: تحديد عدد النسخ، شفاء ذاتي تلقائي، موازنة حمل مدمجة
- التحديثات الحية:
--update-parallelism+--update-delayيحددان الوتيرة - Routing Mesh: المنافذ على أي عقدة توجه تلقائيًا إلى جميع نسخ الخدمة
- تخزين مشفر للأسرار: لا تُكشف في متغيرات البيئة؛ تُقرأ من ملف داخل الحاوية
docker stack deploy -c compose.ymlيمكن نشر ملفات Compose مباشرة إلى Swarm
📝 تمارين
- تمرين أساسي (الصعوبة: ⭐): هيئ Swarm على جهاز واحد، وأنشئ خدمة Nginx بـ 3 نسخ، وتحقق من أن
docker service psيعرض توزيع النسخ. - تمرين متقدم (الصعوبة: ⭐⭐): نفذ تحديثًا متدرجًا (nginx: 1.25 → 1.26) ولاحظ عملية التحديث في
docker service ps. - تحدٍ (الصعوبة: ⭐⭐⭐): أعد مجموعة Swarm على ثلاثة أجهزة افتراضية، وانشر خدمة API بخمس نسخ، وحاكِ فشل عقدة عامل، وتحقق من أن النسخ تهاجر تلقائيًا إلى عقد أخرى.