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, оно будет работать точно так же в контейнере докеров.