جداسازی محیط های توسعه با ظروف LXD

من در مورد رویکردی برای سازماندهی محیط های توسعه ایزوله محلی در ایستگاه کاری خود صحبت خواهم کرد. این رویکرد تحت تأثیر عوامل زیر ایجاد شد:

  • زبان های مختلف به IDE ها و زنجیره های ابزار متفاوتی نیاز دارند.
  • پروژه های مختلف ممکن است از نسخه های مختلفی از زنجیره های ابزار و کتابخانه ها استفاده کنند.

رویکرد این است که در داخل کانتینرهای LXD که به صورت محلی بر روی لپ‌تاپ یا ایستگاه کاری اجرا می‌شوند و خروجی‌های گرافیکی به میزبان هدایت می‌شوند.

پیکربندی نمونه اوبونتو 20.04.

تامل در مورد گزینه ها و دلایل در پایان مقاله آورده شده است.

1. نصب LXD

В اوبونتو 20.04 LXD دیگر برای نصب به عنوان بسته deb در دسترس نیست، فقط از طریق snap:

$ snap install lxd

پس از نصب باید مقداردهی اولیه را انجام دهید:

$ lxd init

تنها پارامتری که تغییر می دهم این است storage bakend - من استفاده می کنم dir به عنوان ساده ترین. از آنجایی که من از تصاویر و کپی استفاده نمی کنم، هشدارها در مستندات آنها مرا نمی ترسانند:

به طور مشابه، باطن دایرکتوری باید به عنوان آخرین راه حل در نظر گرفته شود.
از تمام ویژگی های اصلی LXD پشتیبانی می کند، اما به طور وحشتناکی کند و ناکارآمد است زیرا نمی تواند کار کند
کپی های فوری یا عکس های فوری و بنابراین باید هر بار کل فضای ذخیره سازی نمونه را کپی کنید.

2. راه اندازی پروفایل LXD

پروفایل در LXD - اینها مجموعه ای از پارامترها هستند که برای چندین کانتینر اعمال می شوند. برای نیازهای من، تنها نمایه ای که به طور پیش فرض ایجاد شده است برای من کافی است default با تغییرات زیر:

  • $ lxc profile device add default X0 disk source=/tmp/.X11-unix/X0 path=/tmp/.X11-unix/X0 - به طوری که برنامه های کاربردی در کانتینرها می توانند با سرور میزبان X11 تعامل داشته باشند.
  • $ lxc profile set default environment.DISPLAY :0 - به طوری که متغیر محیطی DISPLAY به درستی در ظروف نصب شده است.
  • $ lxc profile set default raw.idmap "both 1000 1000" - برای درست نقشه برداری شناسه.

3. ایجاد و راه اندازی یک کانتینر

ایجاد یک ظرف بر اساس یک تصویر images:ubuntu/20.04:

$ lxc launch images:ubuntu/20.04 dev1

من تصاویر از مخزن را ترجیح می دهم https://images.linuxcontainers.org، زیرا نرم افزارهای از پیش نصب شده کمتری دارند. به همین دلیل من پیشوند را اضافه کردم images: به نام تصویر ایجاد یک کانتینر بر اساس یک تصویر از مخزن اوبونتو می تواند به صورت زیر انجام شود: $ lxc launch ubuntu/20.04 dev1.

دسترسی به پوسته ریشه ظرف:

$ lxc exec dev1 -- bash

فایرفاکس و VS Code را (از مخزن) نصب خواهم کرد طبق دستورالعمل):

$ apt update
$ apt install curl gpg firefox

$ curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg
$ install -o root -g root -m 644 packages.microsoft.gpg /usr/share/keyrings/
$ echo "deb [arch=amd64 signed-by=/usr/share/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/vscode stable main" > /etc/apt/sources.list.d/vscode.list

$ apt update
$ apt install code

من یک ظرف برای وضوح اضافه خواهم کرد.

poweroff

پاداش بسیار آسان است که یک GPU را در یک ظرف پرتاب کنید تا برنامه های در حال اجرا در آن بتوانند از کارت گرافیک استفاده کنند. برای انجام این کار شما نیاز دارید:

  • افزودن دستگاه $ lxc config device add dev1 mygpu gpu;
  • درایورهای کارت گرافیک را در کانتینر نصب کنید - همان هایی که روی هاست نصب شده اند.

