1.4 · الشبكات : جعل الحاويات تتحاور

المستوى 1 · الحاويات : الصور، المجلدات، الشبكات

1.4الشبكات : جعل الحاويات تتحاور

الهدف: وصل حاويتين بينهما على شبكة مخصصة، دون كشف القاعدة.
الوقت المقدّر: 12 دقيقة · قراءة ذاتية · إذا كان لديك 5 دقائق فقط: اقرأ «الأساسي في 30 ثانية» + المخطط.

الأساسي في 30 ثانية

  • الجسر الافتراضي يعزل دون تسمية : لكل حاوية IP خاص، لكن الأسماء لا تُحل فيه — فنرقّع بـ IP تتغير.
  • شبكة (Network) لكل تطبيق : docker network create monapp ثم --network monapp في كل run — ومن الويب، تُوصَل القاعدة باسمها (bdd:5432).
  • الواجهة منشورة، والقاعدة داخلية : لا ننشر (-p) إلا الويب ؛ وتبقى القاعدة غير مرئية من الخارج لكن قابلة للوصول من الداخل — وinspect وping يثبتان التوصيل.

حالة مستمرة — إدير يوصّل الويب + القاعدة

يكبر عرض إدير : فيجب أن يخاطب واجهته القاعدة باسمها، لا بـ IP مدوّنة على ورقة لاصقة. ينشئ شبكة monapp، ويعيد تشغيل bdd عليها دون نشر منفذها، ثم يعيد تشغيل الويب عليها مع -p 8080:80. ومن الويب، يـ ping bdd : فيجيب بالاسم. وعندما يقترح زميل « نشر القاعدة للتجربة »، يرفض إدير : فكشف Postgres لكل الجهاز لتجربة هو تثبيت عادة خطرة.

تتمة حالة 1.1-1.3 — ينتقل إدير من حاويات معزولة إلى تطبيق موصّل.

1. الشبكة الافتراضية تعزل

تنال كل حاوية IP خاصا على شبكة الجسر الافتراضية، لكن الأسماء لا تُحل فيها : فنرقّع بـ IP تتغير في كل إعادة تشغيل. وترميز IP في الضبط هو برمجة للعطل التالي.

والممارسة الحسنة إنشاء شبكة مخصصة لكل تطبيق : فتفعّل Docker فيها الحل بالاسم.

2. شبكة لكل تطبيق

docker network create monapp ثم --network monapp في run كل خدمة : ومن الويب، تُوصَل القاعدة باسمها (bdd:5432). ولا ننشر (-p) إلا الواجهة ؛ وتبقى القاعدة غير مرئية من الخارج لكن قابلة للوصول من الداخل.

ومخطط « شبكة واحدة، وواجهة منشورة واحدة » هو بالضبط ما سيؤتمته Compose في المستوى 3.

3. الرؤية للتصديق : inspect وping

يُظهر docker network ls وinspect من موصول وأين. ومن حاوية، يثبت ping bdd أو اتصال الحل. والمنهج : أنشئ، وصِل، وأثبت — بهذا الترتيب.

وإذا لم تتراء حاويتان، تحققنا أولا من أنهما تتقاسمان الشبكة نفسها، ثم من أننا نصل الاسم لا IP.

خطأ شائع في الفهم: « البقاء على الجسر الافتراضي مع IP يكفي، ونشر القاعدة يعين على التصحيح ». لا. فدون شبكة مخصصة، لا DNS بالاسم : فـ IP تتغير والضبط ينكسر. ونشر القاعدة « للتجربة » يكشفها لكل الجهاز — ونسيان يكفي لترك Postgres مفتوحة. شبكة مخصصة + أسماء + قاعدة غير منشورة.
شبكة مخصصة : توصيل تطبيق شبكة لكل تطبيق : واجهة منشورة، وقاعدة داخلية شبكة monapp create،واحدة لكل تطبيقوب منشور -p يُوصَلمن الخارجbdd داخلية :5432 تُوصَلبالاسم، ولا تُنشَر أبدا
شبكة لكل تطبيق : واجهة منشورة، وقاعدة داخلية
نص المخطط (SEO / قارئات الشاشة / الترجمة): 1) الإنشاء : ينشئ إدير شبكة monapp — واحدة لكل تطبيق، مسماة بوضوح. 2) التوصيل : يعيد تشغيل bdd عليها دون -p (غير مرئية خارجا)، ويعيد تشغيل الويب عليها مع -p 8080:80 (الواجهة الوحيدة). 3) الإثبات : ping bdd من الويب — فيجيب الحل بالاسم. الدرس : نشر القاعدة كان كشف Postgres لكل الجهاز ؛ ويبقى الاسم bdd:5432 صالحا حتى لو تغيّرت IP.

🔎 مثال ملموس — 🔎 مثال ملموس — ويب + قاعدة على شبكة خاصة

تطبيق إدير الموصّل : واجهة، وقاعدة غير مرئية.

docker network create monapp
docker run -d --name bdd --network monapp -e POSTGRES_PASSWORD=secret postgres:16.4
docker run -d --name web --network monapp -p 8080:80 nginx:1.27
docker exec web ping -c2 bdd

القراءة : ينجح ping بالاسم، دون نشر القاعدة.

الدرس : نشر القاعدة كان كشف Postgres لكل الجهاز.

مفردات القسم

