اگه تا حالا با Docker کار کرده باشید، حتماً می‌دونید چه قدرتی داره. با داکر و در واقع کانتینر می‌تونید یه اپلیکیشن کامل رو توی چند ثانیه بالا بیارید، بدون اینکه درگیر نصب صدتا وابستگی روی سیستم بشید. حالا تصور کنید همین قابلیت رو مستقیم روی خود میکروتیک‌تون داشته باشید. بدون نیاز به یه سرور جداگانه. دقیقاً همین کاری هست که کانتینر در میکروتیک برامون انجام می‌ده.

توی این پست از بخش آموزش میکروتیک، می‌خوایم در مورد Container صحبت کنیم؛ از ماهیت و نحوه‌ی کارش، تا کانتینر در میکروتیک , کانفیگش روی RouterOS و دو مثال عملی با 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 مگابایت بر ثانیه پیشنهاد می‌شه. کانتینرها فضای زیادی مصرف می‌کنن و گذاشتنشون روی حافظه‌ی داخلی روتر اصلاً توصیه نمی‌شه.

این پست رو هم بخونین  supout.rif میکروتیک چیست؟

۴. درک شبکه‌ی 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 یه ابزار مانیتورینگ زیبا و خودمیزبانه که وضعیت سرویس‌ها، سایت‌ها و سرورهاتون رو چک می‌کنه و در صورت قطعی، اعلان می‌فرسته. حالا بیا همینو روی میکروتیک بالا بیاریم تا روتر خودش وضعیت کل زیرساخت‌تون رو مانیتور کنه.

این پست رو هم بخونین  تنظیم ساعت و تاریخ لینوکس Centos 7

گام ۱: ساخت اینترفیس و 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 نداره.

محدودیت‌های کانتینر در میکروتیک

این ابزار قدرتمنده، ولی محدودیت‌هاش رو حتماً باید بدونید:

  1. محدودیت سخت‌افزاری: فقط معماری‌های arm، arm64 و x86 پشتیبانی می‌شن. بوردهای قدیمی‌تر با CPU از نوع MIPS اصلاً این قابلیت رو ندارن.
  2. کارایی پایین‌تر از یه سرور واقعی: برخی کاربرها گزارش کردن که حتی روی روترهای قدرتمند، کارایی CPU کانتینرها به‌خاطر محدودیت‌های ساختاری RouterOS پایین‌تر از انتظاره. برای اپلیکیشن‌های سنگین، همچنان یه سرور جدا گزینه‌ی بهتری هست.
  3. مصرف زیاد فضای دیسک: کانتینرها فضای قابل توجهی مصرف می‌کنن، و استفاده از حافظه‌ی داخلی روتر برای این کار اصلاً توصیه نمی‌شه. حتماً یه دیسک USB یا NVMe جدا نیاز دارید.
  4. ریسک امنیتی واقعی: همونطور که خود میکروتیک هم هشدار می‌ده، یه کانتینر آلوده می‌تونه راهی برای نفوذ به کل سیستم روتر باز کنه. این قابلیت رو فقط با image‌های معتبر و شناخته‌شده استفاده کنید.
  5. بدون مدیریت گرافیکی پیشرفته (در نسخه‌های قدیمی‌تر): کار با کانتینر از طریق 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‌های معتبر استفاده کنید و دیسک خارجی مناسب رو فراموش نکنید.

برای یادگیری اصولی میکروتیک دوره‌های آموزش میکروتیک من رو ببینید.

درباره نویسنده

رامتین رحمانی نژاد

از سال 1385 در حوزه آی‌تی و شبکه فعالیت می‌کنم. در راه اندازی و پشتیبانی شبکه‌ و سرویس‌های مایکروسافت، لینوکس، سیسکو، میکروتیک، VOIP، ارتباطات رادیویی و مدیریت سرور تخصص دارم. برای مشاوره، اجرای پروژه و پشتیبانی شبکه با من تماس بگیرین :)

مشاهده تمام مقالات