4. استفاده از ظرف

اگر کانتینر هنوز کار نمی کند، باید آن را راه اندازی کنید:

lxc start dev1

اجرای VS Code به عنوان یک کاربر غیر روت اوبونتو:

lxc exec dev1 -- sudo --login --user ubuntu code

فایرفاکس را راه اندازی کنید:

lxc exec dev1 -- sudo --login --user ubuntu firefox

پنجره های برنامه روی هاست نمایش داده می شوند، اما در داخل کانتینر اجرا می شوند - شبیه به ارسال گرافیک با استفاده از ssh.

من به صورت دستی کانتینرهای در حال اجرا را خاموش نمی کنم، زیرا نکته زیادی در آن نمی بینم - من خودم را به بستن پنجره های برنامه های در حال اجرا محدود می کنم.

5. نتیجه گیری

من ترجیح می‌دهم از سیستم‌عامل میزبان برای توسعه استفاده نکنم، زیرا این کار مستلزم نصب ابزارهای توسعه، اشکال زدایی نسخه‌های کتابخانه‌ها، پیکربندی اجزای سیستم به روشی خاص و سایر دستکاری‌ها است. همه اینها می تواند منجر به رفتار غیرمنتظره در سایر نرم افزارهای غیر توسعه یا حتی کل سیستم عامل شود. به عنوان مثال، تغییرات در پیکربندی OpenSSL می تواند باعث شود که سیستم عامل به درستی راه اندازی نشود.

من ابزارهای مختلفی را برای جداسازی محیط های توسعه امتحان کرده ام:

  • ماشین‌های مجازی (KVM، VirtualBox، و غیره) واضح‌ترین گزینه هستند، اما منابع قابل توجهی بیشتری مصرف می‌کنند، اگرچه هیچ گزینه دیگری برای توسعه تحت ویندوز وجود ندارد (اگر میزبان لینوکس باشد).
  • ابزارهای توسعه ابری که روی یک ماشین محلی اجرا می شوند (Cloud9 در یک ظرف یا ماشین مجازی، Eclipse Che و غیره) - آنها برای این حالت کار توسعه داده نشده اند، آنها نیاز به پیکربندی و نگهداری اضافی دارند، بهتر است از آنها برای هدف خود استفاده کنید. هدف - در ابر؛
  • کانتینرهای Docker دوباره برای چیز دیگری در نظر گرفته شده اند؛ به نظر من، آنها برای نمونه سازی سریع با استفاده از نرم افزارهایی که هنوز در ظروف جداگانه بسته بندی نشده اند، خیلی راحت نیستند.

رویکرد انتخاب شده با سادگی و مانع کم ورود، مرا تحت تأثیر قرار می دهد. در خود کانتینرها، می توانید از رویکردهای خاص پروژه استفاده کنید: همه چیز را به صورت دستی نصب و پیکربندی کنید، یا از اتوماسیون (Puppet، Ansible و غیره) استفاده کنید، حتی مستقر کنید. زیرساخت مبتنی بر داکر. من همچنین از کانتینرهای LXD برای اجرای نرم‌افزار خاصی استفاده می‌کنم که یا نیاز به نصب تعداد زیادی وابستگی یا یک نسخه سیستم‌عامل متفاوت دارد - در این مورد می‌توانید برای مثال یک کانتینر با نسخه سیستم‌عامل مورد نظر ایجاد کنید. $ lxc launch images:ubuntu/16.04 dev16.

مهم است که به خاطر داشته باشید که از نظر جداسازی، کانتینری‌سازی در مقایسه با مجازی‌سازی سطح حمله بزرگ‌تری دارد - میزبان و کانتینر یک هسته مشترک دارند، آسیب‌پذیری که در آن می‌تواند به بدافزار اجازه فرار از کانتینر را بدهد. هنگام آزمایش با نرم افزارهای مشکوک، بهتر است از مکانیسم های جداسازی مناسب تری استفاده کنید.

لینک های مفید

منبع: www.habr.com

اضافه کردن نظر