Публикация

Запускаем контейнеры докер на роутере Mikrotik

Mikrotik с версии RouterOS 7.5 поддерживает контейнеры докер

Запустим что-нибудь интересное, например AdguardHome

Для начала скачиваем файл Extra packages для своей архитектуры с сайта Mikrotik.

Разархивируем и файл container-7.X.npk закидываем на роутер в меню Files.

Перезагружаем роутер.

Функционал контейнеров добавлен, но еще надо его активировать.

Для этого в терминале роутера выполняем команду

1
/system/device-mode/update container=yes

После этой команды в течении 5 минут необходимо выполнить cold reboot роутера. Сold reboot - это выдернуть шнур питания из розетки или нажать кнопку reset на роутере. В моем случае выдергивание из розетки не помогло и пришлось вытаскивать роутер из стойки и жать кнопку reset.

Появится меню container:

В линуксе докер сам создает необходимую себе инфраструктуру: сеть, интерфейсы, адреса, правила файрвола. Здесь же придется все прописывать вручную..

Создадим bridge для контейнеров

1
/interface/bridge/add name=containers

Назначим ему внутренний адрес

1
/ip/address/add address=172.17.0.1/24 interface=containers

Создадим виртуальный сетевой интерфейс для нашего будущего контейнера и назначим ему адрес 172.17.0.2

1
/interface/veth/add name=veth1 address=172.17.0.2/24 gateway=172.17.0.1

Добавим интерфейс будущего контейнера в созданный bridge

1
/interface/bridge/port add bridge=containers interface=veth1

Для каждого контейнера надо создавать свой интерфейс veth c новым адресом и добавлять их в bridge

Внутренней памяти роутера скорее всего окажется недостаточно для запуска большинства контейнеров, поэтому рекомендую использовать флешку или внешний диск. Их необходимо отформатировать самостоятельно, либо через меню System -> Disk -> Format Drive

Переходим к настройке контейнера Container -> Config

1
/container/config/set registry-url=https://registry-1.docker.io tmpdir=usb1-part1/pull

Здесь https://registry-1.docker.io реестр откуда будут скачиваться образы контейнеров, usb1-part1/pull - директория на флешке куда они будут скачиваться.

Для контейнера AdGuardHome смонтируем с флешки две папки work и conf

1
2
/container/mounts/add name=adguard-conf src=usb1-part1/adguard/conf dst=/opt/adguardhome/conf
/container/mounts/add name=adguard-work src=usb1-part1/adguard/work dst=/opt/adguardhome/work

Запускаем сам контейнер AdGuardHome

1
/container/add remote-image=adguard/adguardhome:latest interface=veth1 root-dir=usb1-part1/adguard/root mounts=adguard-conf,adguard-work

Ждем когда контейнер загрузится и получит статус stopped, после этого запускаем его кнопкой Start или командой

1
/container/start 0

Осталось перебросить порт с роутера на вирутальный порт нашего контейнера

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

Теперь зайдя по адресу 192.168.88.1:3000 мы увидим настройку AdGuardHome

Советую порт, на которм будет доступна панель управления AdGuardHome оставить 3000, чтобы не переписывать предыдущее правило

И укажем роутеру использовать AdGuardHome в качестве DNS-сервера

1
/ip dns set servers=172.17.0.2

Плюсы

  • С помощью контейнеров можем бесконечно (в пределах аппаратных ресурсов) расширять функционал роутера
  • Можем вырезать рекламу с помощью черных списков AdGuardHome

Минусы

  • В AdGuardHome мы увидим только одного клиента, собственно наш роутер с адресом 172.17.0.1, не получится настраивать доступ к сайтам для отдельных клиентов сети
  • При перезагрузке не факт, что заработает..

    У меня при отключении электричества, контейнеры отказались запускаться. Первый раз получилось пересоздать их вручную, второй раз - не получилось ничего. Учитывая пункт 1, решать пункт 2 я не стал.

Хорошая попытка Mikrotik - но нет

Технология докер контейнеров на RouterOS для меня лично отправляется на полку. Может когда-нибудь попробую еще раз. В OPNsense к примеру, функционал AdGuardHome добавляется как плагин. Все, оно сразу начинает работать, никаких cold reboot или ресетов, никаких бриджей и виртуальных интерфейсов, реестров и точек монтирования, и AdGuardHome видит всех внутренних клиентов сети.

Публикация защищена лицензией CC BY 4.0 .