Docker: نماذج التواصل بين الحاويات

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

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

1. ما ستتعلمه



2. قصة حقيقية لمطور خدمات مصغرة

(1) نقطة الألم: الخدمات المصغرة الثلاث غير متصلة ببعضها

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

(2) حلول الفحص المنهجي للشبكة

علمه بوب عملية استكشاف أخطاء الشبكة: اسم الحاوية → DNS → الشبكة → المنفذ.

BASH
# الخطوة 1: التحقق من تحليل DNS
docker exec api nslookup user-service

# الخطوة 2: اختبار اتصال الشبكة
docker exec api ping -c 2 user-service

# الخطوة 3: اختبار اتصال المنفذ
docker exec api nc -zv user-service 8080

(3) الفوائد: وقت استكشاف أخطاء الشبكة انخفض من ساعتين إلى 10 دقائق

مع وجود عملية منهجية لاستكشاف الأخطاء، انخفض الوقت الذي يستغرقه تشارلي لاستكشاف أخطاء الشبكة من ساعتين إلى 10 دقائق.



3. ثلاث طرق للتواصل بين الحاويات

(1) مقارنة الطرق

100%
graph TB
    subgraph Method1["① --link (قديم، مهمل)"]
        L1["الحاوية أ"] -->|"متغيرات البيئة + /etc/hosts"| L2["الحاوية ب"]
    end
    subgraph Method2["② شبكة مخصصة + DNS (موصى به)"]
        D1["الحاوية أ"] -->|"تحليل DNS تلقائي"| D2["الحاوية ب"]
    end
    subgraph Method3["③ منفذ مكشوف + IP المضيف"]
        E1["الحاوية أ"] -->|"مضيف:منفذ"| E2["الحاوية ب<br/>(عبر جسر المضيف)"]
    end
الطريقة المبدأ DNS الحالة التوصية
--link متغيرات البيئة + حقن hosts ❌ مهمل
DNS الشبكة المخصصة DNS Docker المدمج ✅ موصى به ⭐⭐⭐
إعادة توجيه منفذ المضيف حاوية←مضيف←حاوية متاح ⭐⭐


BASH
# رابط قديم: ب يمكنها الوصول إلى أ باسم المضيف
docker run -d --name db postgres:15-alpine
docker run -d --name web --link db:database nginx:alpine

# web يمكنها استخدام "database" كاسم مضيف (عبر /etc/hosts)
docker exec web cat /etc/hosts
⚠️ ملاحظة: --link تم إهماله ويستخدم فقط كمرجع تاريخي. يدعم فقط الاتصالات أحادية الاتجاه (web→db، وليس db→web)، ولا يتم تحديث ملف hosts عندما يتغير عنوان IP بعد إعادة تشغيل الحاوية. استخدم دائمًا شبكة مخصصة بدلاً من ذلك.**



5. دليل مفصل لـ DNS الشبكة المخصصة

(1) عملية تحليل DNS

100%
graph LR
    A["الحاوية أ<br/>ping db"] --> B["Docker DNS<br/>127.0.0.11"]
    B -->|db → 172.18.0.2| C["الحاوية ب<br/>172.18.0.2"]

▶ مثال: --network-alias لتعيين اسم مستعار (الصعوبة: ⭐⭐)

BASH
# بدء حاوية باسم شبكة مستعار
docker run -d --name my-postgres \
  --network app-net \
  --network-alias=database \
  --network-alias=db \
  postgres:15-alpine

# كلا الاسمين يُحللان إلى نفس الحاوية
docker exec api ping -c 1 database  # يحلل إلى my-postgres
docker exec api ping -c 1 db        # نفس IP

(1) اسم الحاوية مقابل الاسم المستعار للشبكة

النوع التعريف النطاق الأولوية
--name اسم الحاوية جميع الشبكات عالية
--network-alias الاسم المستعار للشبكة الشبكة المحددة فقط متوسطة
اسم خدمة Docker Compose اسم الخدمة شبكة Compose عالية
💡 نصيحة: --network-alias يسمح لنفس الحاوية بأن يكون لها أسماء مختلفة في شبكات مختلفة. على سبيل المثال، قاعدة البيانات تُسمى primary-db في backend-net و database في admin-net.



