Docker یا Podman؛ سرعت تقریباً برابر است، مدل دسترسی تصمیم را عوض می‌کند

|نویسنده: تیم تحریریه QUASA|6 دقیقه مطالعه
Docker یا Podman؛ سرعت تقریباً برابر است، مدل دسترسی تصمیم را عوض می‌کند

اگر پروژه‌تان به Docker Compose و ابزارهای متصل به سوکت Docker وابسته است، ماندن با Docker معمولاً هزینهٔ تغییر کمتری دارد؛ اگر می‌خواهید کانتینرهای کاربران را جداگانه و با حساب‌های محدود روی میزبان لینوکسی اداره کنید، Podman انتخاب مناسبی است. تفاوت سرعت آغاز کانتینر در یک آزمایش مشخص ناچیز بود: در آزمون مستقل با ۲۰ اجرای تصویر آماده، میانگین Docker با دسترسی root برابر ۳۵۲ میلی‌ثانیه و Podman در حالت rootless برابر ۳۴۲ میلی‌ثانیه ثبت شد و اختلاف در محدودهٔ پراکندگی نتایج قرار گرفت.

پس انتخاب را باید از حساب اجراکننده، محل ذخیرهٔ داده، سازگاری Compose و روش ادارهٔ سرویس شروع کرد. Docker نیز حالت rootless دارد: راهنمای رسمی Docker توضیح می‌دهد که در این حالت هم daemon و هم کانتینرها داخل فضای نام کاربر و بدون اختیار root میزبان اجرا می‌شوند. تفاوت عملی این است که چه کسی به فرایند مدیریت، سوکت و فایل‌های میزبان دسترسی دارد؛ صرف نام ابزار سطح دسترسی واقعی نصب را تعیین نمی‌کند.

آزمون سرعت دقیقاً چه می‌گوید؟

اندازه‌گیری یادشده زمان شروع یک فرمان کوتاه با تصویر از پیش دریافت‌شده روی یک دستگاه را نشان می‌دهد. یکی از دو پیکربندی با daemon دارای دسترسی root و دیگری با حساب عادی اجرا شده بود؛ بنابراین نمی‌توان اختلاف کوچک آن‌ها را به برتری ذاتی یک موتور، سرعت برنامهٔ در حال اجرا یا کارایی همهٔ شبکه‌ها تعمیم داد. وقتی تصویر باید دریافت شود، برنامه منتظر دیسک است یا داده از درگاه منتشرشده عبور می‌کند، گلوگاه دیگری وارد اندازه‌گیری می‌شود.

این نتیجه برای تصمیم مهاجرت یک کاربرد روشن دارد: چند میلی‌ثانیه تفاوت در راه‌اندازی چنین فرمانی، به‌تنهایی هزینهٔ بازنویسی استقرار یا تغییر مجوزهای میزبان را توجیه نمی‌کند. اگر بار کاری شما کانتینرهای کوتاه‌عمر فراوان می‌سازد، زمان همان فرایند واقعی و همان حالت دسترسی را بسنجید. برای سرویس دائمی، رفتار شبکه، ذخیره‌سازی و بازیابی سرویس معمولاً پرسش‌های مرتبط‌تری هستند.

مرز دسترسی در هر نصب کجاست؟

در نصب متداول Docker، فرمان کاربر به daemon مرکزی می‌رسد؛ در Docker rootless همان daemon زیر حساب عادی کار می‌کند. این تفاوت از نظر اختیار مهم است: حسابی که به daemon دارای دسترسی root فرمان می‌دهد، دامنهٔ کنترلی متفاوتی با حسابی دارد که فقط daemon کاربری خودش را اداره می‌کند. حتی پس از انتخاب rootless، مسیرهای متصل‌شده از میزبان و دسترسی به سوکت مدیریت باید با مالک همان حساب سنجیده شوند.

Podman در اجرای محلی به daemon دائمی نیاز ندارد و کاربر عادی می‌تواند کانتینر خود را بسازد. در میزبان چندکاربره، این مدل ادارهٔ جداگانهٔ بارهای هر حساب را ساده می‌کند؛ کانتینرهای متعلق به یک کاربر عادی در نمای Podman کاربر دیگر دیده و مدیریت نمی‌شوند. این جدایی جای سیاست مالکیت فایل یا حساب مشترک برای سرویس‌های تیمی را نمی‌گیرد: اگر چند نفر باید برنامهٔ واحدی را نگهداری کنند، باید از پیش روشن باشد چه کسی حق تغییر داده، تصویر و واحد سرویس را دارد.

Rootless در ذخیره‌سازی و شبکه چه محدودیت‌هایی دارد؟

مستندات رسمی Podman برای اجرای rootless بازه‌های subuid و subgid را لازم می‌داند، محل پیش‌فرض ذخیرهٔ تصویرها را زیر پوشهٔ کاربر می‌گذارد و توضیح می‌دهد که NFS محل پشتیبانی‌شدهٔ graphroot در این حالت نیست. اگر پوشهٔ خانگی کاربر روی NFS باشد، می‌توان graphroot را در تنظیم ذخیره‌سازی به دیسک محلی منتقل کرد؛ این قید دربارهٔ محل لایه‌ها و تصویرهای کانتینر است، نه ممنوعیت مطلق پوشهٔ خانگی شبکه‌ای. برای ساخت دستگاه شبکه در این حالت نیز نصب pasta لازم است.

