我正在“对接”一个在已知端口上执行UDP广播心跳的应用程序。这是在各种主机(Fedora、Centos7、SLES12)上使用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设置广播地址后,从主机到容器的广播也会起作用。
发布于 2018-02-05 21:59:50
如果您将NET_ADMIN传递给Docker容器,那么我根本不会为您的应用程序使用docker0网络。
如果我正确理解了您正在尝试做的事情,那么已知端口上的UDP广播心跳是由属于不同主机的Docker容器来查找彼此的,而不是由同一主机中的不同docker容器使用的。
然后,我建议使用--net=host
docker run --net=host --cap-add NET_ADMIN ....
如下所示,如果您将一个shell放入docker容器中,您将看到网络环境与运行容器的主机完全相同。如果您的应用程序早些时候使用UDP广播在该服务器上运行,那么它在docker容器中的工作方式将完全相同。
https://stackoverflow.com/questions/31434691
复制相似问题