Docker: شبكات Docker — المفاهيم الأساسية

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

شبكات الحاويات هي الجانب الأكثر إرباكًا في Docker — حتى تفهم أن "كل حاوية لها localhost خاص بها."

1. ما ستتعلمه



2. قصة حقيقية لمطور

(1) المشكلة: لا يمكن الاتصال بـ localhost بين الحاويات

تطبيق الويب وقاعدة البيانات الخاصان بأليس يعملان في حاويتين منفصلتين، وحاوية الويب، باستخدام localhost:5432، لا يمكنها الاتصال بقاعدة البيانات. ظلت في حيرة لمدة ساعتين: "قاعدة البيانات تستمع بوضوح على المنفذ 5432، فلماذا لا يمكن الاتصال؟"

(2) حلول عزل شبكة الحاويات

قال بوب: "كل حاوية لها localhost خاص بها. localhost لحاوية الويب هو تطبيق الويب نفسه، وليس قاعدة البيانات. تحتاج إلى استخدام اسم الحاوية أو اتصال شبكة مخصص."

BASH
# إنشاء شبكة مخصصة للتواصل بين الحاويات
docker network create app-net

# بدء الحاويات على نفس الشبكة
docker run -d --name db --network app-net -e POSTGRES_PASSWORD=secret postgres:15
docker run -d --name web --network app-net -p 8080:5000 myapp

# يتصل web بـ db:5432 (وليس localhost:5432)

(3) الفائدة: مشكلة الشبكة حُلت في ساعتين → 5 دقائق

بمجرد أن فهمت نموذج شبكة الحاويات، تمكنت أليس من حل مشكلة الشبكة في 5 دقائق — بدلاً من ساعتين من استكشاف الأخطاء.



3. أوضاع شبكة Docker الأربعة

(1) نظرة عامة على الأنماط

100%
graph TB
    subgraph Bridge["وضع Bridge (افتراضي)"]
        B1["الحاوية أ<br/>172.17.0.2"] --- B2["جسر docker0<br/>172.17.0.1"]
        B2 --- B3["الحاوية ب<br/>172.17.0.3"]
        B2 --- B4["المضيف eth0<br/>عبر NAT"]
    end
    subgraph Host["وضع Host"]
        H1["الحاوية"] --- H2["مجموعة شبكة المضيف<br/>مشاركة جميع المنافذ"]
    end
    subgraph None["وضع None"]
        N1["الحاوية<br/>loopback فقط"]
    end
    subgraph Overlay["وضع Overlay"]
        O1["الحاوية أ<br/>المضيف 1"] -.- O2["الحاوية ب<br/>المضيف 2"]
    end

(2) مقارنة الأوضاع الأربعة

البُعد Bridge Host None Overlay
العزل مجموعة شبكة مخصصة شبكة مضيف مشتركة معزولة تمامًا شبكة افتراضية عبر المضيفين
إعادة توجيه المنافذ تتطلب -p غير مطلوبة غير متاحة توجيه مدمج
الأداء متوسط (عبء NAT) عالي (وصول مباشر) - متوسط (تغليف VXLAN)
تحليل DNS bridge مخصص فقط لا شيء (استضافة مشتركة) لا شيء ✅ مدمج
عبر المضيفين
حالات الاستخدام جهاز واحد، حاويات متعددة شبكة عالية الأداء عزل الأمان/التصحيح مجموعات Docker Swarm


4. شرح مفصل لشبكة Bridge

(1) Bridge الافتراضية مقابل Bridge المخصصة

البُعد Bridge الافتراضية Bridge المخصصة
تحليل DNS ❌ عناوين IP فقط ✅ التواصل باستخدام أسماء الحاويات
عزل الحاويات جميع الحاويات على نفس الشبكة معزولة حسب مجموعة الشبكة
مستوى التوصية ⭐ (متوافقة مع الإصدارات القديمة) ⭐⭐⭐ (موصى بها)
طريقة الإنشاء ينشئها Docker تلقائيًا docker network create

▶ مثال: إنشاء شبكة Bridge مخصصة (الصعوبة: ⭐)

BASH
# إنشاء شبكة bridge مخصصة
docker network create --driver bridge app-net

# التحقق
docker network ls | grep app-net
docker network inspect app-net

▶ مثال: تحليل DNS بين الحاويات (الصعوبة: ⭐⭐)

