我正在“dockerizing”一个在已知端口上进行 UDP 广播心跳的应用程序。这适用于各种主机(Fedora、Centos7、SLES 12)上的 docker-engine-1.7.0。
我注意到 docker 主机上的 'docker0' 网桥和容器内的 '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
一旦设置了广播地址,从主机到容器的广播也可以工作。
最佳答案
如果您将 NET_ADMIN
传递给 Docker 容器,我不会为您的应用程序使用 docker0
网络。
如果我正确理解您要执行的操作,属于不同主机的 Docker 容器使用已知端口上的 UDP 广播心跳来相互查找,而不是由同一主机中的不同 Docker 容器使用。
然后我建议使用 --net=host
:
docker run --net=host --cap-add NET_ADMIN ....
像这样,如果你将 shell 放入 docker 容器中,你会看到网络环境与运行容器的主机完全相同。如果您的应用程序之前使用 UDP 广播在该服务器上运行,它将在 docker 容器中以完全相同的方式运行。
关于udp - docker docker0 和容器广播地址未设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31434691/