مدونة عمار الخوالده

شرح الـ Port Binding مع مثال على تشغيل Web Server بسيط


شرح الـ Port Binding مع مثال على تشغيل Web Server بسيط
سلسلة أساسيات Docker

في الدرس السابق قمنا بتنفيذ أمر php من داخل الحاوية وتعرفنا على مفهوم الـ Volume الذي يمكننا من ربط مجلد على الجهاز المستخدم بمجلد آخر داخل الحاوية مما يمكننا من الوصول للملفات وضمان عدم ضياع الملفات التي يتم انشاؤها من داخل الحاوية.

في هذا الدرس سنقوم بتشغيل Http Server من داخل الحاوية لنتمكن من تشغيل نفس الكود السابق ضمن المتصفح.

تشغيل السيرفر

سأقوم بتشغيل السيرفر على جهازي، سنستخدم الأمر php -S لعمل سيرفر ويب بسيط.

تشغيل سيرفر ويب خارج Docker

بعد تنفيذ الأمر السابق، سيتم تشغيل سيرفر ويب ضمن مجلد المشروع على البورت 8000، وهذه صورة للنتيجة على المتصفح:

نتيجة تشغيل ملف php على الـ Web Server

محاولة تشغيل نفس الأمر داخل الحاوية

لنجرب الآن تنفيذ نفس الأمر السابق داخل الحاوية:

تشغيل سيرفر الويب ضمن حاوية Docker

قد تلاحظ أننا استخدمنا 0.0.0.0 كـ Hostname بدلا من localhost والسبب أن الحاوية مرتبطة بجهازنا على نفس الشبكة، لكن استخدام localhost يعني أن السيرفر سيعمل داخل الحاوية فقط، بينما استخدام 0.0.0.0 يعني السماح للسيرفر بالعمل ضمن الشبكة وخارج الـ Localhost.

تم تشغيل الأمر بنجاح دون مشاكل، لكن نلاحظ أن السيرفر لم يعمل على المتصفح كما ينبغي:

عدم تعرف المتصفح على وجود سيرفر ويب بسبب الـ Port

كما ذكرنا سابقا، حاوية Docker تعمل كبيئة مستقلة عن الجهاز الذي يتم تشغيلها عليه، وهذا يشمل الـ Networking، في المقال السابق قمنا بإنشاء Volume للسماح لـ Docker بالوصول إلى ملفات على الجهاز الذي يعمل عليه والعكس، كذلك نحتاج لعمل Port Binding بحيث نسمح للجهاز (الذي يعمل عليه المتصفح) بالوصول إلى الـ Port الذي تم تشغيل السيرفر عليه داخل الحاوية.

Port Binding

ميزة Port Binding تساعد على تحويل Port محدد داخل شبكة Docker (داخل الـ Container) إلى بورت آخر داخل شبكة الجهاز المستضيف (خارج الـ Container)، فمثلا، لو شغلنا Web Server على الـ Port رقم 8000 داخل الحاوية، فلا يمكن الوصول إليه من الجهاز المستضيف، ولفعل ذلك نقوم باستخدام Port Binding كما في المثال التالي:

إضافة port binding إلى الأمر الخاص بتشغيل الحاوية

الخيار الذي تم إضافته يقوم بتحويل بربط البورت 8000 على شبكة جهازي بالبورت 8000 ضمن الحاوية، النتيجة على المتصفح:

نتيجة التشغيل على المتصفح بعد عمل Port Binding

طبعا بالإمكان التحكم أكثر بالـ Binding لتحويل البورت 8000 داخل الحاوية إلى بورت آخر خارجها:

عمل port binding لـ port مختلف عن الـ port المستخدم داخل الحاوية

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

تشغيل الموقع على المتصفح باستخدام البورت الجديد

مراجعة الأمر

صورة لمراجعة أمر تشغيل الحاوية وخياراته

  1. الخيار v- يستخدم لعمل Mounting لمسار معين في جهاز المستخدم إلى مسار آخر داخل الحاوية (تفاصيل)
  2. الخيار p- يستخدم لعمل Port Binding بحيث يمكن الوصول إلى البورت 8000 الذي تشغل عليه الحاوية خدمة Http من خلال البورت 3000 على الجهاز الذي يشغل الحاوية (تفاصيل)
  3. الخيار w- يستخدم لتحديد الـ Working Directory التي يتم تنفيذ الأوامر بداخلها (تفاصيل)
  4. اسم الحاوية مع الـ Tag الخاص بها
  5. الأمر الذي يتم تنفيذه داخل الحاوية، والأمر المستخدم هنا هو أمر خاص بـ Php لعمل Web Server (تفاصيل)
3 مفهوم الـ Volumes في Docker مع مثال على استخدام PHP CLI
5 التعامل مع الحاويات التي تعمل في الخلفية - Detached Containers

اقرأ أيضا