بلاگ/راه‌اندازی کانتینر سیستمی با Incus (جایگزین متن‌باز LXD) روی سرور اختصاصی و VPS
به‌روز شده

راه‌اندازی کانتینر سیستمی با Incus (جایگزین متن‌باز LXD) روی سرور اختصاصی و VPS

1405/07/250 بازدید
راه‌اندازی کانتینر سیستمی با Incus (جایگزین متن‌باز LXD) روی سرور اختصاصی و VPS

راه‌اندازی کانتینر سیستمی با Incus (جایگزین متن‌باز LXD) روی سرور اختصاصی و VPS

Incus یک پلتفرم کانتینر و ماشین مجازی است که از دل پروژهٔ LXD بیرون آمده و الان زیر نظر جامعهٔ Linux Containers توسعه داده می‌شود. اگر دنبال راه‌اندازی Incus روی سرور هستید، این راهنما از نصب تا ساخت اولین کانتینر سیستمی، تنظیم شبکه و استوریج، و گرفتن اسنپ‌شات را قدم‌به‌قدم نشان می‌دهد.

نصب Incus روی سرور لینوکس برای ساخت کانتینر سیستمی

Incus چیست و چرا جای LXD را گرفته؟

تا سال ۲۰۲۳ توسعهٔ LXD زیر نظر کانونیکال (شرکت پشت اوبونتو) بود. بعد از این‌که کانونیکال حاکمیت پروژه را به شکلی سخت‌گیرانه‌تر درآورد، بخشی از همان تیم اصلی یک فورک کاملا متن‌باز به اسم Incus ساختند و زیر چتر Linux Containers بردند. از نظر کاربر فرقی در مفهوم اصلی نیست؛ همان دستورها، همان فایل‌های پیکربندی، فقط باینری و مخزن نصب عوض شده.

نکتهٔ مهم‌تر این است که Incus یک کانتینر سیستمی می‌سازد، نه کانتینر اپلیکیشنی مثل داکر. کانتینر سیستمی یعنی یک سیستم‌عامل کامل با systemd، سرویس‌های خودش و حتی چند پروسه در کنار هم، درست مثل یک سرور مجازی معمولی. برای کسی که عادت دارد با SSH وارد یک ماشین بشود و چند سرویس را کنار هم مدیریت کند، این مدل خیلی آشناتر از تک‌پروسه بودن یک کانتینر داکر است.

تفاوت کانتینر سیستمی با داکر و ماشین مجازی کامل

قبل از نصب بد نیست بدانید کجای این طیف ایستاده‌اید. هر سه مدل از namespace و cgroup کرنل لینوکس استفاده می‌کنند، اما سطح ایزوله‌سازی و سربار آن‌ها فرق دارد.

ویژگیکانتینر سیستمی (Incus)کانتینر اپلیکیشنی (Docker)ماشین مجازی کامل
چیزی که اجرا می‌شودیک سیستم‌عامل کامل با systemdمعمولا یک پروسه یا یک سرویسهسته و سیستم‌عامل مستقل
زمان بوتچند ثانیهزیر یک ثانیهچند ده ثانیه
اشتراک کرنل با هاستبلهبلهخیر، کرنل مجزا
مدیریت چند سرویس روی یک واحدراحت، مثل یک سرور معمولینیاز به چند کانتینر جدا یا composeراحت
مناسب برایشبیه‌سازی چند سرور، تست توزیع‌های مختلفبسته‌بندی و توزیع اپلیکیشنایزوله‌سازی کامل، کرنل متفاوت

اگر فقط می‌خواهید یک اپلیکیشن Node.js یا یک API را دیپلوی کنید، داکر همچنان انتخاب ساده‌تری است؛ برای مدیریت گرافیکی همان کانتینرهای داکر می‌توانید سراغ راه‌اندازی Portainer بروید. Incus بیشتر به کار کسی می‌آید که می‌خواهد چند «سرور» مجزا روی یک ماشین فیزیکی داشته باشد، بدون سربار کامل مجازی‌سازی.

سرور اختصاصی یا VPS؛ کدام برای Incus مناسب‌تر است؟

