كيفية استخدام حاويات Linux مع LXC و LXD

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

يمكنني في هذه الأيام أن أقول لنفسي "لا أمانع في اختبار ذلك على خادم يقوم بتشغيل إصدار معين من CentOS" و - اعتمادًا على عدد من المتغيرات وبافتراض أن الصورة الأصلية قد تم تنزيلها بالفعل - يمكنني الحصول على نسخة كاملة الوظائف نظام افتراضي جاهز في غضون 30 ثانية. قد تختلف نتائجك بالضبط ، ولكن ليس بهذا القدر.

يمكنك أن ترى كيف يعمل كل هذا في الدورة التدريبية الجديدة الخاصة بي حول Pluralsight "تحسين نظام Linux" - التي تستند إليها هذه المقالة.

ما الذي دفع كل هذا التغيير؟ الافتراضية. وعلى وجه الخصوص ، افتراضية الحاويات.

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

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

بشكل عام ، هناك نوعان من أنظمة البرامج المستخدمة لإدارة المحاكاة الافتراضية للخادم: برنامج Hypervisor والحاوية.

توفر Hypervisors طبقة من التجريد تسمح لأجهزة VM الضيف بإنشاء بيئة معزولة مع إمكانية الوصول إلى أجهزة النظام التي تحاكي خادمًا معدنيًا. هذا يعني أنه يمكن إنشاء أجهزة افتراضية لبرنامج Hypervisor من أي نظام تشغيل متوافق مع أجهزتك الأساسية. ولكن هذا يعني أيضًا أنهم سيستهلكون مساحة أكبر ومزيدًا من الذاكرة وموارد الحساب.

افتراضية الحاويات

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

تركز الكثير من الاهتمام المتعلق بالحاويات على مدى السنوات القليلة الماضية على Docker ، ومؤخرًا على أداة تنسيق الحاويات من Google ، Kubernetes. في الواقع ، يعد Kubernetes مناسبًا تمامًا لهياكل الخدمات المصغرة على مستوى المؤسسة.

ولكن هناك تطبيق أقدم وأكثر نضجًا لنموذج الحاوية لم يذهب إلى أي مكان. يتمتع مشروع Linux Container Project ، LXC ومجموعة أدواته الأحدث ، LXD ، بنقاط قوة يجادل بها الكثيرون تجعله مرشحًا أفضل لبعض حالات الاستخدام من Kubernetes. على وجه الخصوص ، تتفوق LXC في بناء بيئات رملية خفيفة وسريعة للاختبار وتطوير التطبيقات.

في هذه المقالة ، سأوضح لك كيفية تثبيت LXD ، وكيفية تحضير وتشغيل حاوية بسيطة تعمل بنظام Alpine Linux الصغير جدًا ، ثم كيفية فتح جلسة shell داخل الحاوية الجديدة. سأشرح أيضًا كيفية العثور على إصدارات متعددة من التوزيعات الأخرى وتشغيلها.

شيء واحد يمكنني إخبارك به على الفور هو أنه عندما أقوم بتدريس LXC ، يستجيب الطلاب بدهشة من مدى قوة وفعالية استخدام الحاويات.

عندما ننتهي من كل هذا ، ستتمكن من تشغيل الآلات لاختبار عملي لكل ما تتعلمه أو تعمله في غضون ثوانٍ. عندما تسوء تجربة ما ، يمكنك إغلاق حاوية وإخراجها فورًا وإنشاء حاوية أخرى لاستبدالها. ببساطة لم يعد هناك أي عذر لعدم التعلم.

بناء حاويات LXD

سنبدأ تشغيل LXC أثناء العمل على تثبيت جديد لجهاز Ubuntu 18.04. في هذا العرض التوضيحي ، سنقوم بتثبيت بيئة LXD وتهيئتها ثم استخدام إصدار LXD من واجهة سطر أوامر LXC لتنزيل حاوية Alpine Linux وتشغيلها. سنؤكد أن كل شيء نجح ، ثم نلقي نظرة حولنا لنرى كيف تمتلئ البيئة.

سأستخدم مدير الحزم المفاجئة لتثبيت LXD لأن هذه هي التوصية الرسمية الآن. وليس فقط لـ LXD ، ضع في اعتبارك: جميع أنواع التطبيقات تنجرف إلى مديرين بديلين مثل snap أو AppImmage و Flatpak. ما زلت أحب موهبتي في دبيان ، لكن لا يمكنك محاربة العالم كله.

$ sudo snap install lxd 

تأتي LXD - التي تعد ، مرة أخرى ، مجموعة أدوات محدثة مصممة لإدارة LXC API - في حزمة تتضمن جميع تبعيات LXC العادية. أمر تثبيت واحد وانتهينا.

من المهم تهيئة بيئة LXC باستخدام الأمر lxd init. يمكنك إعداد الأشياء بنفسك يدويًا ، ولكن من المرجح أن تقوم بعملها بشكل صحيح بهذه الطريقة. ستطرح عليك عملية البدء مجموعة من الأسئلة ، وفي الوقت الحالي على الأقل ، ستنجح جميع الإجابات الافتراضية.

$ sudo lxd init 

بمجرد الانتهاء من ذلك ، نكون مستعدين لبناء الحاوية الأولى الخاصة بك. أيًا كان توزيع Linux والإصدار الذي نريده ، سنحتاج إلى البحث عن الصورة وتنزيلها. يحتفظ مشروع LXC بمستودع لمجموعة كبيرة من الصور على images.linuxcontainers.org. يمكنك أن ترى أن هناك عادةً إصدارات متعددة من كل توزيعة ، مما يسمح لك بإنشاء حاويات تعمل مع أي برنامج يمكنك طرحه عليها.

