Docker容器:与其他主机的UDP通信
Docker Container: UDP Communication with other hosts
我正在编写一个 python 应用程序,它不断地将 UDP 消息发送到具有其他主机和固定 IP 的预定义网络。我编写了 python 应用程序并 docker 对其进行了处理。该应用程序在 docker 中运行良好,没有问题。
不幸的是,我无法将 UDP 消息从我的 docker 发送到主机,因此它们将被发送到网络中的其他主机。接收消息也是如此。现在我不知道如何设置我的 docker 所以它正在从网络中具有固定 IP 地址的主机接收 UDP 消息。
我尝试用 --net host
设置我的 docker 网络,我将所有 UDP 消息从我的 docker 容器通过本地主机发送到我的主机。这也很好用。我缺少 link,我可以在其中向 "outside world" 发送消息 no。我试着用图片来描述我的问题。
我的问题:如何为我的 docker/host 设置网络通信,以便它可以通过 UDP 从网络中的其他主机接收消息?
谢谢
建造你自己的桥梁
1.Configure新桥
$ sudo ip link set dev br0 up
$ sudo ip addr add 192.168.5.1/24 dev bridge0
$ sudo ip link set dev bridge0 up
确认新网桥的设置。
$ ip addr show bridge0
4: bridge0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state UP group default
link/ether 66:38:d0:0d:76:18 brd ff:ff:ff:ff:ff:ff
inet 192.168.5.1/24 scope global bridge0
valid_lft forever preferred_lft forever <br/>
2。通过在 daemon.json 文件中设置选项来配置 Docker 使用新桥,该文件位于 Linux 上的 /etc/docker/
或 [=48= 上的 C:\ProgramData\docker\config\
] 服务器。在 Mac 的 Docker 或 Windows 的 Docker 上,单击 Docker 图标,选择 首选项 ,然后转到守护进程.
如果 daemon.json 文件不存在,请创建它。假设文件中没有其他设置,它应该有以下内容:
{
"bridge": "bridge0"
}
重新启动 Docker 以使更改生效。
3. 确认新的传出 NAT 伪装已设置。
$ sudo iptables -t nat -L -n
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 192.168.5.0/24 0.0.0.0/0
4.Remove 现在未使用的 docker0
桥。
$ sudo ip link set dev docker0 down
$ sudo ip link del name br0
$ sudo iptables -t nat -F POSTROUTING
5.Create一个新的容器,并验证它是否在新的IP地址范围内。
(ref.)
所以我做了很多实验,然后我发现,我只需要 运行 docker 具有网络配置的容器作为主机。我容器中的 UDP 套接字绑定到我的主机的 IP 地址,因此只需要链接到主机的网络。每个人都在为同样的问题而苦苦挣扎,只是 运行
docker run --network=host <YOURCONTAINER>
我正在编写一个 python 应用程序,它不断地将 UDP 消息发送到具有其他主机和固定 IP 的预定义网络。我编写了 python 应用程序并 docker 对其进行了处理。该应用程序在 docker 中运行良好,没有问题。
不幸的是,我无法将 UDP 消息从我的 docker 发送到主机,因此它们将被发送到网络中的其他主机。接收消息也是如此。现在我不知道如何设置我的 docker 所以它正在从网络中具有固定 IP 地址的主机接收 UDP 消息。
我尝试用 --net host
设置我的 docker 网络,我将所有 UDP 消息从我的 docker 容器通过本地主机发送到我的主机。这也很好用。我缺少 link,我可以在其中向 "outside world" 发送消息 no。我试着用图片来描述我的问题。
我的问题:如何为我的 docker/host 设置网络通信,以便它可以通过 UDP 从网络中的其他主机接收消息? 谢谢
建造你自己的桥梁
1.Configure新桥
$ sudo ip link set dev br0 up
$ sudo ip addr add 192.168.5.1/24 dev bridge0
$ sudo ip link set dev bridge0 up
确认新网桥的设置。
$ ip addr show bridge0
4: bridge0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state UP group default
link/ether 66:38:d0:0d:76:18 brd ff:ff:ff:ff:ff:ff
inet 192.168.5.1/24 scope global bridge0
valid_lft forever preferred_lft forever <br/>
2。通过在 daemon.json 文件中设置选项来配置 Docker 使用新桥,该文件位于 Linux 上的 /etc/docker/
或 [=48= 上的 C:\ProgramData\docker\config\
] 服务器。在 Mac 的 Docker 或 Windows 的 Docker 上,单击 Docker 图标,选择 首选项 ,然后转到守护进程.
如果 daemon.json 文件不存在,请创建它。假设文件中没有其他设置,它应该有以下内容:
{
"bridge": "bridge0"
}
重新启动 Docker 以使更改生效。
3. 确认新的传出 NAT 伪装已设置。
$ sudo iptables -t nat -L -n
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 192.168.5.0/24 0.0.0.0/0
4.Remove 现在未使用的 docker0
桥。
$ sudo ip link set dev docker0 down
$ sudo ip link del name br0
$ sudo iptables -t nat -F POSTROUTING
5.Create一个新的容器,并验证它是否在新的IP地址范围内。
(ref.)
所以我做了很多实验,然后我发现,我只需要 运行 docker 具有网络配置的容器作为主机。我容器中的 UDP 套接字绑定到我的主机的 IP 地址,因此只需要链接到主机的网络。每个人都在为同样的问题而苦苦挣扎,只是 运行
docker run --network=host <YOURCONTAINER>