الجسر
مشغّل شبكة معزول افتراضيا بين الحاويات والمضيف ؛ دون حل بالاسم.

مثال بسيط: الشبكة الافتراضية حيث رقّع إدير بـ IP.

ما ليس كذلك: شبكة تطبيق مع DNS بالاسم.

رد فعل: الافتراضي = مؤقت، والتطبيق = شبكة مخصصة.

الشبكة المخصصة
شبكة منشأة لكل تطبيق (network create)، مع حل DNS بالاسم بين حاوياتها.

مثال بسيط: monapp، حيث يصل الويب bdd:5432.

ما ليس كذلك: شبكة لكل حاوية.

رد فعل: افصلوا لكل تطبيق، لا لكل خدمة.

الحل بالاسم
وصول حاوية باسم --name بدلا من IP المتغيرة.

مثال بسيط: ping bdd من الويب، صالح بعد كل إعادة تشغيل.

ما ليس كذلك: IP مرمّزة في الضبط.

رد فعل: الاسم دائما، وليس IP أبدا.

الواجهة
الخدمة الوحيدة المنشورة نحو الخارج (الويب) ؛ وكل الباقي داخلي.

مثال بسيط: وب في 8080:80، وbdd غير منشورة عند إدير.

ما ليس كذلك: كل خدمة منشورة « احتياطا ».

رد فعل: واحدة منشورة : الواجهة.

في التطبيق — عمليا — صِلوا تطبيقا مصغّرا

  1. أنشئوا شبكة monapp.
  2. شغّلوا القاعدة عليها، دون نشر منفذ.
  3. شغّلوا الويب عليها، مع نشر 8080:80.
  4. من الويب (exec)، ping القاعدة باسمها.
تتحاور خدماتكم بالأسماء، بسطح مكشوف أدنى.

نص جاهز — توصيل حاويتين (30 ثانية)

« أنشئ شبكة لكل تطبيق : network create monapp. أصِل القاعدة عليها دون نشر منفذها، والويب عليها مع -p 8080:80. ومن الويب، ping القاعدة باسمها : bdd. فالواجهة منشورة، والقاعدة ليست أبدا. »

يُقال مع كتابة create ثم run ؛ ويُختَم بـ ping ناجح.

قالب جاهز للنسخ — تطبيق بخدمتين

docker network create monapp
docker run -d --name bdd --network monapp -e POSTGRES_PASSWORD=secret postgres:16.4
docker run -d --name web --network monapp -p 8080:80 nginx:1.27
docker exec web ping -c2 bdd   # إثبات بالاسم
docker network ls              # التحقق من التوصيلات

تطبيق إدير

كما أعلاه : monapp، وbdd داخلية، ووب منشور — المخطط الذي سيستعيده Compose تلقائيا في المستوى 3.

تطبيقان يتعايشان

monapp ومحاسبة، شبكتان منفصلتان : فـ bdd كل تطبيق تُوصَل بالاسم دون تراء بين التطبيقين.

تشخيص عطل

حاويتان صمّاوان : تحققوا من network inspect من الجهتين — فتسع مرات من عشر، لا تتقاسمان الشبكة نفسها.

رفض نشر القاعدة

« للتجربة » : لا — فنختبر من الويب مع exec وping، وتبقى القاعدة مغلقة خارجا. عادة خطرة مرفوضة.

✓ ممارسات جيدة

  • شبكة لكل تطبيق، مسماة بوضوح.
  • لا تنشروا إلا الواجهة.
  • صِلوا بالاسم، وليس بـ IP أبدا.

✗ أخطاء شائعة

  • البقاء على الجسر الافتراضي (لا DNS).
  • نشر القاعدة « للتجربة » ثم نسيانها.
  • ترميز IP في الضبط.

النقاط الأساسية

  • الشبكة المخصصة تفعّل DNS بالاسم.
  • القاعدة داخلية، والواجهة منشورة : القاعدة.
  • يثبت inspect وping التوصيل.
  • سيستعيد Compose هذا المخطط تلقائيا.

تحدي 48 ساعة — طبّق غدا

أنشئوا monapp، وصِلوا بها bdd (دون -p) ووب (8080:80)، ثم ping bdd باسمها من الويب. وتحققوا مع network inspect من موصول وأين.

قائمة الخروج من القسم
  • أنشئ شبكة مخصصة لكل تطبيق.
  • لا أنشر إلا الواجهة، وتبقى القاعدة داخلية.
  • أصل الخدمات بالاسم وأثبت بـ ping.
تقييم ذاتي 1-5 : هل قاعدتي قابلة للوصول بالاسم دون نشر؟هل أعرف إثبات التوصيل (inspect وping)؟

أسئلة شائعة

لماذا لا تتراءى حاويتان؟

غالبا لا تتقاسمان الشبكة نفسها، أو نحاول IP بدلا من الاسم. تحققوا من network inspect من الجهتين، ثم صِلوا --name.

هل يلزم شبكة لكل حاوية؟

لا : شبكة لكل تطبيق (ويب + قاعدة + مخبأ معا). افصلوا لكل تطبيق، لا لكل خدمة.

تحقّق من فهمك

على شبكة مخصصة، كيف يصل الويب القاعدة المسماة « bdd »؟

موارد إضافية (اختياري، للتعمّق أكثر)

اختبار المستوى 1أسئلة جديدة وأصعب للتحقق من مكتسباتك