اگه تا حالا با Docker کار کرده باشید، حتماً میدونید چه قدرتی داره. با داکر و در واقع کانتینر میتونید یه اپلیکیشن کامل رو توی چند ثانیه بالا بیارید، بدون اینکه درگیر نصب صدتا وابستگی روی سیستم بشید. حالا تصور کنید همین قابلیت رو مستقیم روی خود میکروتیکتون داشته باشید. بدون نیاز به یه سرور جداگانه. دقیقاً همین کاری هست که کانتینر در میکروتیک برامون انجام میده.
توی این پست از بخش آموزش میکروتیک، میخوایم در مورد Container صحبت کنیم؛ از ماهیت و نحوهی کارش، تا کانتینر در میکروتیک , کانفیگش روی RouterOS و دو مثال عملی با Nginx و Uptime Kuma. پس در ادامه با من همراه باشید.
فهرست:
- Container چیست؟
- تفاوت Container با Virtual Machine
- میکروتیک Container رو از کِی اضافه کرد؟
- پیشنیازها و ارتباط شبکه Container میکروتیک
- فعال کردن Container روی MikroTik
- کانفیگ Container در میکروتیک
- مثال اول: راهاندازی Nginx روی میکروتیک
- مثال دوم: راهاندازی Uptime Kuma روی میکروتیک
- محدودیتهای کانتیتر در میکروتیک
- نکات و ترفندهای کاربردی
- عیبیابی کانتینر میکروتیک
Container چیست؟
سادهترین تعریف: Container یه روش بستهبندی نرمافزاره که همه چیزهایی که یه برنامه برای اجرا نیاز داره (کد، کتابخونهها، تنظیمات) رو توی یه واحد مجزا و قابل حمل قرار میده. این واحد روی هر سیستمی که موتور کانتینر رو داشته باشه، دقیقاً همونجوری اجرا میشه که روی سیستم سازندهاش اجرا شده.
برخلاف نصب مستقیم یه برنامه روی سیستمعامل، که ممکنه با نسخهی کتابخونهها یا تنظیمات سیستم تداخل پیدا کنه، کانتینر کاملاً ایزولهست. یعنی هر کانتینر فایلسیستم، شبکه و منابع خاص خودش رو داره، و اگه یه کانتینر مشکل پیدا کنه، روی بقیهی سیستم تاثیری نمیگذاره.
میکروتیک از RouterOS نسخه 7 به بعد (در واقع 7.5)، Container رو اضافه کرده. این کانتینرها با imageهای Docker Hub، GCR، Quay و سایر providerها سازگارن، یعنی همون imageهایی که برای Docker میسازید رو میتونید مستقیم روی RouterOS هم اجرا کنید. فقط دستورات و syntax میکروتیک با Docker فرق داره.
تفاوت Container با Virtual Machine
خب اگه میخوام یه سیستم ایزوله داشته باشم، چرا از ماشین مجازی استفاده نکنم؟
تفاوت اصلی توی لایهای هست که هر کدوم ایزوله میکنن:
- Virtual Machine: یه کرنل کامل و مجازیسازیشده برای خودش داره. یعنی هر VM یه سیستمعامل کامل با کرنل، درایورها و همه چیز اجرا میکنه. این یعنی مصرف منابع بالاتر و زمان بوت طولانیتر.
- Container: کرنل سیستمعامل میزبان رو به اشتراک میگذاره و فقط فایلسیستم، شبکه و فضای پردازشی خودش رو ایزوله میکنه. این یعنی سبکتر، سریعتر برای بالا اومدن، و مصرف منابع بسیار کمتر.
دقیقاً به همین خاطر هست که میکروتیک، با وجود محدودیت سختافزاری روترها (RAM و CPU محدود نسبت به یه سرور واقعی)، تونست از Container پشتیبانی کنه، در حالی که اجرای یه Virtual Machine کامل روی اکثر روترها عملاً غیرممکنه.