Incus به دسترسی کامل به namespace‌های کرنل نیاز دارد. روی سرور اختصاصی این دسترسی همیشه هست، چون کرنل مستقیم در اختیار شماست. روی VPS باید اول نوع مجازی‌سازی را چک کنید:

  • VPS مبتنی بر KVM (اکثر پلن‌های امروزی) کرنل مستقل خودش را دارد، پس کانتینر سیستمی بدون مشکل بالا می‌آید.
  • VPS مبتنی بر OpenVZ یا LXC که خودش روی یک کرنل مشترک کانتینری می‌شود، معمولا اجازهٔ ساخت کانتینر تو در تو (nested) را نمی‌دهد. تفاوت دقیق این دو نوع مجازی‌سازی را در مقایسهٔ VPS KVM و OpenVZ می‌توانید ببینید.

مقایسهٔ اجرای کانتینرهای سیستمی Incus روی سرور اختصاصی و روی VPS

برای تشخیص سریع نوع مجازی‌سازی این دستور را اجرا کنید:

systemd-detect-virt

اگر خروجی kvm بود مشکلی نیست. اگر lxc یا openvz برگشت، باید یا با پشتیبانی سرویس‌دهنده هماهنگ کنید یا سراغ یک پلن دیگر بروید.

نصب Incus روی اوبونتو

مخزن رسمی Incus (Zabbly) پکیج‌های به‌روز را برای اوبونتو و دبیان نگه می‌دارد و بهتر از مخزن پیش‌فرض توزیع جلو می‌رود:

sudo mkdir -p /etc/apt/keyrings/
sudo curl -fsSL https://pkgs.zabbly.com/key.asc -o /etc/apt/keyrings/zabbly.asc

sudo sh -c 'cat <<EOF > /etc/apt/sources.list.d/zabbly-incus-stable.sources
Enabled: yes
Types: deb
URIs: https://pkgs.zabbly.com/incus/stable
Suites: $(. /etc/os-release && echo ${VERSION_CODENAME})
Components: main
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/zabbly.asc
EOF'

sudo apt update
sudo apt install -y incus

بعد از نصب، کاربر فعلی را به گروه مدیریت Incus اضافه کنید تا هر بار نیاز به sudo نباشد:

sudo usermod -aG incus-admin $USER
newgrp incus-admin

راه‌اندازی اولیه با incus admin init

این دستور یک ویزارد تعاملی باز می‌کند که بک‌اند استوریج، شبکهٔ پیش‌فرض و چند تنظیم دیگر را می‌پرسد:

incus admin init

برای شروع، گزینهٔ پیش‌فرض‌ها را قبول کنید (استوریج dir، شبکهٔ incusbr0). بعدا هر کدام را جدا عوض می‌کنیم.

ساخت اولین کانتینر سیستمی اوبونتو

Incus یک کاتالوگ ایمیج آماده دارد که با پیشوند images: صدا زده می‌شود:

incus launch images:ubuntu/24.04 web01
incus list
incus exec web01 -- bash

همین سه خط یک اوبونتو ۲۴.۰۴ کامل با systemd بالا می‌آورد و شما را مستقیم داخل آن می‌برد. از اینجا به بعد دقیقا مثل یک سرور معمولی رفتار کنید: apt install، systemctl، فایل‌های کانفیگ، همه چیز طبیعی است.

تنظیم شبکه

پیش‌فرض Incus یک بریج داخلی به اسم incusbr0 می‌سازد که کانتینرها از طریق NAT به اینترنت دسترسی دارند، شبیه شبکهٔ داخلی یک روتر خانگی. برای سرویسی که باید از بیرون در دسترس باشد دو راه معمول هست:

برای یک پورت یا دو پورت، ساده‌ترین کار proxy device است:

incus config device add web01 http proxy listen=tcp:0.0.0.0:8080 connect=tcp:127.0.0.1:80

با این دستور، درخواست‌هایی که به پورت ۸۰۸۰ سرور می‌رسند مستقیم به پورت ۸۰ داخل کانتینر web01 هدایت می‌شوند.

اگر چند کانتینر دارید و هر کدام باید IP عمومی مستقل داشته باشد (مثلا روی سرور اختصاصی با چند IP اختصاصی)، باید شبکه را به حالت bridged با IP واقعی تنظیم کنید، نه NAT. این حالت نیاز به یک بریج روی اینترفیس فیزیکی سرور دارد که با incus network create و تنظیم parent به کارت شبکهٔ اصلی ساخته می‌شود.

تنظیم استوریج

