docker ecosystem مقدّمة عن المُكوّنات المُشترَكة في Docker


محمد أحمد العيل

وفّر Docker للعديد من المُطوّرين ومُدراء الأنظمة منصّة سهلة تسمح لهم ببناء ونشر تطبيقات قابلة للتّوسّع. سنستعرض في هذه السلسلة (Docker Ecosystem)  كيف يوفّر Docker والمُكوّنات التّي صُمّمت للتكامل معه الأدوات اللازمة لتوفير تطبيقات مُوزّعة عالية التّوفر

1- مقدّمة

يُطلَق مصطلح إعداد الحاويات Containerization على نشر وتوزيع التّطبيقات بشكل محمول ويُمكن التنبؤ به predictable. نلجأ - للحصول على هيئة النّشر والتّوزيع المذكورة آنِفًا - إلى تحزيم العناصِر واعتماديّاتِها في بيئة عمليّات قيّاسيّة، معزولة وخفيفة تُسمَّى حاويّة Container.

تهتمّ الكثير من المنظَّمات الآن بتصميم تطبيقات وخدمات يسهُل توزيعها ونشرُها عبر نُظُم موّزَّعَة ممّا يُمكِّن من التّوسّع Scale بسهولة والتّغلّب على إخفاق التّطبيقات والأجهزة أثناء العمل. حفَّز Docker -الّذي هو منصّة لإعداد الحاويّات أُعِدَّ لتبسيط وتوحيد معايير النّشر في بيئات مختلفة- تبنّي هذا الأسلوب في تصميم وإدارة الخدمات؛ إذ أنّ الكثير من البرامج أُنشِئت لتتّخد من هذا الأسلوب في الإدارة المُوَزَّعة للحاويّات، قاعدةً تُبنى عليها.

2- إعداد حاويّات Docker

على الرّغم من وجود أنظمة أخرى لإعداد الحاويّات إلا أنّ Docker هو الأكثر استخداما هذه الأيّام نظرًا للبساطة الّتي يوفّرها في إنشاء وإدارة الحاويّات إضافةً إلى سهولة إدماجه في عدد من المشاريع مفتوحة المصدر.

01_الحاويات_نظرة_عامة.th

يُمكن، في الصّورة السّابقة، رؤية كيف ترتبط الحاويّات مع نظام التّشغيل المُستضيف (عَرض مُبسَّط). تعزِل الحاويّات كلّ تطبيق على حِدة مع استغلال موارد نظام التّشغيل الّتي يعمل Docker على تقديمها بطريقة مُجرّدة Abstracted (لا تظهر التّعقيداتُ المُصاحِبة لهذه الموارد للتّطبيقات، حيثُ يتولّى Docker التعاملَ معها). نرى في الجانب الأيمن أنّه يُمكن بناء الحاويّات اعتمادًا على طبقات Layers؛ بحيثُ تشترك عدّة حاويّات في الطّبقات الموجودة في الأساس وبالتّالي التّقليل من استخدام الموارد.

المزايا الأساسيّة لـ Docker هيّ:

  • التّخفيف من استخدام الموارد: تعمل الحاويّات على مستوى الـ Process وتستخدم نواة Kernel نظام التّشغيل المُستضيف ، بدلًا من الحوسبة التّخيّليّة Virtualization لكل نظام التّشغيل.

  • قابليّة النّقل Portability: تُضَمَّن كلّ اعتماديّات التّطبيق داخل الحاويّة ممّا يسمح بتشغيل التّطبيق على أي مستضيف يعمل عليه Docker.

  • إمكانية التّنبؤ Predictability: لا يهتمّ النّظام المُستضيف بما يجري داخل الحاويّة، كما أنّ الحاويّة لا تهتمّ بماهيّة نظام التّشغيل الذّي تعمل عليه، فالواجهات Interfaces معياريّة ويُمكن التّنبّؤ بالتّفاعلات بين العناصِر.

من الأفضل، عند تصميم تطبيق يستخدم Docker، تقسيمُ وظائفه بين عدّة حاويّات. تُسمّى هذه الطّريقة ببُنية خَدَميّة التّوجّه Service-oriented architecture. يمنح هذا التّصميم سهولةً عند التّوسّع أو أثناء تحديث العناصِر المكوّنة للتّطبيق في المستقبل، كلٌّ على حِدَة. يُنظَر لهذه المرونة على أنّها أحد أهم أسباب اللّجوء إلى Docker للتّطوير والنّشر.

3- استكشاف الخدمة Service discovery ومخازن الإعداد العامّة Global Configuration Stores

استكشاف الخدمة هو أحد عناصرِ إستراتيجيّةٍ شاملة تهدِف إلى جعل نشر الحاويّات مرِنًا وقابِلًا للتّوسّع. يُمكِن للحاويّات عبر استكشاف الخدمة العثورُ على معلومات عن بيئةٍ مّا، دون الحاجة للتّدخّل البشري. يُمكِن للحاويّات مثلًا العثورُ على معلومات الاتّصال بالعناصر الّتي يجب عليها الاتّصال بها، كما يُمكنها تسجيل أنفسها لتعرف بقيّةُ الأدوات أنها مُتاحة. تعمل هذه الأدوات عادةً على شكل مخازن إعدادات عامّة موزَّعة، يُمكِن عبرها ضبطُ خيارات إعدادٍ للخدمات العامِلة ضمن البنية التّحتيّة التّي تشغِّلها.

