docker macvlan статический IP – все еще запрос DHCP

Вопрос или проблема

Я пытаюсь запустить 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 по умолчанию создает виртуальный сетевой интерфейс для каждого контейнера, что приводит к следующим эффектам:

  1. Случайные MAC-адреса: Как вы отметили, каждый раз, когда вы запускаете контейнер, ему может быть присвоен случайный MAC-адрес. Это новый адрес, который не связан с нужным вам статическим IP, что приводит к запросу DHCP для получения IP-адреса.

  2. Сообщение маршрутизатору: Поскольку DHCP-клиент (в данном случае контейнер) фиксируется маршрутизатором при каждом запуске, он получает новый IP-адрес, даже если вы указали статический IP-адрес для контейнера.

Решения проблемы

Чтобы предотвратить ненужные запросы DHCP и упростить управление сетью, рассмотрите следующие решения:

  1. Правильная установка MAC-адреса контейнера:
    Убедитесь, что вы задаете MAC-адрес перед запуском контейнера, и что он будет уникальным в пределах вашей сети. Вы указали MAC-адреса в вашей команде docker run, и это хорошо. Однако в идеале, избежать случайного присвоения MAC-адресов во время загрузки, добавив явную настройку.

  2. Использование --net=home_network:
    Вы также отметили, что изменение --network на --net решает проблему. Это связано с тем, что флаг --net и --network могут вести себя по-разному в зависимости от версии Docker. Убедитесь, что вы используете подходящий флаг, который соответствует вашей версии Docker.

  3. Настройка DHCP на маршрутизаторе:
    Возможно, стоит наладить параметры DHCP на вашем маршрутизаторе так, чтобы он не раздавал IP-адреса в диапазоне, который используется вашими контейнерами. Как вы уже сделали в одном из своих экспериментов, установите DHCP на диапазон, который не будет конфликтовать с вашими статическими IP-адресами.

  4. Определение IP-диапазона для macvlan:
    При создании сети macvlan, можно ограничить IP-диапазон. Например, если вы уже настроили флаг --ip-range=192.168.2.100/28, это минимизирует вероятность конфликта IP.

  5. Система контроля уникальности MAC:
    Убедитесь, что ваш маршрутизатор настроен так, чтобы игнорироватьоформленные DHCP-пакеты для MAC-адресов, которые уже имеют статические назначения. Это может требовать некоторой настройки.

Заключение

Ваши текущие настройки Docker, такие как использование драйвера macvlan и задействование стандартов сетевых конфигураций, являются правильным путем к управлению контейнерами с фиксированными IP-адресами. Однако ключевым аспектом является правильное управление MAC-адресами и соответствующая настройка DHCP на маршрутизаторе. Следуя рекомендованным шагам, можно значительно уменьшить, а в идеале ликвидировать, ненужные запросы DHCP от ваших контейнеров Docker.

Если у вас есть дополнительные вопросы или требуется дальнейшая помощь, пожалуйста, не стесняйтесь обращаться.

Оцените материал
Добавить комментарий

Капча загружается...