میکروتیک Container رو از کِی اضافه کرد؟
پشتیبانی از Container از RouterOS نسخهی 7.4 به بعد در دسترسه و روی معماریهای arm، arm64 و x86 کار میکنه. این یعنی روتربوردهای قدیمیتر با معماریهای CPU مثل MIPS, SMIP, MIPSBE و… اصلاً قابلیت اجرای کانتینر رو ندارن.
یه نکتهی مهم اینجا: استفاده از remote-image (که شبیه docker pull عمل میکنه) به فضای حافظهی آزاد زیادی نیاز داره. (جاوتر با جزییات بیشتر میبینید). برای بوردهایی با فلش 16 مگابایتی، باید از imageهای از قبل ساختهشده روی USB یا سایر فضای ذخیرهسازی استفاده کنید.
پیشنیازها و ارتباط شبکه Container میکروتیک
قبل از شروع، این موارد رو حتماً باید داشته باشید:
۱. دسترسی فیزیکی به دستگاه: فعالسازی قابلیت Container، بهخاطر ریسکهای امنیتیش، نیاز به تایید فیزیکی (فشردن دکمهی Reset یا ریستارت سرد) دارد.
۲. پکیج Container: باید پکیج container رو روی RouterOS نصب کرده باشید.
۳. دیسک خارجی: یه دیسک USB یا SATA با سرعت خوندن/نوشتن حداقل 100 مگابایت بر ثانیه پیشنهاد میشه. کانتینرها فضای زیادی مصرف میکنن و گذاشتنشون روی حافظهی داخلی روتر اصلاً توصیه نمیشه.
۴. درک شبکهی VETH: میکروتیک برای دادن دسترسی شبکه به کانتینرها، از یه اینترفیس مجازی به اسم veth (Virtual Ethernet) استفاده میکنه. این اینترفیس دقیقاً معادل شبکه توی Docker عمل میکنه؛ یعنی کانتینرها روی یه شبکهی داخلی جدا قرار میگیرن و برای دسترسی به بیرون، از NAT یا فایروال استفاده میکنن.
فعال کردن Container روی MikroTik
برای فعال کردن قابلیت کانتینر، باید Device-mode رو تغییر بدید:
/system/device-mode/update container=yes
بعد از اجرای این دستور، باید یا دکمهی Reset رو فیزیکی فشار بدید، یا یه ریستارت سرد (Cold Reboot) انجام بدید تا فعالسازی تایید بشه. این یه مکانیزم امنیتیه که جلوی فعالسازی از راه دور و بدون اطلاع رو میگیره.
⚠️ هشدار امنیتی مهم: همونطور که خود میکروتیک هم تاکید میکنه، امنیت روترتون دقیقاً به اندازهی امنیت چیزی هست که داخل کانتینر اجرا میکنید. اگه یه image آسیبپذیر اجرا کنید، میتونه دروازهی نفوذ به کل شبکهتون بشه. پس همیشه از imageهای معتبر و رسمی استفاده کنید.
کانفیگ Container در میکروتیک
کانفیگ Container توی چند بخش منطقی پخش شده:
1. اینترفیس شبکه: /interface/veth
اول باید یه اینترفیس veth بسازید و یه آیپی داخلی بهش بدید:
/interface/veth/add name=veth1 address=172.17.0.2/24 gateway=172.17.0.1
2. بریج برای کانتینرها: /interface/bridge
یه بریج جدا برای کانتینرها میسازید و آیپی gateway همون veth رو روی بریج میگذارید:
/interface/bridge/add name=containers
/ip/address/add address=172.17.0.1/24 interface=containers<br>/interface/bridge/port add bridge=containers interface=veth1
3. قانون NAT برای دسترسی به اینترنت
کانتینرها برای دانلود image و دسترسی به اینترنت نیاز به masquerade دارن:
/ip/firewall/nat/add chain=srcnat action=masquerade src-address=172.17.0.0/24
4. خود کانتینر: /container
اینجا جدول اصلی کانتینرهاست. مهمترین پراپرتیهاش:
| پراپرتی | توضیح |
|---|---|
| remote-image | اسم image که میخواید از رجیستری (مثل Docker Hub) دانلود بشه |
| interface | اینترفیس veth که این کانتینر ازش استفاده میکنه |
| root-dir | مسیری که فایلهای کانتینر روی دیسک ذخیره میشن (همیشه روی دیسک خارجی) |
| mounts | لیست mount pointهایی که برای دسترسی به فایلهای پایدار استفاده میشن |
| envlist | لیست متغیرهای محیطی (environment variables) برای کانتینر |
| start-on-boot | اگه yes باشه، کانتینر بعد از روشن شدن روتر خودکار اجرا میشه |
| logging | اگه yes باشه، خروجی کانتینر توی لاگ سیستم RouterOS دیده میشه |
| memory-high / memory-max | محدودیت مصرف RAM برای کانتینر |
مثال اول: راهاندازی Nginx روی میکروتیک
بیا فرض کنیم میخواید یه سرور Nginx ساده روی میکروتیک بالا بیارید که یه صفحهی HTML استاتیک رو سرو کنه.
گام ۱: تعریف رجیستری و mount
اول رجیستری Docker Hub و پوشهی موقت رو روی دیسک خارجی تنظیم کنید:
/container/config/set registry-url=https://registry-1.docker.io tmpdir=usb1/tmp
گام ۲: ساخت mount برای فایلهای HTML
بهجای اینکه فایلها رو داخل خود کانتینر بگذارید، یه پوشه روی دیسک میکروتیک میسازید و بهش mount میکنید:
/file/add type=directory name=usb1/nginx/html<br>/container/mounts/add name=nginx_html src=usb1/nginx/html dst=/usr/share/nginx/html
فایل index.html خودتون رو با Winbox یا FTP داخل همین پوشه آپلود کنید.
گام ۳: ساخت کانتینر در میکروتیک
/container/add remote-image=nginx:1.25.3-alpine interface=veth1 root-dir=usb1/images/nginx mounts=nginx_html name=nginx start-on-boot=yes logging=yes
گام ۴: بررسی وضعیت و استارت
/container/print<br>/container/start [find name=nginx]
گام ۵: پابلیش کردن سرویس با NAT
چون Nginx پیشفرض روی پورت 80 گوش میده، و خود میکروتیک هم معمولاً پورت 80 رو برای پنل وب (WebFig) استفاده میکنه، باید یا www رو خاموش کنید یا پورت دیگهای رو فوروارد کنید:
/ip/service/set www disabled=yes<br>/ip/firewall/nat/add chain=dstnat action=dst-nat dst-address=192.168.88.1 dst-port=80 protocol=tcp to-addresses=172.17.0.2 to-ports=80
بعد از این مراحل، با باز کردن آیپی روتر توی مرورگر، سایت استاتیکتون رو میبینید. اگه میخواید همین سایت رو با دامین و SSL هم منتشر کنید، توی پست Reverse Proxy میکروتیک کامل توضیح دادم چطور این کار رو با همون ابزار بومی RouterOS انجام بدید.
مثال دوم: راهاندازی Uptime Kuma با کانتینر در میکروتیک
Uptime Kuma یه ابزار مانیتورینگ زیبا و خودمیزبانه که وضعیت سرویسها، سایتها و سرورهاتون رو چک میکنه و در صورت قطعی، اعلان میفرسته. حالا بیا همینو روی میکروتیک بالا بیاریم تا روتر خودش وضعیت کل زیرساختتون رو مانیتور کنه.
گام ۱: ساخت اینترفیس و mount جدا
برای جداسازی بهتر، یه veth و mount مخصوص Uptime Kuma میسازیم (یا میتونید از همون veth1 قبلی استفاده کنید):
/interface/veth/add name=veth2 address=172.17.0.3/24 gateway=172.17.0.1<br>/interface/bridge/port add bridge=containers interface=veth2
گام ۲: ساخت mount
Uptime Kuma تمام مانیتورها و تنظیماتش رو توی مسیر /app/data ذخیره میکنه. این مسیر باید حتماً mount بشه، وگرنه با هر ریستارت کانتینر، همهی دیتاتون از بین میره:
/file/add type=directory name=usb1/uptime-kuma/data<br>/container/mounts/add name=kuma_data src=usb1/uptime-kuma/data dst=/app/data
گام ۳: ساخت کانتینر در میکروتیک
/container/add remote-image=louislam/uptime-kuma:1 interface=veth2 root-dir=usb1/images/uptime-kuma mounts=kuma_data name=uptime-kuma start-on-boot=yes logging=yes
گام ۴: استارت کردن
/container/print<br>/container/start [find name=uptime-kuma]
گام ۵: دسترسی به پنل وب
Uptime Kuma بصورت پیشفرض روی پورت 3001 کار میکنه. یه قانون NAT برای دسترسی از داخل شبکه (یا حتی از بیرون، اگه بخواید) بسازید:
/ip/firewall/nat/add chain=dstnat action=dst-nat dst-address=192.168.88.1 dst-port=3001 protocol=tcp to-addresses=172.17.0.3 to-ports=3001
حالا با باز کردن http://192.168.88.1:3001 توی مرورگر، صفحهی راهاندازی اولیهی Uptime Kuma رو میبینید. یه حساب کاربری بسازید و شروع کنید به اضافه کردن مانیتورها برای سرویسهای مهم شبکهتون.
⚠️ نکتهی امنیتی: اگه میخواید این پنل از بیرون هم در دسترس باشه، بهتره پشت یه Reverse Proxy با SSL و یه پسورد قوی بگذاریدش؛ این پنل بهصورت پیشفرض هیچ محدودیت IP نداره.
محدودیتهای کانتینر در میکروتیک
این ابزار قدرتمنده، ولی محدودیتهاش رو حتماً باید بدونید:
- محدودیت سختافزاری: فقط معماریهای arm، arm64 و x86 پشتیبانی میشن. بوردهای قدیمیتر با CPU از نوع MIPS اصلاً این قابلیت رو ندارن.
- کارایی پایینتر از یه سرور واقعی: برخی کاربرها گزارش کردن که حتی روی روترهای قدرتمند، کارایی CPU کانتینرها بهخاطر محدودیتهای ساختاری RouterOS پایینتر از انتظاره. برای اپلیکیشنهای سنگین، همچنان یه سرور جدا گزینهی بهتری هست.
- مصرف زیاد فضای دیسک: کانتینرها فضای قابل توجهی مصرف میکنن، و استفاده از حافظهی داخلی روتر برای این کار اصلاً توصیه نمیشه. حتماً یه دیسک USB یا NVMe جدا نیاز دارید.
- ریسک امنیتی واقعی: همونطور که خود میکروتیک هم هشدار میده، یه کانتینر آلوده میتونه راهی برای نفوذ به کل سیستم روتر باز کنه. این قابلیت رو فقط با imageهای معتبر و شناختهشده استفاده کنید.
- بدون مدیریت گرافیکی پیشرفته (در نسخههای قدیمیتر): کار با کانتینر از طریق CLI یا Winbox نسبت به ابزارهایی مثل Docker Compose یا Portainer دستوپاگیرتره. البته میکروتیک از RouterOS 7.21 به بعد یه منوی جدید به اسم
/appمعرفی کرده که نصب کانتینرهای محبوب (شامل خود Uptime Kuma) رو با چند کلیک ساده میکنه.
نکات و ترفندهای کاربردی
چند ترفند که کارتون رو راحتتر میکنه:
محدود کردن مصرف RAM یه کانتینر خاص:
/container/set [find name=nginx] memory-high=200M
ورود به شل یه کانتینر در حال اجرا:
/container/shell [find name=nginx]
دیدن لاگهای یه کانتینر:
/container/set [find name=nginx] logging=yes<br>/log/print
اجرای start-on-boot برای راهاندازی خودکار بعد از ریستارت:
/container/set [find name=nginx] start-on-boot=yes
اجرای دستور داخل کانتینر بدون ورود به شل:
/container/shell [find name=nginx] cmd="nginx -t" no-sh
عیبیابی کانتینر در میکروتیک
اگه کانتینرتون بالا نمیاد، این مراحل رو یکییکی چک کنید:
۱. وضعیت کانتینر رو ببینید:
/container/print detail
اگه status روی extracting گیر کرده، یعنی هنوز در حال دانلود/استخراج image هست. صبر کنید تا به stopped برسه، بعد start کنید.
۲. لاگها رو بررسی کنید:
/log/print where topics~"container"
۳. دسترسی شبکهی کانتینر رو تست کنید: از داخل شل کانتینر، پینگ بزنید:
/container/shell [find name=nginx]
ping 8.8.8.8
اگه پینگ نداشتید، رول masquerade روی srcnat رو دوباره چک کنید.
۴. مشکل دسترسی فایل (403 یا Permission denied): این مشکل معمولاً وقتی پیش میاد که فایلهای mount شده، مالکیت (ownership) درستی نداشته باشن. از طریق شل کانتینر میتونید مجوزها رو اصلاح کنید.
۵. کانتینر بعد از استارت بلافاصله متوقف میشه: معمولاً یعنی پروسهی اصلی داخل کانتینر کرش کرده. لاگ کانتینر رو با logging=yes فعال کنید و دوباره استارتش کنید تا دلیل خطا رو ببینید.
Container در RouterOS یه قابلیت قدرتمنده که بدون نیاز به سرور جداگانه، اجازه میده اپلیکیشنهای مفیدی مثل Nginx، Uptime Kuma، Pi-hole و خیلی چیزای دیگه رو مستقیم روی میکروتیکتون اجرا کنید. فقط حواستون باشه که این قابلیت، مسئولیت امنیتی هم به همراه داره. پس همیشه از imageهای معتبر استفاده کنید و دیسک خارجی مناسب رو فراموش نکنید.
برای یادگیری اصولی میکروتیک دورههای آموزش میکروتیک من رو ببینید.


