docker ps را باز میکنی، سه کانتینر بالا هستند و یکی Restarting. بعد docker compose -f را با مسیر اشتباه میزنی، لاگ را با docker logs --tail میکشی و هنوز نمیدانی Volume کجاست. وقتی چند سرویس و چند فایل Compose روی یک سرور جمع میشود، خط فرمان کافی است ولی خستهکننده میشود. اینجاست که یک پنل گرافیکی مثل Portainer معنی پیدا میکند: همان Docker Engine، فقط با داشبورد.
در ادامه میبینی Portainer چیست، برای چه کارهایی به درد میخورد، با CLI و Docker Desktop چه فرقی دارد، چطور Community Edition را با Docker روی سرور نصب میکنی، بعد از نصب کدام بخشها را اول لمس کنی، و چه نکات امنیتی را جدی بگیری. پیشنیاز ذهنیات Docker و ترجیحاً Docker Compose است؛ اگر هنوز بین Docker و Kubernetes مرددی، راهنمای جامع Docker یا Kubernetes را کنار دست نگه دار.

Portainer چیست؟
این ابزار یک پنل مدیریت برای محیطهای کانتینری است. روی همان ماشینی که Docker Engine دارد (یا روی یک محیط remote) یک کانتینر برای این پنل بالا میآوری و از مرورگر به داشبورد وصل میشوی. از آنجا Container، Image، Volume، Network و Stack را میبینی، لاگ میخوانی، کنسول میگیری، و بدون حفظ کردن دهها فلگ CLI کارهای روزمره را انجام میدهی.
دو نسخهٔ رسمی رایج است:
- Portainer CE (Community Edition): رایگان و متنباز برای تیمهای کوچک و سرور شخصی/تیمی؛ همین مقاله روی نصب CE تمرکز دارد.
- Portainer Business: امکانات سازمانی بیشتر (RBAC پیشرفتهتر، رجیستری و سیاستهای تیمی). اگر فقط یک VPS و چند Stack داری، CE معمولاً کافی است.
خودش جایگزین Docker نیست. Engine همان Docker است؛ این پنل فقط UI و API مدیریتی روی آن مینشیند. میتوانی همزمان از CLI و از داشبورد استفاده کنی: یک Stack را از UI دیپلوی کنی و همان شب با docker compose روی سرور دیباگ کنی. دادهٔ تنظیمات معمولاً داخل یک Volume جدا میماند تا با ریاستارت کانتینر پنل، کاربر ادمین و اتصالهای محیط از بین نروند.
از نظر معماری، یک Agent اختیاری هم وجود دارد برای مدیریت چند نود یا محیط remote. برای شروع روی یک سرور تکی، همان نصب استاندارد سادهٔ CE روی Docker socket کافی است: کانتینر پنل به /var/run/docker.sock دسترسی میگیرد و از همانجا Engine را میخواند. این دسترسی قدرتمند است؛ برای همین بخش امنیت را جدی میگیریم.
اگر با PaaS کار کردهای و عادت داری از پنل سرویس بسازی، همین UI حس مشابهی روی VPS خام میدهد؛ فقط لایهٔ زیرین هنوز Docker خودت است. تفاوت PaaS و VPS را در PaaS یا VPS؟ ببین؛ اینجا فرض میکنیم خودت Engine را روی سرور نگه میداری و فقط لایهٔ مدیریت را سبک میکنی.
Portainer برای چه کارهایی مناسب است؟
قبل از نصب، سه سناریوی واقعی بنویس. اگر فقط یک کانتینر Nginx تستی داری، شاید docker run و دو دستور لاگ کافی باشد. وقتی اینها جمع شدند، GUI میصرفد:
چند سرویس روی یک VPS. وب، دیتابیس، Redis، یک worker و یک reverse proxy. هر کدام Image و Volume جدا دارند. در داشبورد وضعیت همه را در یک صفحه میبینی، Restart میزنی، و بدون SSH فوری لاگ میگیری.
تیم کوچک بدون تخصص عمیق CLI. طراح یا بکاندکار باید بداند کانتینر بالا است یا نه، ولی نمیخواهد هر بار فلگ docker inspect را گوگل کند. با دسترسی محدود (Users) میتوانی داشبورد را به نفر دوم بدهی بدون اینکه کلید root سرور را پخش کنی.
دیپلوی با Stack از روی Compose. همان فایل docker-compose.yml را بهصورت Stack در همین پنل لود میکنی، متغیر محیطی میگذاری، و از UI آپدیت میکنی. اگر Compose را بلدی، منحنی یادگیری کوتاه است؛ همان مفاهیم Service و Volume است، فقط دکمه دارد.
آموزش و دمو. روی لپتاپ یا سرور آزمایشی، دانشجو یا همکار جدید بدون ترس از پاک کردن اشتباهی حجم، وضعیت Imageها را میبیند. برای پروداکشن جدی، باز هم باید بدانی پشت دکمه چه دستوری اجرا میشود.
حد را هم بشناس. این پنل جایگزین Kubernetes نیست. اگر صدها نود، Autoscale پیچیده و GitOps سنگین میخواهی، مسیر ارکستراسیون فرق دارد. برای یک تا چند سرور Docker و مدیریت روزمرهٔ کانتینر، اندازهٔ مناسبی است. Docker Desktop روی مک/ویندوز برای توسعهٔ محلی است؛ این UI بیشتر روی سرور لینوکس و محیط remote معنا دارد.
یک تست ساده: اگر هفتهای چند بار برای «کدام کانتینر پورت ۸۰ را گرفته» یا «Volume دیتابیس کجاست» SSH میزنی، داشبورد وقتت را برمیگرداند. اگر هنوز یک کانتینر Hello World داری، اول CLI را محکم کن بعد UI را اضافه کن.
مقایسه Portainer با خط فرمان Docker و Docker Desktop
جدول زیر برای انتخاب ابزار است، نه برای اینکه یکی را «بد» بدانی. خیلیها هر سه را در جای درست استفاده میکنند.
| معیار | CLI (docker / Compose) |
Docker Desktop | Portainer CE |
|---|---|---|---|
| محیط رایج | سرور و اسکریپت | مک / ویندوز محلی | سرور لینوکس + مرورگر |
| رابط | ترمینال | اپ دسکتاپ + بخشی GUI | داشبورد وب |
| اتوماسیون CI | عالی (اسکریپتپذیر) | محدودتر روی لپتاپ | مکمل UI؛ CI همچنان CLI |
| مدیریت چند سرویس | Compose در فایل | Compose محلی | Stack از روی Compose |
| مناسب برای | دقیق، تکرارپذیر، SSH | توسعه روی لپتاپ | عملیات روزمره روی VPS |
| وابستگی | فقط Engine | Desktop + Engine مجازی | یک کانتینر + دسترسی به socket |
CLI هنوز منبع حقیقت است. هر چیزی که در UI میبینی، در نهایت به API همان Engine میرسد. اگر اسکریپت بکاپ شبانه یا پایپلاین CI داری، همان docker و docker compose را نگه دار. Docker Desktop برای این است که روی مک یا ویندوز بدون سرور لینوکس واقعی، کانتینر را برای توسعه بالا بیاوری. داشبورد وقتی میدرخشد که سرور لینوکس در دیتاسنتر داری و میخواهی از مرورگر وضعیت را ببینی، به همکار دسترسی بدهی، یا Stack را بدون حفظ کردن تمام فلگها نگه داری.
ترکیب رایج تیمهای کوچک: توسعه روی Desktop یا CLI محلی، دیپلوی روی VPS با Compose، و این UI برای مانیتورینگ و عملیات روزانه. هیچکدام جای دیگری را کامل نمیگیرد.
نصب Portainer روی سرور
فرض کار: یک سرور لینوکس با Docker Engine نصب است و با کاربر دارای دسترسی Docker کار میکنی. اگر Compose را هنوز روان بلد نیستی، اول Docker Compose چیست؟ را بخوان؛ برای Stack بعداً همان فایلها را در UI لود میکنی.

