Podman (مخفف pod manager) یک ابزار متنباز (open source) برای توسعه، مدیریت و اجرای کانتینرهاست. این ابزار توسط مهندسان ردهت (Red Hat) با همکاری جامعه open-source ساخته شده و با استفاده از کتابخانه libpod کل اکوسیستم کانتینر را مدیریت میکند.
معماری Podman بهگونهای طراحی شده که بدون دیمن (daemonless) باشد و همین موضوع امنیت را ارتقا میدهد و آن را به گزینهای در دسترستر تبدیل میکند. همچنین ابزارهای همراه مانند Buildah و Skopeo به توسعهدهندگان اجازه میدهند محیط کانتینر خود را به دلخواه سفارشیسازی کنند. علاوه بر این، Podman Desktop یک رابط گرافیکی (GUI) برای استفاده محلی از Podman فراهم میکند. Podman را میتوان روی توزیعهای مختلف لینوکس مثل Red Hat Enterprise Linux، Fedora، CentOS و Ubuntu اجرا کرد.
پادها (Pods) چه هستند؟
«Pod» در اینجا گروهی از کانتینرهاست که با هم اجرا میشوند و منابع مشترک دارند، مشابه مفهوم Pod در کوبرنتیز. Podman این پادها را با یک رابط خط فرمان ساده (CLI) مدیریت میکند و از کتابخانه libpod استفاده میکند، که APIهایی برای مدیریت کانتینرها، پادها، تصاویر (Images) کانتینر و volumes ارائه میدهد. کانتینرهایی که با Podman ساخته میشوند، از استاندارد OCI (Open Container Initiative) تبعیت میکنند، یعنی با استانداردهای صنعت برای زمان اجرای کانتینرها و فرمتهای تصویر (image) منطبق هستند. هر پاد معمولاً شامل یک «infra container» (زیرساختی) و تعداد دلخواهی کانتینرهای عادی است. کانتینر infra مسئول نگهداری پاد فعال است و namespaceهای کاربری را حفظ میکند، تا جداسازی بین کانتینرها و میزبان محقق شود. بقیه کانتینرها یک «ناظر» (monitor) دارند که فرایندهایشان را پیگیری میکند و وضعیت کانتینرهایی را بررسی میکند که «مرده» شدهاند (یعنی کار نمیکنند ولی منابعشان هنوز آزاد نشدهاند).
چه چیزی Podman را از سایر موتورهای کانتینر (container engines) متمایز میکند؟
بزرگترین تفاوت Podman معماری بدون دیمن آن است. نیازی به یک پروسه پسزمینه با سطح دسترسی روت (root) نیست تا کانتینرها را اجرا کند. در بسیاری از سیستمها، دیمنها با دسترسی روت اجرا میشوند که میتواند ریسک امنیتی باشد چون root به عنوان یک کاربر بسیار قدرتمند، میتواند هدف حمله مهاجمان باشد. Podman این مشکل را با حذف دیمن حل میکند و به کاربران عادی اجازه میدهد کانتینرها را بدون تعامل با یک دیمن روت اجرا کنند. همچنین علاوه بر این، Podman هر کانتینر را با یک برچسب SELinux (Security-Enhanced Linux) اجرا میکند، که کنترل بیشتری را برای مدیران فراهم میآورد درباره اینکه کانتینرها به چه منابعی دسترسی دارند و چه قابلیتهایی دارند.
مدیریت کانتینرها با Podman چگونه انجام میشود؟
کاربران میتوانند از خط فرمان Podman استفاده کنند تا کانتینرها را از یک مخزن pull و اجرا کنند. Podman سپس runtime پیکربندیشده را فراخوانی میکند تا کانتینر اجرا شود. چون Podman دیمن ندارد، برای نگهداری کانتینرها در پسزمینه از systemd استفاده میکند. systemd یکی از مدیران سرویس و سیستم در لینوکس است. با ترکیب Podman و systemd، میتوان واحدهای کنترلی (systemd units) ساخت تا کانتینرها به صورت خودکار با systemd مدیریت شوند. کاربران میتوانند شروع خودکار (auto-start) و مدیریت کانتینرها را از طریق مخازن محلی یا با استفاده از واحدهای systemd کنترل کنند. این امکان باعث میشود کاربران منابع خودشان را مدیریت کنند، بدون آنکه نیاز باشد مجوزهای اضافی مثل نوشتن در بخشهای حساس سیستم داده شود. همچنین هر کاربر میتواند مجموعه کانتینرها و تصاویر (images) مخصوص خودش را داشته باشد، بدون تداخل با سایر کاربران روی یک میزبان.
پس از اتمام کار، کاربران میتوانند تغییراتشان را به یک registry مشترک push کنند تا تصویر (image) قابل اشتراکگذاری باشد. Podman همچنین یک RESTful API ارائه میدهد که به کمک آن میتوان از طریق ابزارهایی مثل cURL، Postman یا کلاینتهای REST دیگر با Podman تعامل کرد.
Podman Desktop چیست؟
Podman Desktop یک رابط گرافیکی است که به توسعهدهندگان اجازه میدهد روی لپتاپ یا دسکتاپشان با کانتینرها کار کنند. با Podman Desktop میشود Image ایجاد کرد، آنها را push یا pull کرد، و منابع Podman را مدیریت نمود، همه با یک رابط گرافیکی یکپارچه که در سیستمعاملهای محلی مثل لینوکس، ویندوز و macOS کار میکند. Podman Desktop همچنین امکان ارائه اپلیکیشنهای کانتینرسازیشده برای محیطهای کوبرنتیز را فراهم میکند. این دسکتاپ از “افزونهها” (extension packs) پشتیبانی میکند تا قابلیتهای اضافه به آن اضافه شود. مثلاً:
Podman AI Lab: افزودن «دستورالعمل» (recipes) برای ساخت اپلیکیشنهایی که با مدلهای زبانی بزرگ (LLM) کار میکنند، همراه با فهرستی از مدلهای متنباز.
بسته افزونه Red Hat: این افزونه مخصوص فناوریهای ردهت مثل OpenShift طراحی شده است.
Podman، Buildah و Skopeo
Podman یک موتور کانتینر ماژولار است، بنابراین برای ساخت و جابجایی کانتینرها به ابزارهای کمکی مانند Buildah و Skopeo نیاز دارد. با Buildah، میتوان کانتینر را «از صفر» ساخت یا از یک Image موجود بهعنوان نقطه شروع استفاده کرد. Skopeo به شما امکان میدهد تصاویر کانتینر را بین انواع مختلف سیستمهای ذخیرهسازی منتقل کنید (مثلاً از یک رجیستری مثل Docker Hub یا quay.io به رجیستری داخلی، یا بین پوشههای محلی). این رویکرد ماژولار باعث میشود محیط کانتینرسازی سبکتر و انعطافپذیرتر شود، چون سربار اضافه کاهش یافته و فقط ابزارهایی که واقعا نیاز دارید بکار گرفته میشوند.
میتوان Podman، Buildah و Skopeo را مثل یک مجموعه چاقوی ارتشی سوئیسی در نظر گرفت، هرکدام ابزار خاصی برای موارد خاص دارند و در مجموع تقریباً تمامی نیازهای مربوط به کانتینر را پوشش میدهند، و Podman بزرگترین «تیغه» این مجموعه است. بهصورت پیشفرض، Podman و Buildah از runtime استاندارد runC (از استاندارد OCI) برای اجرای کانتینرها استفاده میکنند. با runC میتوان Image ساخت یا کانتینر را اجرا کرد، حتی Image با فرمت Docker نیز پشتیبانی میشوند. در صورت نیاز، میتوان Podman را طوری پیکربندی کرد که از runtimeهای دیگر مثل crun استفاده کند.
مقایسه Podman با Docker
Docker یک فناوری کانتینرسازی است که امکان ساخت و اجرای کانتینرهای لینوکسی را فراهم میکند. تفاوت اصلی بین Podman و Docker این است که Podman معماری بدون دیمن (daemon) دارد، در حالی که Docker بهطور سنتی با دیمن / پروسه پسزمینه کار میکند. Podman همیشه حالت «rootless» (بدون روت) را پشتیبانی کرده، در حالی که Docker فقط اخیراً این ویژگی را اضافه کرده است.
Docker یک ابزار همهکاره (all-in-1 ) است برای ساخت و مدیریت کانتینر، اما Podman به همراه ابزارهایش مثل Buildah و Skopeo تخصصیتر است و به شما اجازه میدهد فقط از اجزایی استفاده کنید که واقعا به آنها نیاز دارید. با این حال، Podman و Docker میتوانند با هم کار کنند. میشود یک alias ساخت (مثلاً alias docker=podman) تا فرمان «docker» در واقع Podman را صدا بزند، یا RPMای به نام podman-docker نصب کرد که دستور docker را در مسیر سیستم قرار میدهد و وقتی کسی فرمان docker را اجرا کند، در واقع Podman اجرا شود. این باعث میشود کوچ از Docker به Podman سادهتر شود. از طرفی، کاربران آشنا با CLI داکر احتمالاً با Podman هم سریعتر کار خواهند کرد، چون دستوراتشان به هم شبیهاند. بعضی از توسعهدهندگان در مرحله توسعه (development) از Docker استفاده میکنند و وقتی اپلیکیشن آنها آماده شد، آن را به Podman منتقل میکنند برای اجرا (“runtime”) تولیدی. Podman بیشتر مناسب توسعهدهندگانی است که میخواهند کانتینرها را بدون کوبرنتیز یا پلتفرم بزرگتر مثل Red Hat OpenShift اجرا کنند. اگر نیاز به Kubernetes container orchestration دارید، میتوانید به جای Podman سراغ موتور کانتینری CRI-O بروید که برای کوبرنتیز طراحی شده است.
چرا باید از Podman استفاده کرد؟
به گفته ردهت، Podman برخی مزایا دارد که آن را برای بسیاری از تیمهای توسعه جذاب میکند:
- امکان مدیریت تصاویر کانتینر و چرخه کامل زندگی کانتینرها (ایجاد، اجرا، شبکه بندی، “Checkpoint / Restore” و حذف).
- اجرای کانتینرها بدون روت (“rootless”) و امکان گروهبندی آنها در پادها برای جداسازی منابع.
- پشتیبانی از تصاویر OCI و Docker، و همچنین رابط دستوری که با Docker سازگار است (CLI مشابه).
- حذف دیمن منجر به محیطی امنتر و مصرف منابع کمتر در پسزمینه میشود.
- ارائه REST API برای کنترل پیشرفتهتر Podman از طریق ابزارهایی مثل cURL یا Postman.
- امکان “checkpoint / restore” با استفاده از CRIU (Checkpoint/Restore in Userspace): این امکان میدهد یک کانتینر در حال اجرا را «فریز» (توقف موقت) کرده و وضعیت آن را روی دیسک ذخیره کنید و بعداً مجدداً آن را بارگذاری و اجرا کنید.
- بهروزرسانی خودکار کانتینرها: اگر نسخه جدید یک کانتینر را راهاندازی کنید و آن اجرا نشود، Podman میتواند بهصورت خودکار بازگردانی (rollback) به آخرین نسخه پایدار را انجام دهد. این موضوع قابلیت اطمینان اپلیکیشن را افزایش میدهد.
ادامه دارد …

