Docker docker0 и адреса передатчика контейнера не установлены

Я "докетирую" приложение, которое UDP транслирует сердцебиение на известном порту. Это с докер-двигателем-1.7.0 на различных хостах (Fedora, Centos7, SLES 12).

Я заметил, что мост "docker0" на хосте docker и "eth0" внутри контейнера имеет широковещательный адрес 0.0.0.0.

Предполагая права администратора на хосте, я могу вручную установить широковещательный адрес на docker0. Аналогично в контейнере (если контейнер работает с привилегиями или с NET_ADMIN, NET_BROADCAST), но мне любопытно, почему широковещательный адрес не задан по умолчанию. Есть ли вариант конфигурации, который мне не хватает для Docker, чтобы сделать это автоматически?

Ведущий:

# ifconfig docker0 broadcast 172.17.255.255 up
# tcpdump -i docker0 -p 5000

Контейнер:

# ifconfig eth0 broadcast 172.17.255.255 up
# echo "Hello world" | socat - UDP-DATAGRAM:172.17.255.255:5000,broadcast

Передача от хоста к контейнеру также работает после установки широковещательных адресов.

Ответ 1

если вы передаете NET_ADMIN в контейнер Docker, я бы вообще не использовал сеть docker0 для вашего приложения.

Если я правильно понял, что вы пытаетесь сделать, то широковещательная передача UDP на известном порту используется контейнерами Docker, принадлежащими разным хостам, чтобы находить друг друга, а не разными контейнерами докеров в одном хосте.

Тогда я бы рекомендовал использовать --net=host:

docker run --net=host --cap-add NET_ADMIN ....

Подобно этому, если вы получите оболочку в контейнер докеров, вы увидите, что сетевая среда точно такая же, как у хоста, на котором запущены контейнеры. Если ваше приложение ранее выполнялось на этом сервере с использованием широковещательной рассылки UDP, оно будет работать точно так же в контейнере докеров.