Первый опыт работы с контейнерами в Mikrotik.

Выкладываем здесь готовые конфигурации под определенные типовые задачи
Ответить
Аватара пользователя
podarok66
Модератор
Сообщения: 4402
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

Наш пользователь Illinory поделился своим первым опытом работы с контейнерами на RouterOs 7.* . Так как он сам не очень любит общаться (интроверт, что тут сделаешь), то написанную инструкцию он отдал мне со словами - "Ты же выложишь мануал в сеть?" А куда я денусь, собственно? :-) Если будут вопросы, он пусть не сразу, но ответит. Если будут замечания и правки, я поправлю после консультации с ним.
#################################################################################################
Микротик на ядрах ARM (32 и 64-битные версии) и x86 поддерживает контейнеризацию. Сразу оговоримся, что это не Docker в его исконном понимании. Контейнеры изменяемы изнутри. Но парадигма запуска одного процесса и смерти контейнера после его исполнения вполне жива. Мне такая парадигма в домашнем использовании только мешает, но с ней можно бороться костылями.
Для EN7562CT (hEX refresh, он же E50UG) возможные версии контейнеров урезаны до arm32v5 (список готовых контейнеров маловат https://hub.docker.com/u/arm32v5). Ситуацию спасает контейнер с Debian(https://hub.docker.com/r/arm32v5/debian). Armel дистрибудив хоть и не выпускается в виде установщика, но сборка и компиляция ПО поддеживается. Это именно мой частный случай, все действия проводятся на данном агрегате. Собирать что-то через Docker(Podman) под arm32v5 желания нет.
Помимо микротика на ROS7.4+ и процессора ARM (ну, психов с CHR и контейнерами я не рассматриваю), потребуется внешний диск, например, USB-флеш, а также физический доступ к устройству для включения поддержки контейнеров. Использование внутренней памяти может привести смерти внцтренней NAND-флеш устройства, от ревизии к ревизии с разным временем жизни. Крайне не рекомендую крутить на внутренней памяти.
Также рекомендуется полное отсуствие здравого смысла и легкие нотки безумия. Сторонние эксплоиты могут похоронить вашу железку без возможности исправления через NetInstall, как утверждает производитель.
1. Установите пакет
################################################################################################
# канал обновлений

Код: Выделить всё

/system package update set channel=stable
# выгрузим список пакетов

Код: Выделить всё

/system package update check-for-updates
# включим пакет и добавим в список на загрузку

Код: Выделить всё

/system/package enable container
# включем скачиваем обновления

Код: Выделить всё

/system package update download
# перезагружаем

Код: Выделить всё

/system reboot
2. Включим поддержку контейнеров на устройстве.
Для это используется остнастка device-mode, она серьёзно менялась, команды для 7.15+
################################################################################################
# промотр текущих доступных фич

Код: Выделить всё

/system/device-mode/print
# тут же можно выключить бесполезные фичи вроде bandwidth-test
# включение режима

Код: Выделить всё

/system/device-mode/update container=yes
После устройство попросит выключить питание или перезагрузить устройство с кнопки и выведем счетчик в 5 минут. Если нет, то изменения откатятся. Потребуется физический доступ!
3. Настройка сети.
Используется veth - виртуальный ethernet. Бридж для всех veth (их может быть более одного). Каждый veth может использоваться для нескольких контейнеров. Все по офф ману.
################################################################################################

Код: Выделить всё

/interface veth add address=172.17.0.2/24 gateway=172.17.0.1 gateway6="" name=veth1
/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, выход в Интернет и прочее на вашей совести
4. Рекомендую на USB создать директорию для контейнеров
Дальше команды на форматирование флешки в ext4 - все данные удалятся!!!
################################################################################################

Код: Выделить всё

/disk print
/disk format-drive usb1 file-system=ext4
/file add name=usb1/containers type=directory
/file add name=usb1/containers/debian type=directory
5. Настройки среды
Используем докер хаб, как основной поставщик
################################################################################################

Код: Выделить всё

/container config set registry-url=https://registry-1.docker.io tmpdir=usb1/containers
6. Создаем контейнер с Debian
Тут немного костыльной магии. Если не добавить cmd="sleep infinity", процесс запустится и завершится успешно. Эта строчка позволяет крутить контейнер вечно.
Строчка logging=yes помимо логов ошибок перенаправляет еще внутренний вывод в log. То есть cmd="ls" выведет список файлов и директорий в корне в лог и завершит контейнер.
################################################################################################

Код: Выделить всё

/container/add remote-image=arm32v5/debian:latest cmd="sleep infinity" hostname=debian-mikrotik interface=veth1 logging=yes root-dir=usb1/containers/debian start-on-boot=yes
# контейнер будет некоторое время в состоянии "download" и "extracting", отслеживайте, пока он не перейдет в состояние "stopped"
# если контейнер недоступен для скачивания, то статус будет с ошибкой

Код: Выделить всё

/container/print
7. Запуск
################################################################################################
# нумерация по созданию

Код: Выделить всё

/container/start number=0
# состояние перейдет в "running"

Код: Выделить всё

/container/print
# переходим внутрь

Код: Выделить всё

/container/shell number=0

Код: Выделить всё

################################################################################################
root@debian-mikrotik:/# uname -a
Linux debian-mikrotik 5.6.3 #2 SMP Fri Feb 7 11:01:06 UTC 2025 armv7l GNU/Linux
################################################################################################
Как видим, внутри микротика ядро 5.6.3
8. Работа
Тут все просто: костыли и палки.
У shell через микротик есть ряд проблем, это не полноценный эмулятор терминала, некоторые escape-последовательности ломают отображение. Например, в nano отредактировать файл - подвиг.
Например, требуется ssh сервер.
################################################################################################

Код: Выделить всё

apt update   # репы bookworm-updates и bookworm-security подгнили, но это не важно, можно пропустить или отредактировать /etc/apt/sources.list.d/debian.sources
apt install openssh-server
apt install sudo
# ставлю по одной, чтобы на каждом этапе видеть возможные проблемы
# создадим пользователя в группе sudo, чтобы иметь возможность выполнять команды от root

Код: Выделить всё

useradd -m -G sudo -s /bin/bash myusers
# и задаем ему пароль

Код: Выделить всё

passwd myusers
# запуск и можно логиниться в удобной оболочке

Код: Выделить всё

/etc/init.d/ssh start
Теперь создадим псевдопроцесс для автозапуска служб
################################################################################################

Код: Выделить всё

sudo su  # разовая акция
touch /root/startup.sh
chmod +x /root/startup.sh
echo \#\!/bin/bash > /root/startup.sh
echo \#run_initd_daemons >> /root/startup.sh
echo '/etc/init.d/ssh start' >> /root/startup.sh
echo \#magic >> /root/startup.sh
echo 'sleep infinity' >> /root/startup.sh
exit
На микротик изменим cmd для запуска на наш костыль
################################################################################################

Код: Выделить всё

/container/set cmd="/root/startup.sh" numbers=0
И проверим
################################################################################################

Код: Выделить всё

/container/stop number=0
# stopping занимает секунд 10

Код: Выделить всё

/container/start number=0
################################################################################################
Контейнер должен быть доступен извне по ssh.
В этот костыльный скрипт можно вкорячить запуск нужны демонов.
Вполне работоспособное решение для дома. Можете сообщить в комментариях и ЛС, какой я рак.

Автор Illinory ©


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
Ответить