نوع استوریجی که انتخاب می‌کنید روی سرعت اسنپ‌شات تاثیر مستقیم دارد. سه گزینهٔ اصلی:

  • dir: ساده‌ترین حالت، فایل‌ها مستقیم روی فایل‌سیستم هاست ذخیره می‌شوند. اسنپ‌شات در این حالت یک کپی کامل است، پس فضا و زمان بیشتری می‌گیرد.
  • zfs: اسنپ‌شات copy-on-write دارد، یعنی گرفتن یک اسنپ‌شات تقریبا آنی است و فقط تغییرات بعدی فضای اضافه مصرف می‌کنند.
  • btrfs: مزیت مشابه zfs با کمی تفاوت در مدیریت حجم.

برای سروری که مرتب اسنپ‌شات می‌گیرید، zfs انتخاب منطقی‌تری است:

incus storage create fastpool zfs size=50GiB
incus launch images:ubuntu/24.04 db01 --storage fastpool

گرفتن اسنپ‌شات و بازگشت

قبل از هر ارتقای مهم یا تغییر پرخطر، یک اسنپ‌شات بگیرید:

incus snapshot create web01 before-upgrade
incus snapshot list web01

اگر کار خراب شد، بازگشت یک دستور است:

incus snapshot restore web01 before-upgrade

برای بکاپ کامل روی یک فایل (مثلا قبل از انتقال به سرور دیگر):

incus export web01 web01-backup.tar.gz

محدود کردن منابع هر کانتینر

روی یک سرور با چند کانتینر، بهتر است سقف مصرف هر کدام را از اول مشخص کنید تا یک کانتینر منابع بقیه را نگیرد:

incus config set web01 limits.cpu 2
incus config set web01 limits.memory 2GiB

این دو خط یعنی web01 حداکثر ۲ هسته و ۲ گیگابایت رم می‌بیند، حتی اگر سرور منابع بیشتری داشته باشد.

همهٔ این کار روی VPS با مجازی‌سازی KVM هم جواب می‌دهد، اما وقتی چند کانتینر سیستمی همزمان با استوریج zfs و اسنپ‌شات مرتب اجرا می‌شوند، مصرف IO و رم بالا می‌رود — همان مشکل Steal Time و Noisy Neighbor که روی VPS‌های شلوغ بیشتر خودش را نشان می‌دهد. اگر VPS فعلی زیر این بار کند می‌شود یا دنبال مشخصات مناسب دیسک و رم برای چند کانتینر همزمان هستید، راهنمای خرید سرور اختصاصی می‌تواند کمک کند؛ سرور اختصاصی آریانت دسترسی کامل به کرنل و دیسک فیزیکی را در اختیارتان می‌گذارد، بدون محدودیت مجازی‌سازی تو در تو.

جمع‌بندی

Incus یک جایگزین فعال‌تر از LXD برای کسی است که به کانتینر سیستمی نیاز دارد، نه به تک‌کانتینر داکر. مسیر نصب، ساخت اولین کانتینر، تنظیم شبکه و استوریج، و اسنپ‌شات گرفتن همان چیزی است که در این راهنما قدم‌به‌قدم آمد. از همین‌جا شروع کنید: یک کانتینر تست بسازید، شبکه‌اش را وصل کنید، یک اسنپ‌شات بگیرید و ببینید چقدر سریع برمی‌گردد.

سؤالات متداول

آیا Incus جایگزین مستقیم LXD است؟ بله، از نظر دستورها و مفهوم تقریبا یکی هستند. فقط مخزن نصب و اسم باینری فرق دارد و توسعهٔ Incus زیر نظر جامعه پیش می‌رود، نه کانونیکال.

آیا می‌شود Incus را روی هر VPSای نصب کرد؟ فقط اگر VPS مجازی‌سازی KVM داشته باشد. روی VPSهای مبتنی بر OpenVZ یا LXC معمولا ساخت کانتینر تو در تو مسدود است.

فرق کانتینر سیستمی با کانتینر داکر در عمل چیست؟ کانتینر سیستمی یک سیستم‌عامل کامل با systemd و چند سرویس کنار هم است. کانتینر داکر معمولا یک پروسه یا یک سرویس تک است و برای توزیع اپلیکیشن ساخته شده.

اسنپ‌شات Incus چقدر فضا اشغال می‌کند؟ با استوریج zfs یا btrfs فقط تغییرات بعد از اسنپ‌شات فضای اضافه می‌گیرند. با استوریج dir هر اسنپ‌شات یک کپی کامل است و فضای بیشتری لازم دارد.