مسیر سریع با docker run
اول Volume دادهٔ پنل را بساز تا تنظیمات و کاربر ادمین پایدار بماند. مسیر رسمی Community Edition برای Docker روی لینوکس در مستندات Portainer هم آمده؛ مراحل زیر همان ایده را خلاصه میکند:
docker volume create portainer_data
بعد Community Edition را بالا بیاور. پورت 8000 برای Agent اختیاری است؛ پورت 9443 رابط HTTPS خود این سرویس است:
docker run -d \
--name portainer \
--restart=unless-stopped \
-p 8000:8000 \
-p 9443:9443 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:latest
مرورگر را روی https://SERVER_IP:9443 باز کن. گواهی self-signed هشدار میدهد؛ برای تست میتوانی ادامه بدهی، برای پروداکشن بهتر است پشت reverse proxy با گواهی واقعی بروی. در اولین ورود، کاربر admin را میسازی و رمز قوی میگذاری. محیط (Environment) را روی Docker محلی که socket را mount کردهای انتخاب میکنی.
اگر به هر دلیل کانتینر بالا نیامد:
docker ps -a --filter name=portainer
docker logs portainer
مسیر Compose برای ماندگاری بهتر
خیلی تیمها همین سرویس را هم داخل یک docker-compose.yml نگه میدارند تا بازسازی سرور تکرارپذیر باشد:
services:
portainer:
image: portainer/portainer-ce:latest
container_name: portainer
restart: unless-stopped
ports:
- "8000:8000"
- "9443:9443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer_data:/data
volumes:
portainer_data:
در همان پوشه:
docker compose up -d
docker compose logs -f portainer
آپدیت تصویر:
docker compose pull
docker compose up -d
قبل از docker compose down -v مطمئن شو Volume را عمداً پاک نمیکنی؛ با -v دادهٔ ادمین و تنظیمات میرود. بکاپ عملی یعنی کپی منظم Volume portainer_data یا اسنپشات دیسک، بهاضافهٔ export تنظیمات مهم از UI اگر در نسخهات هست.
بعد از نصب: اولین چکلیست
- داشبورد را باز کن و ببین Engine را میشناسد (تعداد Container / Image غیرصفر یا صفرِ منطقی).
- یک کانتینر تستی را از UI Stop و Start کن؛ بعد همان را با CLI چک کن تا بفهمی UI و Engine یکی هستند.
- پورت
9443را روی فایروال محدود کن (IP دفتر یا VPN)، نه باز برای کل اینترنت، مگر پشت احراز هویت و HTTPS درست. - اگر دامنه میخواهی، reverse proxy (Nginx / Traefik / Caddy) را روی
9443یا پورت داخلی بگذار و HTTP را به HTTPS هدایت کن. اگر بعداً خطای ۵۰۲ دیدی، راهنمای Nginx 502 را برای لایهٔ پروکسی مرور کن.
امکانات مهم بعد از نصب
بعد از ورود، منوی چپ را یکییکی باز کن. لازم نیست همه را روز اول عمیق یاد بگیری؛ این شش بخش بیشتر به کارت میآیند.
Containers. لیست کانتینرها، وضعیت، پورتهای publishشده، دکمهٔ Start/Stop/Restart، لاگ زنده، و گاهی exec برای شل داخل کانتینر. همان کار docker ps و docker logs و docker restart با دکمه.
Images. Imageهای محلی، حجم، و پاکسازی Image بلااستفاده. قبل از prune دستهجمعی مطمئن شو Image پایهٔ سرویس حیاتی را نداری از دست میدهی.
Volumes. نام Volume، اتصال به کانتینر، و محل دادهٔ پایدار. وقتی دیتابیس «ناپدید» میشود، معمولاً Volume را اشتباه پاک کردهای؛ اینجا مالکیت داده را ببین.
Networks. شبکهٔ bridge پیشفرض و شبکههای سفارشی Compose. اگر دو سرویس همدیگر را با نام DNS داخلی پیدا نمیکنند، اول Network مشترک را چک کن.
Stacks. ترجمهٔ UI برای Compose: یک Stack چند سرویس را با هم بالا میآورد. فایل YAML را paste یا آپلود میکنی، env میگذاری، Deploy میزنی. برای آپدیت، Stack را ویرایش و Redeploy میکنی. اگر از قبل Compose روی سرور داری، میتوانی همان مدل را به Stack منتقل کنی یا موازی نگه داری؛ دو بار مدیریت نکن مگر دلیل داشته باشی.
Users و دسترسی. کاربر ادمین را تنها نگه ندار. برای همکار، کاربر جدا با دسترسی محدودتر بساز. رمزها را در مدیران رمز تیم نگه دار، نه در گروه تلگرام.
علاوه بر اینها، بخش Host یا Dashboard خلاصهٔ CPU/RAM و وضعیت Engine را نشان میدهد. برای مانیتورینگ عمیقتر متریک (Prometheus و دوستان) هنوز مسیر جداست؛ این UI جایگزین APM کامل نیست، ولی برای «الان چه کسی Up است» کافی است.
نکات امنیتی عملی
داشبورد روی Docker socket یعنی تقریباً قدرت root روی Engine. اگر پنل را بد امن کنی، مهاجم به کانتینر تو میرسد و از آنجا به میزبان نزدیک میشود.
پورت ۹۴۴۳ را بیمحابا عمومی نکن. روی فایروال فقط IP خودت، دفتر، یا VPN را باز بگذار. اگر باید از اینترنت باز باشد، حتماً HTTPS معتبر، رمز قوی، و در صورت امکان لایهٔ اضافه (SSO سازمانی، VPN، یا حداقل fail2ban روی پروکسی) داشته باش.
رمز admin را جدی بگیر. اولین کاربری که میسازی کلید گاوصندوق است. رمز کوتاه یا تکراری نگذار. اگر افراد تیم عوض میشوند، کاربرشان را غیرفعال کن.
HTTPS واقعی. گواهی self-signed برای لاب کافی است؛ برای پروداکشن دامنه بگذار و Let’s Encrypt یا گواهی سازمانی از طریق reverse proxy. مرورگر بدون هشدار یعنی تیم کمتر «Advanced → Proceed» میزند و عادت خطرناک کمتر شکل میگیرد.
Reverse proxy. Nginx یا Traefik را جلوی این پنل بگذار، پورت مستقیم را از اینترنت ببند، و فقط ۸۰/۴۴۳ پروکسی را باز بگذار. WebSocket و هدرهای لازم را طبق مستند رسمی برای نسخهٔ فعلیات تنظیم کن.
Socket را بیدلیل share نکن. Mount کردن docker.sock به کانتینرهای متفرقه یعنی دادن کنترل Engine. فقط به همین پنل (یا Agent رسمی) بده، نه به هر پروژهٔ آزمایشی.
بهروز نگه دار. Image portainer/portainer-ce را دورهای pull کن. نسخهٔ قدیمی UI گاهی با Engine جدید ناسازگار یا دارای باگ امنیتی بستهشده است.
بکاپ Volume. portainer_data را مثل دادهٔ سرویس حساب کن. بعد از بازیابی، یکبار با کاربر غیرعملیاتی لاگین تست کن تا ببینی تنظیمات برگشته.
جدا کردن محیط. سرور پروداکشن و سرور تست را قاطی نکن. اگر فقط یک ماشین داری، حداقل Stackها و نامگذاری را جدا نگه دار و دسترسی UI را محدودتر کن.
شروع سریع روی سرور ابری چابکان برای Docker
اگر هنوز سرور لینوکس آماده نداری، روی سرور ابری چابکان یک VPS لینوکس بردار، Docker را نصب کن، بعد با دستورهای همین مقاله نسخهٔ CE را بالا بیاور. برنامهٔ آمادهٔ اختصاصی این ابزار در فهرست سرویسهای چابکان نیست؛ مسیر رسمی همین است: سرور خودت + Docker + CE. برای تعریف سرویسهای چندکانتینری، Docker Compose چیست؟ را بخوان و Stackها را از روی همان فایلها بساز.
از پنل چابکان منابع و موقعیت دیتاسنتر را انتخاب میکنی؛ جزئیات پلنها را همان صفحهٔ محصول ببین. این مقاله روی نصب و امنیت UI تمرکز دارد، نه روی جدول مشخصات. وقتی Engine بالا آمد، اول Compose یک سرویس ساده را تست کن، بعد داشبورد را اضافه کن تا همان کانتینر را در داشبورد ببینی. اگر بعداً به PaaS بدون مدیریت Engine فکر کردی، مقایسهٔ PaaS یا VPS؟ کمکت میکند تصمیم بگیری کجا باشی.
سوالات متداول
Portainer چیست و چه فرقی با خود Docker دارد؟
یک رابط گرافیکی و لایهٔ مدیریت روی Docker Engine است. Docker کار اجرا و ایزوله کردن کانتینر را میکند؛ این پنل همان عملیات را از مرورگر نشان میدهد و سادهتر میکند. بدون Engine، داشبورد چیزی برای مدیریت ندارد.
آیا Portainer رایگان است؟
نسخهٔ CE رایگان و متنباز است و برای اکثر تیمهای کوچک کافی است. Business Edition امکانات سازمانی بیشتری دارد؛ جزئیات پلنها را از سایت رسمی Portainer ببین، نه از اعداد حدسی این مقاله.
برای نصب Portainer حتماً Docker Compose لازم است؟
نه. با docker run هم بالا میآید. Compose فقط بازسازی و نسخهبندی را راحتتر میکند و برای Stackهای بعدی همان زبان YAML را یکدست نگه میدارد. یادگیری Compose را در مقالهٔ Docker Compose انجام بده.
پورت پیشفرض Portainer چیست و چرا خطرناک است اگر باز بماند؟
رابط HTTPS معمولاً روی 9443 است. باز بودن این پورت روی کل اینترنت بدون محدودیت IP و بدون رمز قوی، یعنی در معرض اسکن و تلاش ورود. بهتر است پشت فایروال محدود یا reverse proxy با HTTPS معتبر باشد.
آیا میتوانم همزمان از CLI و داشبورد استفاده کنم؟
بله. هر دو به یک Engine وصل میشوند. کانتینری که با CLI ساختهای در لیست UI دیده میشود و برعکس. فقط مراقب باش یک سرویس را از دو جا با دو روش متناقض آپدیت نکنی؛ یک منبع حقیقت (مثلاً یک Stack یا یک فایل Compose) انتخاب کن.
Portainer برای Kubernetes هم هست؟
بله، میتواند به محیطهای Kubernetes هم وصل شود، ولی این مقاله روی سناریوی رایج Docker روی یک سرور تمرکز دارد. اگر هنوز روی انتخاب Docker در مقابل Kubernetes هستی، اول همان راهنمای مقایسه را بخوان؛ پیچیدگی K8s را فقط وقتی بیاور که واقعاً به آن نیاز داری.