6. سياسة كشف المنافذ

(1) --expose مقابل -p مقابل -P

المعامل الوظيفة قابل للوصول خارجيًا حالات الاستخدام
--expose 3306 إعلان المنفذ (توثيق) ❌ غير معين التواصل بين الحاويات
-p 3306:3306 معين إلى المضيف ✅ قابل للوصول من الخارج خدمة خارجية
-P تعيين عشوائي لمنافذ EXPOSE ✅ منافذ عشوائية التطوير والتصحيح

▶ مثال: استخدام docker port لعرض تعيينات المنافذ (الصعوبة: ⭐)

BASH
# التحقق من تعيينات المنافذ لحاوية
docker port web

# مثال على المخرجات
80/tcp -> 0.0.0.0:8080


7. استكشاف أخطاء الشبكة

(1) أشجار القرار لاستكشاف الأخطاء

100%
graph TB
    START["الحاوية أ<br/>لا يمكنها الوصول إلى الحاوية ب"] --> DNS{"تحليل DNS?"}
    DNS -->|فشل| FIX1["نفس الشبكة المخصصة?<br/>استخدم --name أو --network-alias"]
    DNS -->|نجاح| PING{"Ping قابل للوصول?"}
    PING -->|فشل| FIX2["على نفس الشبكة?<br/>docker network connect"]
    PING -->|نجاح| PORT{"اتصال المنفذ?<br/>nc -zv ب منفذ"]
    PORT -->|فشل| FIX3["المنفذ مكشوف?<br/>هل ب تستمع على المنفذ الصحيح?"]
    PORT -->|نجاح| APP{"بروتوكول التطبيق?<br/>اختبار curl/wget"]
    APP -->|فشل| FIX4["تحقق من إعدادات التطبيق<br/>متغيرات البيئة/URL"]
    APP -->|نجاح| OK["✅ التواصل يعمل بشكل صحيح"]

▶ مثال: أوامر استكشاف أخطاء شبكة الحاويات (الصعوبة: ⭐⭐)

BASH
# الخطوة 1: التحقق من تحليل DNS
docker exec api nslookup db
docker exec api getent hosts db

# الخطوة 2: اختبار الاتصال الأساسي
docker exec api ping -c 2 db

# الخطوة 3: اختبار منفذ محدد
docker exec api nc -zv db 5432
# أو باستخدام wget
docker exec api wget -qO- http://api:8080/health

# الخطوة 4: التحقق من واجهات شبكة الحاوية
docker exec api ip addr

# الخطوة 5: التحقق من جدول التوجيه
docker exec api ip route

▶ مثال: docker network connect للانضمام الديناميكي إلى شبكة (الصعوبة: ⭐⭐)

BASH
# توصيل حاوية قيد التشغيل بشبكة أخرى
docker network connect backend-net web

# قطع الاتصال من شبكة
docker network disconnect frontend-net web

# التحقق من شبكات الحاوية
docker inspect web --format='{{json .NetworkSettings.Networks}}' | python3 -m json.tool


8. تصميم عزل مجموعة الأمان

(1) نموذج العزل ثلاثي الطبقات

طبقة الشبكة الحاوية قابل للوصول المنفذ الخارجي
شبكة الواجهة الأمامية Nginx/CDN شبكة الخلفية فقط 80, 443
شبكة الخلفية API/Worker شبكة DB فقط لا شيء (عبر وكيل Nginx)
شبكة DB PostgreSQL/Redis لا وصول خارجي لا شيء
🔒 الأمان: قاعدة البيانات موجودة حصريًا في شبكة DB؛ حاويات الواجهة الأمامية لا يمكنها الوصول إلى قاعدة البيانات مباشرة — يجب أن تمر عبر API الخلفية. هذا يتبع مبدأ "أقل امتياز".



9. مثال كامل: إعداد شبكة الخدمات المصغرة واستكشاف الأخطاء

BASH
# ============================================
# شرح كامل: شبكة الخدمات المصغرة
# يغطي: الشبكات، الأسماء المستعارة، العزل، التصحيح
# ============================================

# 1. إنشاء شبكات معزولة
docker network create frontend-net
docker network create backend-net
docker network create db-net

