【问题标题】:Docker Container: UDP Communication with other hostsDocker Container:与其他主机的UDP通信
【发布时间】:2019-01-25 06:59:30
【问题描述】:

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

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

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

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

【问题讨论】:

  • 所以您只想为1.0.0.X 网络发送消息对吗?
  • 是的,没错。它是一个具有固定 IP 的预定义网络,docker 容器只会接收来自该网络的消息并将消息发送到该网络。
  • 好的,那么您可以只为 1.0.0.X 网络创建桥接连接,而不是 --net host,这样它就可以在 docker 容器中访问

标签: python docker quadprog


【解决方案1】:

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

docker run --network=host <YOURCONTAINER>

【讨论】:

    【解决方案2】:

    建立自己的桥梁

    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 以使用新的网桥,该文件位于 Linux 上的 /etc/docker/ 或 Windows Server 上的 C:\ProgramData\docker\config\ 中。在 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地址范围内。

    (ref.)

    【讨论】:

    • 您好,谢谢您的回答。首先,代码sudo ip link set dev br0 up 不起作用,因为没有名为br0 的设备。我可以用ip link add name br0 type bridge 创建它,但我不明白br0docker0 之间的区别
    • 其实br0是桥接网络,docker0是主机到容器的NAT
    • 是的,我知道了。但是您是否自己尝试了该命令? sudo ip link set dev br0 up 不工作!
    • 详细信息可以参考参考链接。
    • 再次感谢。我看到了参考,它与您在此处显示的选项相同。但是该命令不起作用。我认为必须首先使用以下命令创建br0:` sudo ip link add name br0 type bridge `
    猜你喜欢
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    相关资源
    最近更新 更多