سأستخدم أحدث إصدار من Alpine Linux لأنه صغير جدًا. لا تتردد في استخدام أي صورة تريدها - بما في ذلك الأولاد الكبار مثل Ubuntu و CentoOS. سيتم تنزيل Alpine ، بالطبع ، بسرعة كبيرة.

لكن قبل أن نفعل ذلك ، يجب أن أخبرك بكيفية اكتشاف صيغة سطر الأوامر اللازمة للحصول على صورتك.

كما ترى في لقطة الشاشة هذه من موقع LXD على الويب ، يمكنك الحصول على ثلاث معلومات تحتاجها من الصفحة نفسها: اسم التوزيعة - Alpine ، في هذه الحالة - رقم الإصدار - 3.10 - والهندسة المعمارية . نحن بعد amd64.

نحن الآن جاهزون لبدء التنزيل عن طريق تشغيل launchالأمر:

$ sudo lxc launch images:alpine/3.10/amd64 demo 

لاحظ كيف أن بناء الجملة هو "lxc" على الرغم من أن هذا هو من الناحية الفنية واجهة LXD. تخبر "الصور" LXC أن صورتنا تعيش في الريبو العام الذي رأيناه سابقًا. يتم إدخال أجزاء البيانات الثلاثة - اسم التوزيعة ورقم الإصدار والهندسة المعمارية ، مفصولة بشرطة مائلة للأمام. سأستخدم "العرض التوضيحي" كاسم الحاوية الخاصة بي. يجب أن يكون هذا كل ما نحتاجه.

يمكنك أن ترى مدى صغر منطقة جبال الألب من خلال سرعة التنزيل. اتصال الإنترنت لدي ليس بهذه السرعة ولم ألعب أي ألعاب مع التسجيل. للتأكد من أنها تعمل ، سأقوم بتشغيل "lxc ls" لسرد جميع الحاويات المثبتة حاليًا. هناك واحد فقط. وحالتها الحالية هي "قيد التشغيل".

sudo lxc ls +------+---------+----------------------+------------+-----------+ | NAME | STATE | IPV4 | TYPE | SNAPSHOTS | +------+---------+----------------------+------------+-----------+ | demo | RUNNING | 10.125.45.119 (eth0) | PERSISTENT | 0 | +------+---------+----------------------+------------+-----------+ 

يمكنك فتح جلسة جذر بدون تسجيل الدخول في حاوية باستخدام الأمر "lxc exec". ما عليك سوى تحديد اسم الحاوية ثم إخبار LXC أنك تريد تشغيل shell باستخدام مترجم sh (قد تفضل /bin/bashإذا كنت تعمل مع حاوية Ubuntu أو CentOS - مكالمتك في كلتا الحالتين). نظرًا لأنك ستتمكن من معرفة ما إذا كنت تتابع في المنزل ، فلدينا موجه أوامر Linux عادي وأي شيء Linux-y ممكن الآن.

$ sudo lxc exec demo sh ~ # 

يمكنك أيضًا تشغيل أمر واحد دون فتح غلاف كامل عن طريق كتابة الأمر بدلاً من هذا sh.

$ sudo lxc exec demo ls / bin etc lib mnt proc run srv tmp var dev home media opt root sbin sys usr 

يمكنك الخروج من الغلاف في أي وقت تريده exitوالعودة إلى مضيفك. هنا ، إلى جانب سرد الحاويات قيد التشغيل ، يمكنني أيضًا سرد أي تجمعات تخزين. التجمع الافتراضي الذي تم إنشاؤه أثناء التهيئة موجود ، ويمكننا أن نرى مكان تخزين صورة القرص. / var / lib / lxd هو ، افتراضيًا ، المكان الذي يتم فيه الاحتفاظ بجميع موارد LXC.

$ sudo lxc storage ls +---------+-------------+--------+--------------------------------+---------+ | NAME | DESCRIPTION | DRIVER | SOURCE | USED BY | +---------+-------------+--------+--------------------------------+---------+ | default | | btrfs | /var/lib/lxd/disks/default.img | 3 | +---------+-------------+--------+--------------------------------+---------+ 

يمكنني بالمثل سرد جميع الشبكات الخاصة بي. هناك عدد قليل من جسور الشبكة على هذا النظام (كنت ألعب قليلاً ، كما ترون). هناك أيضًا جسر enp0s3 المادي الذي يستخدمه خادم Ubuntu المضيف. على الرغم من أنه بيني وبينك ، فإن ذلك ليس ماديًا أيضًا ، حيث إنه في الواقع جهاز افتراضي يعمل في Virtual Box من Oracle.

$ lxc network ls +---------+----------+---------+-------------+---------+ | NAME | TYPE | MANAGED | DESCRIPTION | USED BY | +---------+----------+---------+-------------+---------+ | enp0s3 | physical | NO | | 1 | +---------+----------+---------+-------------+---------+ | lxdbr0 | bridge | YES | | 1 | +---------+----------+---------+-------------+---------+ | mynet | bridge | YES | | 0 | +---------+----------+---------+-------------+---------+ | testbr0 | bridge | YES | | 1 | +---------+----------+---------+-------------+---------+ 

If we needed to, we could easily add a new virtual interface to our container using the "lxc network attach" command. Here, I'll specify the physical network and then the name of our container.

$ lxc network attach enp0s3 demo 

With that done, you could open a new shell in the container to see what's changed. There should now be an eth1 interface listed. You may need to reboot for all the changes to take full effect. By doing that you can also marvel at just how fast this thing can reboot itself - for all intents and purposes, it'll happen faster than you can type your exec command to open a new shell.

Enjoy your new environment!

This article is based on content in my Pluralsight course, "Linux System Optimization." There's much more administration goodness in the form of books, courses, and articles available at bootstrap-it.com.