我" m" dockerizing"在已知端口上执行UDP广播心跳的应用程序。这是在各种主机上使用docker-engine-1.7.0(Fedora,Centos7,SLES 12)。
我注意到' docker0'在docker主机上的桥梁和' eth0'容器内部的广播地址均为0.0.0.0。
假设主机有admin权限,我可以在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
设置广播地址后,从主机到容器的广播也可以正常工作。
答案 0 :(得分:0)
如果您将NET_ADMIN
传递给Docker容器,我根本不会将docker0
网络用于您的应用程序。
如果我理解你正在尝试做什么,已知端口上的UDP广播心跳被属于不同主机的Docker容器用于相互查找,而不是由同一主机中的不同docker容器。
然后我建议使用--net=host
:
docker run --net=host --cap-add NET_ADMIN ....
如果您将shell添加到docker容器中,您会看到网络环境与运行容器的主机环境完全相同。如果您的应用程序之前使用UDP广播在该服务器上运行,它将在docker容器中以完全相同的方式工作。