02_عمل_خدمة_الاستكشاف.th

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

تُنجَز هذه الأدوات عادةً على شكل مخازن ذات صيغة مفتاح-قيمة Key-value (جدول من عموديْن، في الأوّل يوجد مفتاح وفي الثّاني قيمة لهذا المفتاح) موّزعة بين عدّة مستضيفات ضمن بيئة عنقوديّة Clustered. تُوفِّر المخازن المذكورة واجهةَ تطبيقات برمجيّة Application programming interface, API يُتوَصَّل إليها عبر ابروتوكول HTTP لقراءة وضبط القِيّم. تُضيف بعض المخازن إجراءاتٍ أمنيةً مثل تعميّة (تشفير) Encryption المُدخَلات وآليّات التّحكّم في الوصول Access control. المخازن المُوَزَّعة أساسيّة لإدارة عنقود من مستضيفات Docker زيادةً على وظيفتها الأولى التّي هيّ توفير تفاصيل الإعداد الذّاتي للحاويّات الجديدة.

في ما يلي بعض مسؤوليّات مخازن استكشاف الخدمة:

  • السّماح للتّطبيقات بالحصول على البيانات المطلوبة للاتّصال بالخدمات التّي تعتمد عليها.

  • السّماح للتّطبيقات بتسجيل بيانات الاتّصال بها، وهو ما يُمكّن من القيام بالمسؤوليّة السّابقة.

  • توفير مساحةٍ يُمكن للجميع الوصولُ إليها لتخزين بيانات ضبط الإعدادات.

  • تخزين معلومات الأعضاء في العنقود حسب حاجة برنامج إدارة العنقود.

في ما يلي أدوات شهيرة لاستكشاف الخدمة مع بعض المشروعات المتعلِّقة بها:

  • etcd: استكشاف الخدمة. مخزن مُوزَّع يستخدم صيغة مفتاح-قيمة.

  • consul: استكشاف الخدمة. مخزن مُوزَّع يستخدم صيغة مفتاح-قيمة.

  • zookeeper: استكشاف الخدمة. مخزن مُوزَّع يستخدم صيغة مفتاح-قيمة.

  • crypt: مشروع لتعميّة المُدخلات في أداة etcd.

  • confd: تُراقِب مخازن تستخدم صيغة مفتاح-قيمة بحثًا عن تغييرات ثم تعمَد إلى إعداد الخدمات بالقيّم الجديدة.

4- أدوات التّشبيك Networking

تستجيب التّطبيقات التّي تعمل ضمن حاويّات إلى تصميم خَدَميّ التوجّه يُشجّع على تقسيم الوظائف بين عدّة عناصِر أقلَّ تعقيدًا. يُتيح هذا الأسلوب في التّصميم سهولةً في الإدارة والتّوسّع، ولكنّه يتطلّب تأمينًا وثباتًا أكثر في تشبيك مختلف العناصر مع بعضها. يُوفِّر Docker في هذا الإطار البُنية الأساسيّة لتأمين التّواصل بين الحاويّات Container-to-container وبين الحاويّات والمُستضيف Container-to-host.

يُتيح Docker افتراضيًا آليّتيْن لربط الحاويّات معًا. الأولى هي عرض منافذ Ports الحاويّة، عبر النظام المُستضيف للتوجيه Routing إلى الخارج، وذلك بشكل اختياري. يُمكِن تعيين منفذ من الحاويّة إلى منفذ في النّظام المُستضيف أو السّماح لDocker باختيّار منفذ عالٍ (منفذ ذو رقم أعلى) غير مُستخدَم. هذه طريقة عامّة تعمل في أغلب الحالات لتوفير الولوج إلى الحاويّة.

الطّريقة الثّانيّة هيّ السّماح للحاويّات بالتّواصل عن طريق "روابط" Docker. تحصُل الحاويّات في هذه الحالة على معلومات عن الحاويّة الموجودة على الطّرف الآخر من الرابط؛ ممّا يسمح لها بالاتصال مباشرة إذا كانت مضبوطة للإنصات لمعلومات الطّرف الآخر. تُتاح عبر هذه الطّريقة إمكانيّةُ الاتّصال بين حاويّات موجودة على نفس المُستضيف دون الحاجة لمعرفة منفَذ أو عنوان الخدمة سَلفًا.

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

  • تعديل آلية التّشبيك لإنشاء فضاء عناوين سهل ومُوحَّد بين عدّة مستضيفات.

  • شبكات افتراضيّة خاصّة Virtual private networks لتأمين الاتّصالات بين مختلف المُكوِّنات.

  • تعيين شبكات فرعيّة Sub networks حسب المُستضيف أو حسب التّطبيق.

  • التّأسيس لواجهات اتّصال عبر شبكات محليّة افتراضيّة من النّوع الثّاني (VLAN 2/Macvlan).

  • إعداد وتخصيص عناوين MAC وبوّابات Gateways، ..إلخ للحاويّات.

