- المبادئ الأساسية لتعيين منافذ الحاويات
- تحديات إضافة تعيينات المنافذ ديناميكيًا
- 2.1 إنشاء حاوية وكيل باستخدام docker network
- 2.2 إضافة قواعد إعادة توجيه المنافذ يدويًا باستخدام iptables
- 2.3 استخدام socat لإنشاء إعادة توجيه المنافذ
- 2.4 تحديث الخدمات ديناميكيًا باستخدام Docker Compose
- 2.5 تعديل ملف تكوين الحاوية بالقوة
يعد تعيين المنافذ جانبًا حاسمًا في تطوير ونشر التطبيقات المعبأة في حاويات. عادةً، نقوم بإنشاء اتصال بين المنفذ الداخلي للحاوية ومنفذ على جهاز المضيف عند إنشاء الحاوية. ومع ذلك، هناك حالات قد نحتاج فيها إلى إضافة تعيينات منافذ جديدة ديناميكيًا إلى حاوية قيد التشغيل بالفعل. يمكن أن يكون هذا مفيدًا بشكل خاص أثناء التطوير أو التصحيح أو عند كشف نقاط نهاية خدمة جديدة مؤقتًا. ستقدم هذه المقالة شرحًا تفصيليًا حول كيفية إضافة تعيينات المنافذ ديناميكيًا إلى حاوية دون الحاجة إلى إيقافها.
1. المعرفة الأساسية
المبادئ الأساسية لتعيين منافذ الحاويات
في Docker، يتم تسهيل الاتصال بين المنفذ الداخلي للحاوية ومنفذ جهاز المضيف من خلال تعيين المنافذ. عادةً، نقوم بتحديد تعيينات المنافذ باستخدام المعاملات -p أو --publish عند بدء تشغيل الحاوية، كما هو موضح أدناه:
docker run -d -p 8080:80 nginx
يقوم الأمر أعلاه بتعيين المنفذ 8080 على جهاز المضيف إلى المنفذ 80 داخل الحاوية. ونتيجة لذلك، يمكن للمستخدمين الخارجيين الوصول إلى خدمة الويب التي تعمل داخل الحاوية من خلال المنفذ 8080 على المضيف.
تحديات إضافة تعيينات المنافذ ديناميكيًا
بمجرد بدء تشغيل الحاوية، لا يدعم Docker عادةً إضافة تعيينات منافذ جديدة ديناميكيًا. بمعنى آخر، تظل تعيينات المنافذ الأولية ثابتة طوال دورة حياة الحاوية. إذا كنت بحاجة إلى إضافة المزيد من تعيينات المنافذ، فإن النهج التقليدي يتضمن إيقاف الحاوية وإعادة تشغيلها، مما قد يؤدي إلى تعطيل الخدمات وهو أمر غير مقبول في بيئات الإنتاج.
2. حلول التنفيذ
لإضافة تعيينات المنافذ ديناميكيًا إلى حاوية قيد التشغيل، يمكن استخدام عدة طرق:
2.1 إنشاء حاوية وكيل باستخدام docker network
يمكن إنشاء حاوية وكيل جديدة في نفس شبكة الحاوية الأصلية، ويمكن إضافة تعيينات المنافذ الجديدة إلى حاوية الوكيل. الخطوات المحددة هي كما يلي: أولاً، قم بإنشاء حاوية وكيل على نفس شبكة الحاوية الأصلية:
docker run -d --name proxy-container --net container:your-container nginx
ثم، أضف تعيين المنفذ المطلوب إلى حاوية الوكيل:
docker run -d -p 8081:81 --net container:your-container nginx
استخدم الكود بحذر. بينما تسمح هذه الطريقة بإضافة تعيينات منافذ جديدة دون تعديل الحاوية الأصلية، إلا أنها تقدم مثيل حاوية إضافي وقد لا تكون مناسبة لجميع السيناريوهات.
2.2 إضافة قواعد إعادة توجيه المنافذ يدويًا باستخدام iptables
من خلال تعديل iptables، يمكنك إعادة توجيه الطلبات من منفذ معين على جهاز المضيف إلى المنفذ الداخلي للحاوية قيد التشغيل. على سبيل المثال، لتعيين المنفذ 8081 على المضيف إلى المنفذ 81 في الحاوية، استخدم الأمر التالي:
iptables -t nat -A DOCKER -p tcp --dport 8081 -j DNAT --to-destination <container_ip>:81
حيث <container_ip> هو عنوان IP الداخلي للحاوية، والذي يمكن الحصول عليه باستخدام الأمر docker inspect. توفر هذه الطريقة مرونة كاملة في إضافة تعيينات المنافذ ولكنها تتطلب فهمًا جيدًا لـ iptables ولا يُنصح باستخدامها بشكل متكرر في بيئات الإنتاج بسبب تعقيدها.
2.3 استخدام socat لإنشاء إعادة توجيه المنافذ
socat هي أداة شبكات متعددة الاستخدامات يمكنها إنشاء إعادة توجيه المنافذ بين جهاز المضيف والحاوية. يمكنك تشغيل الأمر التالي لإعادة توجيه منفذ معين على جهاز المضيف إلى منفذ مخصص في الحاوية:
socat TCP-LISTEN:8081,fork TCP:<container_ip>:81
استخدم الكود بحذر. تتمثل ميزة هذه الطريقة في أنها لا تتطلب إيقاف الحاوية. ومع ذلك، نظرًا لأن socat هو عملية إضافية، يجب الانتباه إلى أدائها واستقرارها. يمكن لأدوات إعادة توجيه المنافذ الأخرى تحقيق نتائج مماثلة.
2.4 تحديث الخدمات ديناميكيًا باستخدام Docker Compose
إذا كان تطبيقك يستخدم Docker Compose لإدارة الحاويات، فيمكنك إضافة تعيينات منافذ جديدة عن طريق تحديث ملف docker-compose.yml ثم تنفيذ docker-compose up. هذه الطريقة مريحة وتوفر إدارة موحدة، لكن كل تحديث يتطلب إعادة تطبيق ملف Compose، مما قد يؤدي إلى انقطاعات مؤقتة في الخدمة.
2.5 تعديل ملف تكوين الحاوية بالقوة
أولاً، قم بتعديل الملف /var/lib/docker/containers/<container_id>/config.v2.json مباشرة، مع إضافة تعيين HostPort 8081 إلى المنفذ 81 في الحاوية. لاحظ أنك بحاجة إلى تعديل قسمين. في قسم واحد، تحتاج فقط إلى إضافة HostPort 8081:
"ExposedPorts": {
"8080/tcp": {}
"8081/tcp": {}
},
في القسم الآخر، تحتاج إلى إضافة علاقة التعيين الكاملة:
"Ports": {
"80/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "8080"
},
],
"81/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "8081"
},
]
},
بالإضافة إلى ذلك، تحتاج أيضًا إلى تعديل /var/lib/docker/containers/<container_id>/hostconfig.json وإضافة التعيين الجديد:
"PortBindings": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "8080"
},
"81/tcp": [
{
"HostIp": "",
"HostPort": "8081"
}
]
},
أخيرًا، تحتاج إلى إعادة تشغيل dockerd:
sudo systemctl restart docker
يمكن لهذه الطريقة إضافة تعيينات المنافذ بشكل دائم إلى الحاوية، ولكن لها أيضًا تأثير جانبي يتمثل في إيقاف جميع الحاويات على جهاز المضيف بسبب إعادة تشغيل dockerd. إذا لم يتم تكوين الحاويات للبدء التلقائي، فلن تبدأ تلقائيًا حتى بعد إعادة تشغيل dockerd. على الرغم من فعالية هذه الطريقة، إلا أنها يمكن أن تؤثر بشكل كبير على الحاويات قيد التشغيل ولا يُنصح بها في بيئات الإنتاج.
3. الاستنتاج
على الرغم من أن إضافة تعيينات المنافذ ديناميكيًا إلى الحاويات ليست ميزة أصلية في Docker، إلا أن الطرق الموصوفة أعلاه يمكن أن تساعد في تحقيق ذلك إلى حد ما. لكل طريقة مزاياها وعيوبها، ويمكن للمطورين اختيار الأنسب بناءً على احتياجاتهم الخاصة. في بيئات الإنتاج، يُنصح باستخدام حاويات الوكيل أو Docker Compose لأنها بسيطة نسبيًا وأقل خطورة. بالنسبة للتطبيقات التي تتطلب تغييرات متكررة في تعيينات المنافذ، يُنصح بالنظر في بنية شبكة مرنة أثناء مرحلة التصميم لتجنب التعديلات المتكررة على تعيينات المنافذ أثناء تشغيل الحاوية، وبالتالي تقليل انقطاعات الخدمة.
يمكنك زيارة Novita AI
