1. Блог
  2. Мануали

Контейнери Docker у MikroTik RouterOS 7: встановлення й запуск

Контейнери Docker у MikroTik RouterOS 7: встановлення й запуск

RouterOS 7 вміє запускати контейнери з образів Docker просто на роутері. Це дає змогу розмістити на MikroTik невеликі сервіси — блокувальник реклами Pi-hole, сервер моніторингу, проксі або власний скрипт — без окремого комп’ютера. Повноцінного Docker усередині немає: RouterOS використовує власну реалізацію, сумісну з образами формату OCI.

Вимоги та обмеження

  • RouterOS 7.4 або новіша. Краще використовувати актуальну стабільну версію: синтаксис команд для контейнерів змінювався від випуску до випуску.
  • Архітектура arm, arm64 або x86. До останньої належить хмарний роутер CHR на VPS. Образ має бути зібраний під архітектуру пристрою.
  • Зовнішній накопичувач. Вбудованої пам’яті роутера мало, а частий запис швидко її зношує. Використовуйте USB-диск або NVMe; на CHR — окремий віртуальний диск.
  • Оперативна пам’ять. Контейнери витрачають пам’ять роутера. На пристроях із 256 МБ запускати їх не варто.

Крок 1. Встановіть пакет container

  1. На сайті mikrotik.com у розділі завантажень завантажте архів Extra packages для своєї архітектури та версії RouterOS.
  2. Розпакуйте архів і завантажте файл container-*.npk у розділ Files роутера.
  3. Перезавантажте роутер:
/system/reboot

Після перезавантаження в меню з’явиться розділ Container.

Крок 2. Увімкніть режим container

/system/device-mode/update container=yes

Роутер попросить підтвердити дію: протягом зазначеного часу потрібно натиснути кнопку скидання на корпусі або вимкнути й увімкнути живлення. На CHR вимкніть віртуальну машину з панелі керування та запустіть знову. Це захист від віддаленого ввімкнення функції зловмисником.

Перевірте результат:

/system/device-mode/print

Крок 3. Підготуйте диск

Відформатуйте зовнішній накопичувач в ext4 і подивіться його ім’я:

/disk/print
/disk/format-drive usb1 file-system=ext4

Команда форматування знищує всі дані на диску. У прикладах нижче накопичувач називається disk1 — підставте своє ім’я.

Крок 4. Налаштуйте мережу для контейнерів

Контейнер підключається до роутера через віртуальний інтерфейс veth. Створимо окремий міст і підмережу:

/interface/veth/add name=veth1 address=172.17.0.2/24 gateway=172.17.0.1
/interface/bridge/add name=containers
/ip/address/add address=172.17.0.1/24 interface=containers
/interface/bridge/port add bridge=containers interface=veth1

Щоб контейнер міг виходити в інтернет, додайте правило NAT:

/ip/firewall/nat/add chain=srcnat action=masquerade src-address=172.17.0.0/24

Крок 5. Вкажіть реєстр образів

/container/config/set registry-url=https://registry-1.docker.io tmpdir=disk1/tmp

tmpdir — каталог для тимчасових файлів під час завантаження образу. Він має бути на зовнішньому диску.

Крок 6. Запустіть контейнер

Розберемо на прикладі Pi-hole — DNS-сервера з блокуванням реклами.

Задайте змінні оточення:

/container/envs/add list=ENV_PIHOLE key=TZ value="Europe/Kyiv"
/container/envs/add list=ENV_PIHOLE key=FTLCONF_webserver_api_password value="надійний_пароль"
/container/envs/add list=ENV_PIHOLE key=DNSMASQ_USER value="root"

Опишіть постійні каталоги — без них налаштування зникнуть під час перестворення контейнера:

/container/mounts/add list=MOUNT_PIHOLE_PIHOLE src=disk1/volumes/pihole/pihole dst=/etc/pihole
/container/mounts/add list=MOUNT_PIHOLE_DNSMASQD src=disk1/volumes/pihole/dnsmasq.d dst=/etc/dnsmasq.d

Створіть контейнер:

/container/add remote-image=pihole/pihole interface=veth1 root-dir=disk1/images/pihole mountlists=MOUNT_PIHOLE_PIHOLE,MOUNT_PIHOLE_DNSMASQD envlist=ENV_PIHOLE name=pihole start-on-boot=yes logging=yes

Роутер почне завантажувати й розпаковувати образ. Стежте за станом:

/container/print

Коли статус зміниться на stopped, запустіть контейнер:

/container/start pihole

Крок 7. Доступ до сервісу

З локальної мережі контейнер доступний за адресою 172.17.0.2, якщо файрвол дозволяє трафік між мережами. Щоб відкрити вебінтерфейс за адресою самого роутера, прокиньте порт:

/ip/firewall/nat/add chain=dstnat action=dst-nat dst-address=192.168.88.1 dst-port=8080 protocol=tcp to-addresses=172.17.0.2 to-ports=80

Для Pi-hole залишиться вказати адресу 172.17.0.2 як DNS-сервер у налаштуваннях DHCP роутера.

Керування контейнерами

/container/print                # список і стан
/container/start pihole         # запустити
/container/stop pihole          # зупинити
/container/shell pihole         # командний рядок усередині контейнера
/container/remove pihole        # видалити
/log/print where topics~"container"   # журнал

Щоб оновити образ, зупиніть і видаліть контейнер, потім створіть його заново тією самою командою. Дані в змонтованих каталогах збережуться.

Що має сенс запускати на роутері

Підходять легкі мережеві сервіси: Pi-hole або AdGuard Home, клієнт тунелю, невеликий вебсервер, агент моніторингу. Бази даних, медіасервери й усе, що активно пише на диск або потребує багато пам’яті, краще розмістити на окремому сервері з повноцінним Docker — див. інструкцію зі встановлення.

Часті проблеми

  • Розділу Container немає. Не встановлено пакет container або його версія не збігається з версією RouterOS.
  • Команди контейнера недоступні. Не підтверджено режим пристрою: повторіть крок 2.
  • Образ не завантажується. Контейнерна мережа не має виходу в інтернет або не налаштовано DNS на роутері. Перевірте правило NAT і /ip/dns/print.
  • Помилка формату образу. Образ не зібрано під архітектуру роутера.
  • Контейнер запускається й одразу зупиняється. Увімкніть logging=yes і перегляньте журнал: найчастіше бракує пам’яті або не задано обов’язкову змінну оточення.

Безпека

  • Тримайте контейнери в окремій підмережі й обмежуйте їхній доступ до локальної мережі правилами файрвола — базове налаштування описано в статті про захист MikroTik.
  • Не прокидайте порти контейнерів в інтернет без потреби.
  • Регулярно оновлюйте RouterOS та образи.

Відеоінструкція

Відео знято для ранішої версії RouterOS: частина команд відтоді змінилася, загальний порядок дій залишився той самий.

YouTube video