7

我正在编写一个 python 应用程序,它不断地将 UDP 消息发送到具有其他主机和固定 IP 的预定义网络。我编写了 python 应用程序并将其 dockerized。该应用程序在 docker 中运行良好,没有问题。

不幸的是,我无法将 UDP 消息从我的 docker 发送到主机,因此它们将被发送到网络中的其他主机。接收消息也是如此。现在我不知道如何设置我的 docker,所以它正在从网络中具有固定 IP 地址的主机接收 UDP 消息。

我尝试设置我的 docker 网络,--net host并通过 localhost 将我的 docker 容器中的所有 UDP 消息发送到我的主机。这也很好。我错过了可以向“外部世界”发送消息的链接。我试着画出我的问题。

Docker主机通信问题

我的问题:如何为我的 docker/host 设置网络通信,以便它可以通过 UDP 从网络中的其他主机接收消息?谢谢

4

2 回答 2

3

所以我做了很多实验,我发现,我只需要以网络配置作为主机运行 docker 容器。我容器中的 UDP 套接字绑定到我的主机的 IP 地址,因此只需要链接到主机的网络。每个在同一个问题上苦苦挣扎的人,快跑

docker run --network=host <YOURCONTAINER>
于 2019-03-03T12:41:45.747 回答
1

搭建自己的桥梁

1.配置新网桥。

$ 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 以使用新网桥,该文件位于/etc/docker/Linux 或C:\ProgramData\docker\config\Windows Server 上。在 Docker for Mac 或 Docker for Windows 上,单击 Docker 图标,选择Preferences,然后转到Daemon

如果 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.删除现在未使用的docker0桥。

$ sudo ip link set dev docker0 down

$ sudo ip link del name br0

$ sudo iptables -t nat -F POSTROUTING

5.创建一个新容器,并验证它是否在新的 IP 地址范围内。

参考

于 2019-01-25T11:36:33.377 回答