برای میزبان‌هایی با خانهٔ کاربری شبکه‌ای، همین جزئیات ممکن است انتخاب را بیش از زمان شروع عوض کند: باید دیسک محلی کافی و مجوز مناسب برای ذخیرهٔ هر حساب وجود داشته باشد. انتشار درگاه و دسترسی از بیرون میزبان را نیز باید با همان حساب و پیکربندی سرویس آزمود. راه‌اندازی موفق یک کانتینر، به‌تنهایی رفتار مسیر ورودی برنامه را مشخص نمی‌کند.

Compose هنگام جابه‌جایی چه تغییری می‌کند؟

توضیح فرمان podman compose می‌گوید این فرمان اجرای Compose را به ارائه‌دهنده‌ای بیرونی مانند docker-compose یا podman-compose می‌سپارد و ارتباط آن ارائه‌دهنده را با سوکت Podman برقرار می‌کند. اگر docker-compose نصب باشد، در انتخاب پیش‌فرض اولویت دارد. بنابراین وجود فرمان مشابه، ضمانت اجرای یکسان همهٔ فایل‌ها و گزینه‌های پروژه نیست؛ رفتار به ارائه‌دهندهٔ موجود و امکاناتی که پروژه واقعاً استفاده می‌کند وابسته است.

در لپ‌تاپ توسعه، هزینهٔ مهاجرت اغلب بیرون از خود کانتینر پیدا می‌شود: اسکریپت ساخت، اتصال پوشهٔ کد، ابزار وابسته به API یا سوکت Docker و فرمان‌های روزانهٔ تیم. اگر یک پروژهٔ چندسرویسی با Compose اداره می‌شود، معیار سازگاری باید اجرای همان پروژه با حجم‌ها، شبکه و فرایند ساختش باشد. موفقیت اجرای یک تصویر منفرد فقط نشان می‌دهد موتور می‌تواند آن تصویر را آغاز کند.

وقتی سرویس را systemd اداره می‌کند

مستندات Quadlet شرح می‌دهد که تعریف‌هایی مانند فایل .container به واحد systemd تبدیل می‌شوند، مسیرهای جداگانه‌ای برای واحدهای کاربری rootless دارند و به cgroup v2 نیاز دارند. برای اجرای کاربری، فایل باید در یکی از مسیرهای واحد کاربر قرار گیرد؛ افزودن گزینهٔ User به یک واحد سیستمی Quadlet همان نتیجه را نمی‌دهد. به این ترتیب مسئول سرویس می‌تواند وضعیت، وابستگی‌ها و راه‌اندازی آن را با ابزارهای خود systemd اداره کند.

Docker rootless نیز می‌تواند daemon خود را به‌صورت سرویس کاربری systemd اجرا کند، اما واحد مربوط به daemon است و پروژه‌ای که بر Compose تکیه دارد همچنان تعریف استقرار خودش را دارد. تبدیل چنین پروژه‌ای به Quadlet تغییر در شکل تعریف سرویس است، نه تعویض سادهٔ نام فرمان. در مقابل، اگر یک سرویس مستقل دارید و می‌خواهید مالکیت آن به حساب مشخصی گره بخورد، تعریف کاربری Quadlet با این شیوهٔ اداره هماهنگ است.

ماتریس انتخاب برای محیط‌های معمول

  • لپ‌تاپ توسعه: وقتی فایل‌های Compose، اسکریپت‌ها و ابزارهای تیم برای Docker آماده‌اند، ماندن با آن معمولاً کم‌هزینه‌تر است. Podman زمانی ارزش آزمودن دارد که اجرای کاربری یا یکسان‌کردن محیط توسعه با میزبان مقصد مهم باشد؛ پروژهٔ کامل و اتصال پوشهٔ کد باید با ارائه‌دهندهٔ Compose واقعی اجرا شود.
  • سرور تک‌کاربره: هر دو ابزار می‌توانند با حساب محدود کار کنند. Docker rootless گزینه‌ای برای حفظ جریان موجود است؛ Podman rootless با ادارهٔ مستقیم کانتینر زیر همان حساب سازگار است. انتخاب به شیوهٔ استقرار، محل داده و دسترسی لازم به درگاه‌ها بستگی دارد.
  • میزبان چندکاربره: Podman برای جدا نگه داشتن کانتینرهای متعلق به حساب‌های مختلف مناسب است، به شرط آماده بودن نگاشت شناسه‌ها، محل ذخیرهٔ محلی و مالکیت دادهٔ هر کاربر. اگر سرویس مشترک است، حساب مسئول آن باید جدا از حساب‌های شخصی و با اختیار مشخص تعریف شود.
  • سرویس زیر نظر systemd: Quadlet وقتی سودمند است که چرخهٔ عمر کانتینر باید در واحد کاربری یا سیستمی systemd تعریف شود. اگر استقرار فعلی با Compose و ابزارهای Docker اداره می‌شود، حفظ Docker تا وقتی نیاز عملی به تغییر پیدا نشده، از بازنویسی بی‌دلیل جلوگیری می‌کند.

بیشتر بخوانید:

اشتراک‌گذاری:

عضویت در خبرنامه

تازه‌ترین اخبار Web3، هوش مصنوعی و رمزارز را مستقیم در صندوق ایمیل خود دریافت کنید.

0