# 2. بدء قاعدة البيانات (db-net فقط)
docker run -d --name postgres \
  --network db-net \
  --network-alias=database \
  --network-alias=primary-db \
  -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 \
  --network-alias=api-server \
  -e DATABASE_URL="postgresql://postgres:secret@primary-db:5432/myapp" \
  myapp-api:1.0

docker network connect db-net api

# 4. بدء Nginx (frontend-net + backend-net)
docker run -d --name nginx \
  --network frontend-net \
  --network-alias=gateway \
  -p 8080:80 \
  nginx:1.25-alpine

docker network connect backend-net nginx

# 5. التصحيح: التحقق من الاتصال
echo "=== تحليل DNS ==="
docker exec nginx nslookup api-server
docker exec api nslookup primary-db

echo "=== اتصال المنافذ ==="
docker exec nginx nc -zv api-server 5000
docker exec api nc -zv primary-db 5432

echo "=== فحص العزل ==="
docker exec nginx sh -c "timeout 2 nc -zv primary-db 5432 2>&1 || echo 'محظور: nginx لا يمكنه الوصول إلى db مباشرة (متوقع)'"

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

❓ أسئلة شائعة

س هل تم إهمال --link؟
ج نعم. جعل Docker رسميًا --link مهملاً ويوصي باستخدام الشبكات المخصصة + DNS. مشاكل --link تشمل: اتصالات أحادية الاتجاه، عناوين IP لا تتحدّث بعد إعادة التشغيل، وعدم دعم Compose. الشبكات المخصصة تحل جميع هذه المشاكل.
س هل أسماء الحاويات فريدة عبر الشبكات المختلفة؟
ج أسماء الحاويات فريدة عالميًا على مضيف Docker. ومع ذلك، تحليل DNS يحدث على مستوى الشبكة — فقط الحاويات على نفس الشبكة يمكنها تحليل بعضها البعض باسم الحاوية. للتحليل عبر الشبكات، يجب أولاً إضافة docker network connect.
س كيف يمكنني ضمان أن حاوية لا يمكن الوصول إليها إلا بواسطة حاويات محددة؟
ج استخدم عزل الشبكة. ضع الخدمة التي تريد حمايتها (مثل قاعدة البيانات) في شبكة مخصصة، وأضف فقط الحاويات التي تحتاج إلى الوصول إليها إلى تلك الشبكة. على سبيل المثال، إذا كانت قاعدة البيانات في db-net، فقط API تُضاف إلى db-net، لذا لا يمكن لـ Nginx الوصول إلى قاعدة البيانات مباشرة.
س ماذا أفعل إذا تعرضت حاوية لانتهاء مهلة DNS؟
ج عادة ما تحدث انتهاء مهلة DNS بسبب: ① الحاوية ليست على نفس الشبكة (الأكثر شيوعًا)؛ ② خطأ إملائي في اسم الحاوية؛ ③ مشاكل ذاكرة DNS المؤقتة (إعادة تشغيل الحاوية يحل هذا). استكشاف الأخطاء: docker exec <حاوية> nslookup <هدف> تحقق من نتائج التحليل.
س كيف أعرض عنوان IP الفعلي للحاوية؟
ج docker inspect <حاوية> --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'. أو ادخل الحاوية ونفذ ip addr / hostname -I. لكن تذكر: عنوان IP قد يتغير، لذا استخدم اسم الحاوية بدلاً من عنوان IP في كود الإنتاج.

📖 ملخص


📝 تمارين

  1. تمرين أساسي (الصعوبة: ⭐): أنشئ شبكتين مخصصتين، وابدأ حاوية في كل منهما، وتحقق من أن تحليل DNS لأسماء الحاويات داخل نفس الشبكة يعمل بشكل صحيح.
  2. تمرين متقدم (الصعوبة: ⭐⭐): تحقق من أن الحاويات عبر الشبكات لا يمكنها ping بعضها البعض، ثم أنشئ اتصالاً باستخدام docker network connect، ثم افصله.
  3. سؤال تحدي (الصعوبة: ⭐⭐⭐): استخدم docker exec + nc / wget لاستكشاف السبب الجذري لعدم قدرة حاوية على الوصول إلى خدمة حاوية أخرى. صف خطوات استكشاف الأخطاء واستنتج.
Web-Tutorial.com

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

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

100%