فهم تقنية الحاويات
الحاويات هي نوع من تقنيات الصندوق الرملي (sandbox). كما يشير الاسم، الصندوق الرملي هو تقنية يمكنها “تغليف” التطبيقات مثل الحاوية، مما يضمن عدم تداخل التطبيقات مع بعضها البعض بسبب الحدود الموضوعة. علاوة على ذلك، يمكن ترحيل التطبيقات الموجودة داخل هذه “الحاويات” وتشغيلها في بيئات نظام مختلفة. قبل الغوص في المبادئ الكامنة وراء تقنية الحاويات، من الضروري فهم مفهوم العمليات. التمثيل الثابت للعملية هو برنامج، يبقى عادةً هادئًا على القرص. بمجرد تشغيله، يتحول إلى مجموع البيانات والحالات داخل الكمبيوتر - تمثيله الديناميكي. الوظيفة الأساسية لتقنية الحاويات هي إنشاء “حدود” للعمليات عن طريق تقييد وتعديل سلوكياتها الديناميكية.
تقنية حاويات Docker
بالنسبة لمعظم حاويات Linux، بما في ذلك Docker، تُستخدم تقنية Cgroups بشكل أساسي لفرض القيود، بينما تُعد تقنية Namespace الطريقة الأساسية لتعديل منظور العملية. تخيل أن لديك مشروع Docker يعمل على نظام تشغيل Linux، مثل Ubuntu 22.04. لنقم بإنشاء حاوية للتجربة:
$ docker run -it busybox /bin/sh
يبدأ أمر Docker هذا حاوية بناءً على صورة busybox ويقوم بتشغيل جلسة شيل تفاعلية داخلها.
docker run: ينشئ ويبدأ مثيل حاوية جديد.-i: يبقي STDIN مفتوحًا حتى بدون طرفية متصلة، مما يسمح بالتفاعل مع الحاوية.-t: يعين طرفية زائفة أو طرفية، مما يخلق بيئة شيل تفاعلية./bin/sh: يحدد الأمر الذي سيتم تشغيله عند بدء الحاوية، والذي في هذه الحالة، يطلق جلسة شيل داخل الحاوية.
العمليات داخل الحاوية
وبالتالي، يصبح جهاز Ubuntu مضيفًا، وتعمل حاوية تشغل /bin/sh داخله. يجب أن يكون هذا المثال ومبدأه الأساسي مألوفين لمستخدمي Docker المتمرسين. إذا قمت بتنفيذ الأمر ps داخل الحاوية، ستلاحظ شيئًا مثيرًا للاهتمام:
/ # ps
PID USER TIME COMMAND
1 root 0:00 /bin/sh
10 root 0:00 ps
هنا، /bin/sh الأولي الذي تم تنفيذه داخل Docker هو العملية رقم 1 (PID=1) داخل الحاوية، مع تشغيل عمليتين فقط. هذا يعني أن /bin/sh وأمر ps الذي نفذناه للتو قد تم عزلهما في بيئة منفصلة عن المضيف.
آلية Namespace
كيف يتم تحقيق ذلك؟ عادةً، عندما يعمل برنامج /bin/sh على المضيف، يقوم نظام التشغيل بتعيين معرف عملية له، مثل PID=100، والذي يعرفه بشكل فريد. عند تشغيل هذا البرنامج داخل حاوية Docker، يطبق Docker “وهمًا” بحيث تعتقد العملية، التي هي في الواقع PID=100، أنها العملية الأولى (PID=1). تقوم هذه الآلية بالتلاعب بمساحة العمليات للتطبيقات المعزولة، مما يسمح لها برؤية معرفات العمليات المعاد حسابها.
تقنية Namespace في Linux
استخدام Namespaces مثير للاهتمام: إنه مجرد معامل اختياري لإنشاء عمليات جديدة في Linux. استدعاء النظام لإنشاء العمليات في Linux هو clone()، كما يلي:
int pid = clone(main_function, stack_size, SIGCHLD, NULL);
يقوم هذا الاستدعاء بإنشاء عملية جديدة وإرجاع معرف العملية pid. عند استخدام استدعاء النظام clone() لإنشاء عملية جديدة، يمكن تحديد وسيطة CLONE_NEWPID:
int pid = clone(main_function, stack_size, CLONE_NEWPID | SIGCHLD, NULL);
سترى العملية المنشأة حديثًا مساحة عملية جديدة حيث يكون PID الخاص بها هو 1. هذا “الوهم” لا يغير PID الفعلي في مساحة عملية المضيف، والذي يظل القيمة الحقيقية، مثل 100.
تطبيق Namespaces المتعددة
التنفيذ المتكرر لاستدعاء clone() أعلاه سينشئ مساحات PID Namespace متعددة. تعتقد عمليات التطبيق في كل Namespace أنها العملية الأولى داخل حاوياتها الخاصة، غير مدركة لمساحة عملية المضيف الفعلية أو تفاصيل مساحات PID Namespace الأخرى. بالإضافة إلى PID Namespace، يقدم Linux مساحات Mount، UTS، IPC، Network، و User Namespace “لإخفاء” سياقات العملية المختلفة.
Mount Namespace
- Mount Namespace: يسمح للعمليات المعزولة برؤية نقاط التحميل ذات الصلة فقط بـ Namespace الحالي، مما يعني أن العمليات داخل الحاوية غير مدركة لنقاط التحميل الأخرى على المضيف.
Network Namespace
- Network Namespace: يوفر للعمليات المعزولة رؤية لأجهزة الشبكة والإعدادات الخاصة بـ Namespace الحالي. كل Network Namespace له أجهزة الشبكة الخاصة به، عناوين IP، جداول التوجيه، وأرقام المنافذ، منفصلة عن المضيف ومساحات Namespace الأخرى.
مساحات Namespace الأخرى
- UTS Namespace: يعزل معلومات اسم العقدة (hostname) واسم المضيف الشبكي.
- IPC Namespace: يفصل موارد الاتصال بين العمليات، مثل قوائم الرسائل والإشارات.
- User Namespace: يعزل معرفات المستخدم والمجموعة، مما يتيح تعيين معرفات المستخدمين في الحاوية إلى معرفات مختلفة على المضيف لتعزيز الأمان.
مبدأ تنفيذ حاويات Docker
هذا هو المبدأ الأساسي لتنفيذ حاويات Linux. وبالتالي، فإن مفهوم حاويات Docker الذي يبدو معقدًا يتضمن في الأساس تحديد مجموعة من معاملات Namespace عند إنشاء عملية حاوية. وبالتالي، يمكن للحاوية فقط “رؤية” الموارد والملفات والأجهزة والحالات أو الإعدادات المحدودة بواسطة Namespace الحالي، وتبقى غير مدركة تمامًا للمضيف والبرامج غير ذات الصلة.
مقارنة الحاويات بالآلات الافتراضية
الحاويات، إذن، هي نوع خاص من العمليات. عند التفكير في فكرة تخصيص مساحة مستقلة للعمليات، تتبادر إلى الذهن الآلات الافتراضية. إنها تحاكي الأجهزة من خلال برنامج Hypervisor، وتشغل نظام تشغيل ضيف كامل لتحقيق عزل التطبيقات. في المقابل، تحقق حاويات Docker العزل من خلال تقنيات Namespace و Cgroups بينما تشارك نواة نظام تشغيل المضيف.
المحاكاة الافتراضية الخفيفة لـ Docker
غالبًا ما يشار إلى Docker باسم تقنية المحاكاة الافتراضية “الخفيفة” لأنه يستخدم مباشرة موارد المضيف دون الحاجة إلى محاكاة الأجهزة أو تشغيل نظام تشغيل إضافي. يؤدي هذا إلى مزايا كبيرة مقارنة بالآلات الافتراضية التقليدية من حيث سرعة البدء واستخدام الموارد والأداء.
الخلاصة
توفر تقنية حاويات Docker بيئة معزولة ولكن خفيفة الوزن لعمليات التطبيق من خلال تقنيات Namespace و Cgroups. تمكن هذه التقنية الحاويات من البدء بسرعة والعمل بكفاءة والحفاظ على العزل عن المضيف والحاويات الأخرى، مما يجعلها تقنية لا غنى عنها في الحوسبة السحابية الحديثة وهياكل الخدمات المصغرة.
Novita AI، المنصة الشاملة للإبداع غير المحدود التي تمنحك الوصول إلى أكثر من 100 واجهة برمجة تطبيقات (API). من إنشاء الصور ومعالجة اللغة إلى تحسين الصوت ومعالجة الفيديو، نظام الدفع حسب الاستخدام الرخيص يحررك من عناء صيانة وحدة معالجة الرسومات (GPU) أثناء بناء منتجاتك الخاصة. جربها مجانًا.
