Вопрос или проблема
Я пытаюсь запустить 2 контейнера Docker на своем Raspberry Pi, у каждого из которых есть свой статический IP-адрес.
На данный момент у меня это работает с использованием сетевого драйвера macvlan. Но есть одно странное поведение:
Каждый раз, когда я запускаю контейнер, мой роутер (Fritz!Box 7590) сообщает о новом сетевом устройстве и назначает ему новый IP-адрес. Контейнер доступен по своему статическому IP, а автоматически назначенный IP просто не используется и заполняет аренды DHCP. При каждом (повторном) запуске новый неиспользуемый IP.
Как я могу остановить эти ненужные запросы DHCP?
Я только начинаю разбираться с Docker, любая помощь будет полезна!
–
Моя конкретная конфигурация сети и контейнера (домашняя сеть моего роутера находится на 192.168.2.x):
docker network create -d macvlan --subnet=192.168.2.0/24 --gateway=192.168.2.1 -o parent=eth0 home_network
docker run -d --name "diyHue" -v '/mnt/hue-emulator/export/':'/opt/hue-emulator/export/':'rw' -e MAC='02:42:AC:F8:1B:B8' -e IP='192.168.2.241' -p 80:80/tcp -p 443:443/tcp -p 1900:1900/udp -p 2100:2100/udp -p 1982:1982/udp --ip 192.168.2.241 --mac-address 02:42:AC:F8:1B:B8 --network home_network --restart always diyhue/core:latest
docker run --init -d --name="home-assistant" -v /home/pi/homeassistant:/config -v /etc/localtime:/etc/localtime:ro --network home_network --ip 192.168.2.242 --mac-address 02:42:AC:11:CE:10 --restart always homeassistant/raspberrypi3-homeassistant
–
Мои другие компьютеры со статическими IP не имеют этой проблемы. Они просто запускаются, и мой роутер не назначает им новый IP. У хоста Docker тоже нет проблем, только у контейнеров.
Я только что перезапустил один контейнер (только контейнер, не хост) несколько раз и заметил следующее:
-
каждое новое устройство имеет имя хоста моего хоста Docker (“pi-smarthome”)
-
каждое новое устройство имеет разный MAC-адрес
Похоже, что Docker назначает контейнеру случайный MAC-адрес при запуске, подключает их к сети, а затем изменяет MAC-адрес и IP на конфигурацию контейнера.
Вот часть списка устройств DHCP моего роутера:
имя хоста – IP-адрес – MAC-адрес – дополнительная информация DHCP
"pi-smarthome" - 192.168.2.111 - 1A:26:4A:2E:CD:9C - dhcpcd-6.11.5:Linux-4.14.98-v7+:armv7l:BCM2835
"pi-smarthome" - 192.168.2.112 - 2A:16:03:84:CB:C1 - dhcpcd-6.11.5:Linux-4.14.98-v7+:armv7l:BCM2835
"pi-smarthome" - 192.168.2.113 - AE:25:25:0C:58:57 - dhcpcd-6.11.5:Linux-4.14.98-v7+:armv7l:BCM2835
"pi-smarthome" - 192.168.2.114 - 72:D6:5B:7C:3E:0D - dhcpcd-6.11.5:Linux-4.14.98-v7+:armv7l:BCM2835
"pi-smarthome" - 192.168.2.240 - B8:27:EB:B5:3F:67 - нет дополнительной информации DHCP - (реальный хост Docker)
"PC-192-168-2-241" - 192.168.2.241 - 02:42:AC:F8:1BB8 - нет дополнительной информации DHCP - (контейнер diyHue)
"Home" - 192.168.2.242 - 02:42:AC:11:CE:10 - нет дополнительной информации DHCP - (контейнер home-assistant)
Я установил –net=home_network, и тогда это заработало для меня (вместо –network используйте –net).
Первое:
docker network create -d macvlan –subnet=192.168.2.0/24 –gateway=192.168.2.254 –ip-range=192.168.2.100/28 -o parent=eth0 vlan
Второе:
docker run -d –name=iot -p 8080:8080 -p 4443:4443 –net=vlan -v /home/ubuntu/data/iot:/home/node/.mozilla-iot -e TZ=’Europe/Amsterdam’ mozillaiot/gateway:arm
Затем я настроил роутер так, чтобы он никогда не раздавал IP-адреса выше 192.168.2.100 (это делает vlan), чтобы не возникало конфликтов.
Ответ или решение
Вопрос: Статические IP-адреса для контейнеров Docker с использованием macvlan и запросы DHCP
Ваша задача состоит в том, чтобы запустить два контейнера Docker на Raspberry Pi с фиксированными IP-адресами, используя драйвер сети macvlan. Тем не менее, вы сталкиваетесь с проблемой, когда при каждом запуске контейнера ваш маршрутизатор (Fritz!Box 7590) регистрирует новое сетевое устройство и присваивает ему новый IP-адрес через DHCP, даже если контейнеры настроены на статические IP-адреса.
Причины возникновения проблемы
Проблема заключается в том, как Docker управляет сетевыми интерфейсами при использовании macvlan. Когда вы создаете контейнер с помощью команды docker run
, Docker по умолчанию создает виртуальный сетевой интерфейс для каждого контейнера, что приводит к следующим эффектам:
-
Случайные MAC-адреса: Как вы отметили, каждый раз, когда вы запускаете контейнер, ему может быть присвоен случайный MAC-адрес. Это новый адрес, который не связан с нужным вам статическим IP, что приводит к запросу DHCP для получения IP-адреса.
-
Сообщение маршрутизатору: Поскольку DHCP-клиент (в данном случае контейнер) фиксируется маршрутизатором при каждом запуске, он получает новый IP-адрес, даже если вы указали статический IP-адрес для контейнера.
Решения проблемы
Чтобы предотвратить ненужные запросы DHCP и упростить управление сетью, рассмотрите следующие решения:
-
Правильная установка MAC-адреса контейнера:
Убедитесь, что вы задаете MAC-адрес перед запуском контейнера, и что он будет уникальным в пределах вашей сети. Вы указали MAC-адреса в вашей командеdocker run
, и это хорошо. Однако в идеале, избежать случайного присвоения MAC-адресов во время загрузки, добавив явную настройку. -
Использование
--net=home_network
:
Вы также отметили, что изменение--network
на--net
решает проблему. Это связано с тем, что флаг--net
и--network
могут вести себя по-разному в зависимости от версии Docker. Убедитесь, что вы используете подходящий флаг, который соответствует вашей версии Docker. -
Настройка DHCP на маршрутизаторе:
Возможно, стоит наладить параметры DHCP на вашем маршрутизаторе так, чтобы он не раздавал IP-адреса в диапазоне, который используется вашими контейнерами. Как вы уже сделали в одном из своих экспериментов, установите DHCP на диапазон, который не будет конфликтовать с вашими статическими IP-адресами. -
Определение IP-диапазона для macvlan:
При создании сети macvlan, можно ограничить IP-диапазон. Например, если вы уже настроили флаг--ip-range=192.168.2.100/28
, это минимизирует вероятность конфликта IP. -
Система контроля уникальности MAC:
Убедитесь, что ваш маршрутизатор настроен так, чтобы игнорироватьоформленные DHCP-пакеты для MAC-адресов, которые уже имеют статические назначения. Это может требовать некоторой настройки.
Заключение
Ваши текущие настройки Docker, такие как использование драйвера macvlan и задействование стандартов сетевых конфигураций, являются правильным путем к управлению контейнерами с фиксированными IP-адресами. Однако ключевым аспектом является правильное управление MAC-адресами и соответствующая настройка DHCP на маршрутизаторе. Следуя рекомендованным шагам, можно значительно уменьшить, а в идеале ликвидировать, ненужные запросы DHCP от ваших контейнеров Docker.
Если у вас есть дополнительные вопросы или требуется дальнейшая помощь, пожалуйста, не стесняйтесь обращаться.