BASH
# بدء حاويتين على نفس الشبكة المخصصة
docker run -d --name db --network app-net \
  -e POSTGRES_PASSWORD=secret postgres:15-alpine
docker run -d --name api --network app-net \
  nginx:alpine

# تحليل DNS: api يمكنها الوصول إلى db بالاسم
docker exec api ping -c 2 db
💻 المخرجات:

TEXT 📖 للعرض فقط
PING db (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.100 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.050 ms
📌 نقطة أساسية: شبكة bridge المخصصة تسجل تلقائيًا سجلات DNS لكل حاوية. اسم الحاوية يعمل كاسم مضيف — db يُحلل إلى عنوان IP لحاوية قاعدة البيانات. هذا هو السبب في أن fastcgi_pass lemp-php:9000 يعمل في مشروع LEMP في المرحلة الأولى.

▶ مثال: التحقق من عزل الشبكة (الصعوبة: ⭐⭐)

BASH
# إنشاء شبكتين منفصلتين
docker network create frontend-net
docker network create backend-net

# حاوية الواجهة الأمامية
docker run -d --name web --network frontend-net nginx:alpine

# حاوية الواجهة الخلفية
docker run -d --name api --network backend-net nginx:alpine

# web لا يمكنها الوصول إلى api (شبكات مختلفة)
docker exec web ping -c 2 -W 2 api
# المخرجات: ping: bad address 'api'

# توصيل web بـ backend-net (الآن يمكنها الوصول إلى api)
docker network connect backend-net web
docker exec web ping -c 2 api
# المخرجات: PING api (172.19.0.2): 64 bytes


5. وضع شبكة Host

▶ مثال: تشغيل حاوية في وضع Host (الصعوبة: ⭐⭐)

BASH
# التشغيل مع شبكة host (مشاركة مجموعة شبكة المضيف)
docker run -d --name host-nginx --network host nginx:alpine

# لا حاجة لتعيين منفذ — nginx يستمع مباشرة على منفذ المضيف 80
curl http://localhost:80
⚠️ ملاحظة: في وضع Host، تستخدم الحاويات منافذ المضيف مباشرة ولا تتطلب تعيين -p. ومع ذلك، هناك خطر كبير من تعارض المنافذ — إذا كان المنفذ 80 على المضيف قيد الاستخدام بالفعل، ستفشل الحاوية في البدء. استخدم بحذر في بيئات الإنتاج.



6. كيفية عمل إعادة توجيه المنافذ

(1) ثلاث طرق لكشف المنافذ

الطريقة الصيغة الوصف
-p مضيف:حاوية -p 8080:80 تعيين محدد
-P -P تعيين عشوائي للمنافذ المعلنة في EXPOSE
--network host --network host لا حاجة لتعيين منفذ (شبكة مضيف مشتركة)

▶ مثال: استخدام docker network inspect لعرض تفاصيل الشبكة (الصعوبة: ⭐⭐)

BASH
# فحص إعدادات الشبكة
docker network inspect app-net
💻 المخرجات (مقتطف):

TEXT 📖 للعرض فقط
[
  {
    "Name": "app-net",
    "Driver": "bridge",
    "IPAM": {
      "Config": [{"Subnet": "172.18.0.0/16", "Gateway": "172.18.0.1"}]
    },
    "Containers": {
      "a1b2c3d4...": {"Name": "db", "IPv4Address": "172.18.0.2"},
      "e5f6a7b8...": {"Name": "api", "IPv4Address": "172.18.0.3"}
    }
  }
]


7. مثال كامل: بنية شبكة ثلاثية الطبقات

BASH
# ============================================
# شرح كامل: بنية شبكة ثلاثية الطبقات
# عزل الواجهة الأمامية / الخلفية / قاعدة البيانات
# ============================================

# 1. إنشاء ثلاث شبكات
docker network create frontend-net
docker network create backend-net
docker network create db-net

# 2. بدء قاعدة البيانات (فقط على db-net)
docker run -d --name db \
  --network db-net \
  -e POSTGRES_PASSWORD=secret \
  -e POSTGRES_DB=myapp \
  postgres:15-alpine

# 3. بدء خادم API (backend-net + db-net)
docker run -d --name api \
  --network backend-net \
  -e DATABASE_URL="postgresql://postgres:secret@db:5432/myapp" \
  myapp-api:1.0

# توصيل API بـ db-net للوصول إلى قاعدة البيانات
docker network connect db-net api

# 4. بدء Nginx (frontend-net + backend-net)
docker run -d --name web \
  --network frontend-net \
  -p 8080:80 \
  -v $(pwd)/nginx.conf:/etc/nginx/conf.d/default.conf \
  nginx:1.25-alpine

# توصيل Nginx بـ backend-net للوصول إلى API
docker network connect backend-net web

# 5. التحقق من الاتصال
docker exec web ping -c 1 api     # web → api ✅
docker exec api ping -c 1 db      # api → db ✅
docker exec web ping -c 1 -W 1 db # web → db ❌ (ليست على db-net)

# 6. التنظيف
docker stop web api db
docker rm web api db
docker network rm frontend-net backend-net db-net

❓ أسئلة شائعة

س هل يمكن لحاويتين التواصل إذا لم تكونا على نفس الشبكة؟
ج افتراضيًا، لا. كل شبكة هي مجال مستقل ومعزول. للسماح للحاوية أ بالوصول إلى الحاوية ج في الشبكة ب، تحتاج إلى استخدام docker network connect لإضافة أ إلى الشبكة ب. يمكن للحاوية الانتماء إلى شبكات متعددة في نفس الوقت.
س ما هي مخاطر استخدام وضع شبكة host؟
ج هناك خطران رئيسيان: ① تعارض المنافذ — الحاويات تستمع مباشرة على منافذ المضيف، لذا ستفشل في البدء إذا كانت هذه المنافذ قيد الاستخدام بواسطة خدمات أخرى؛ ② الأمان — يمكن للحاويات الوصول إلى جميع واجهات شبكة المضيف، بما في ذلك الخدمات الداخلية على localhost. استخدم وضع host فقط عندما تحتاج إلى أقصى أداء للشبكة.
س هل يتغير عنوان IP للحاوية؟
ج نعم. قد يتغير عنوان IP بعد إعادة تشغيل الحاوية (خاصة للشبكات الفرعية غير المعرفة من قبل المستخدم). لهذا السبب يجب التواصل باستخدام أسماء الحاويات (عبر تحليل DNS) بدلاً من عناوين IP. لشبكات bridge المخصصة، يحافظ DNS تلقائيًا على تعيين أسماء الحاويات إلى عناوين IP.
س كيف يمكنني تقييد وصول الشبكة للحاويات؟
ج هناك ثلاث طرق: ① استخدام شبكات متعددة للعزل (موصى به) — قاعدة البيانات على db-net فقط، لذا لا يمكن للواجهة الأمامية الوصول إليها مباشرة؛ ② استخدام قواعد iptables (متقدم)؛ ③ --icc=false تعطيل التواصل بين الحاويات على bridge الافتراضية (غير موصى به؛ استخدام شبكة مخصصة أفضل).
س كيف تتواصل الحاويات عبر المضيفين؟
ج Docker على مضيف واحد لا يمكنه التواصل مباشرة عبر المضيفين. الحلول: ① شبكة Overlay (تتطلب Docker Swarm أو إعداد etcd يدوي)؛ ② تعيين المنافذ + IP المضيف؛ ③ إضافات شبكة من طرف ثالث (Weave/Calico). شبكة Overlay في Docker Swarm هي أبسط حل للتواصل عبر المضيفين (المرحلة 4، الدرس 20).

📖 ملخص


📝 تمارين

  1. تمرين أساسي (الصعوبة: ⭐): أنشئ شبكة bridge مخصصة، وابدأ حاويتي Nginx، وتحقق من أن أسماء الحاويات تُحلل عبر DNS (docker exec A ping B).
  2. تمرين متقدم (الصعوبة: ⭐⭐): أنشئ شبكتين منفصلتين، وضع حاوية في كل منهما، وتحقق من أن الحاويات في الشبكات المختلفة لا يمكنها ping بعضها البعض. ثم استخدم docker network connect لتوصيلها.
  3. تحدٍ (الصعوبة: ⭐⭐⭐): استخدم docker network inspect لعرض إعدادات IPAM وقائمة الحاويات لشبكة مخصصة، وافهم آلية توجيه الشبكة الداخلية لـ Docker.
Web-Tutorial.com

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

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

100%