【问题标题】:Assigning multiple IP Addresses to Docker Container为 Docker 容器分配多个 IP 地址
【发布时间】:2023-02-03 22:21:52
【问题描述】:

我的机器上有多个私有 ipv4 地址(每个绑定到一个单独的公共 IP 地址)

10.0.0.4 10.0.0.5 10.0.0.6 10.0.0.7 10.0.0.8

当我运行我的应用程序时,它使用每个 IP 地址来执行一些请求,一切都按预期正常工作。但是,当我尝试在 docker 中运行它时,我的应用程序声称它无法绑定到 IP 地址。我相信这是因为 docker 网络是孤立的。

我想知道如何通过 docker-compose.yml 文件将这些 ipv4 地址“公开”给我的服务。

【问题讨论】:

    标签: docker docker-compose docker-networking


    【解决方案1】:

    你说得对,涉及到 Docker 的网络隔离:你的应用程序将看到一个不可预测的 IP 地址,而 Docker 提供了一个 NAT 层,将主机的网络地址转换为此。

    最常见的设置方法是将您的应用程序设置为绑定到 0.0.0.0,即“所有接口”。 Compose ports: 设置采用可选的 IP 地址部分,它也默认为 0.0.0.0。你可以有多个 ports: 指向同一个容器端口,只要主机 IP 和端口对不与其他绑定端口或非 Docker 服务冲突。

    作为一个假设的例子:

    version: '3.8'
    services:
      app:
        image: registry.example.com/app
        environment:
          # Tell the application to listen on all interfaces, port 8080
          BIND_ADDR: '0.0.0.0:8080'
        ports:
          # As the default HTTP service on the first IP address
          - '10.0.0.4:80:8080'
          # On its own port on the last IP address
          - '10.0.0.8:8080:8080'
          # And not on any of the other IP addresses at all
    

    另一种方法是使用network_mode: host 禁用 Docker 的网络堆栈。在这种模式下,您的应用程序将直接看到所有主机接口,如果它有特定的逻辑来选择性地绑定到它们,那将就像程序没有在容器中运行一样工作。但是,这也会禁用所有其他 Docker 网络功能:您无法隐藏或重新映射端口,并且您无法通过主机名与其​​他容器通信,只能通过其发布的端口。我通常不鼓励主机网络,但对于这种特定情况,这可能是一种合理的方法。

    【讨论】:

    • 嗯,似乎没有用,network_mode: host 可以用,但我真的很想拥有 docker 提供的网络隔离。此外,访问诸如 docker 名称解析之类的功能也是一项奖励。
    • 我刚刚结束使用 network_mode: host
    【解决方案2】:

    您可以将 docker 容器配置为使用多个 IP 地址,至少有两种方式:

    1. 在容器内手动添加额外的 IP 地址:

      container # ip address add 172.17.1.4/32 dev eth0
      container # ip address add 172.17.1.5/32 dev eth0
      ...
      

      注意:这些地址可能需要属于容器的子网,不确定。 docker network inspect bridge 为我打印默认的bridge 网络子网,172.17.0.0/16

      (来源:Multiple ip on same interface in Docker container

      或者

      1. 创建多个桥接网络,每个桥接网络具有不同的子网(IP 范围),然后将您的容器附加到这些多个网络。

        有关详细信息,请参阅

      然后你可以配置你的 docker 主机通过你不同的主机 IP 地址路由(数据包来自)这些不同的容器 IP 地址:

      host # iptables -t nat -I POSTROUTING -p all -s 172.17.1.4/32 -j SNAT --to-source 10.0.0.4
      host # iptables -t nat -I POSTROUTING -p all -s 172.17.1.5/32 -j SNAT --to-source 10.0.0.5
      ...
      

      (来源:https://serverfault.com/a/686107

      最终结果是,通过不同容器 IP 从您的容器传出的流量通过不同主机 IP 进行路由。您可以确认这一点,例如。和:

      container # curl -v --interface 172.17.1.4 <some destination that will show which host IP is used>
      

      关于 docker compose,我对它的了解还不足以回答你的那部分问题。

    【讨论】:

      猜你喜欢
      • 2013-09-15
      • 2020-10-18
      • 1970-01-01
      • 2018-11-13
      • 1970-01-01
      • 2021-11-23
      • 2016-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多