المشاريع التّالية تعمَل على التّحسين من إدارة الشّبكات في Docker:

  • flannel: إضافة طبقة فوقَ آليّة التّشبيك للحصول على شبكات فرعيّة مستقلَّة لكل مُستضيف.

  • weave: جعل كل الحاويّات ضمن نفس الشّبكة عبر إعادة تمثيل بنية التّشبيك.

  • pipework: مجموعة أدوات للإعداد المتقدِّم للشّبكات.

5- الجدولة Scheduling، إدارة العنقود والتّنسيق Orchestration

المُجدوِل Scheduler هوالآخر عنصر مطلوب لبناء بيئة عنقوديّة للحاويّات. تتولّى المُجدوِلات بدْء تشغيل الحاويّات على المُستضيفات المُتاحة.

03_مثال_لجدولة_تطبيق.thum

تُوضِّح الصورة أعلاه نموذجًا مبسَّطًا لاتخاذ قرار الجدولة. يأتي الطّلب للمُجدوِل عبر واجهة تطبيقات برمجية API أو عن طريق أداة إدارة؛ يُقدِّر المُجدوِل بعدها شروط الطّلب وحالة المُستضيفات المُتاحة. يسحب المُجدوِل في المثال معلومات عن كثافة وتمركز الحاويات من مخزن مُوزَّع للبيانات واستكشاف الخدمة (كما تطرَّقنا له سابقًا)، ممّا يُمكّنه من اختيار المُستضيف الأقل انشغالًا للتّطبيق الجديد.

تقع عمليّة اختيار المُستضيف في قلب مهام المُجدوِل، وتوجد لديه عادةً دوّال Functions لأتمَمة Automate هذه العمليّة مع ترك خيّار يُمكّن المُدير من تحديد بعض القيود. من الأمثلة على هذه القيود:

  • جدولة الحاويّة للعمل على نفس المُستضيف الذي تعمل عليه حاويّة أخرى مُعطاة.

  • التّأكّد من عدم وضع حاويّة على مُستضيف تعمل عليه حاويّة أخرى مُعطاة.

  • وضع حاويّة على مُستضيف يتطابق مع بيانات وصفيّة Metadata أو علامة مُعطاة.

  • وضع الحاويّة على المُستضيف الأقل نشاطًا.

  • تشغيل الحاويّة على جميع المُستضيفات المُكوِّنة للعنقود.

يهتم المُجدوِل بتحميل الحاويّات إلى المستضيفات المناسِبة إضافةً إلى بدْء تشغيلها، إيقافها وإدارة دورة حياة العمليّة ككلّ. تُضمَّن عادةً وظائفُ إدارة العنقود إلى المُجدوِل نظرًا لضرورة تفاعله مع كل مستضيف من المجموعة المكوِّنة للعنقود، وهو ما يُعطي للمُجدوِل القدرةَ على الحصول على معلومات عن مكوّنات العنقود والقدرة على إجراء مهام إداريّة. يُشير التّنسيق في هذا الإطار إلى المُزاوجة بين جدولة الحاويّات وإدارة المُستضيفات.

المشاريع التالية من الأشهر في تقديم أدواتٍ للجدولة والإدارة:

  • fleet: أداة للجدولة وإدارة العناقيد.

  • marathon: مُجدوِل ومُدير خدمات.

  • Swarm: مُجدوِل ومُدير خدمات.

  • mesos: خدمة لإسناد وتوطيد موارد المُستضيف لاستغلالها من طرف المُجدوِل.

  • kubernetes: مُجدوِل متقدِّم يستطيع إدارة الحاويّات على شكل مجموعات.

  • compose: أداة تنسيق لإنشاء مجموعات حاويّات.

خاتمة

يُقدّم Docker عبر المشاريع الدّاعمة له أدواتٍ لإدارة البرامج، التصميم، وإستراتيجيةً للنشر تُعطي المرونة في التوسّع الشّامل. بعد النّظرة العامة التي قدّمتْها الفقرات السّابقة يُمكن الانتقال إلى دراسة وفهم القدرات التي توفرها الأدوات الدّاخلة في النِّظام البيئي المُحيط بDocker ثم تنفيذ ونشر تطبيقات مُعقَّدة ومرنة كفاية لتعمَل على نُظُم تشغيل مختلفة.
 

ترجمة -وبتصرّف- للمقال:The Docker Ecosystem: An Introduction to Common Components





تفاعل الأعضاء


شكرا جزيلا على هذه الموضوعات المميزة .. نحن فعلا نفتقر جدا الى المواضيع العربية التي تخص التكنولوجيا 

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

و لكنني لم أفهم جيدا مالمقصود بكلمة ecosystem .. هل هي تعني بيئة العمل ام المكونات الخاصة بـDocker أم تعني شيئاً آخر

الصورة غير واضحة بالنسبة لي فيما يتعلق بمعنى هذه الكلمة..

هل تستطيع شرحها من فضلك

شارك هذا التعليق


رابط هذا التعليق
شارك على الشبكات الإجتماعية


يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن