Docker 容器的多个静态 IP

Posted

技术标签:

【中文标题】Docker 容器的多个静态 IP【英文标题】:Multiple static IPs for Docker containers 【发布时间】:2017-11-25 23:27:11 【问题描述】:

我有一个 Docker 主机,它应该允许每个容器有多个静态 IP 地址。容器内的应用程序应该能够选择从哪个地址向远程主机发送流量(例如ping -I <source-address> example.com)。

想象一下这样的设置:IP 地址10.0.0.10 - 10.0.0.19 分配给ContainerA,10.0.0.20 - 10.0.0.29 分配给ContainerB,依此类推。任何到 ContainerA 的地址范围的流量都会转发到 ContainerA,而传出流量则来自 ContainerA 可以选择的该范围内的地址。这同样适用于 ContainerB。




默认的--net=bridgemode 似乎不支持这一点。我能得到的最接近的是 传入 到任何 ContainerA 地址的流量都正确转发到容器,但 传出 流量总是来自同一个地址。

当使用--net=host 时,第一个容器将附加到所有可用的 IP 地址,因此第二个容器将无法打开其 IP 范围内的套接字。

docker run 命令的--ip 选项似乎接近我所需要的,如this blog post 中所述。不幸的是,它似乎不支持每个容器有多个静态 IP。

如果更方便,可以使用 CIDR 子网而不是 IP 范围。

我需要如何配置 Docker 来实现这一点?

【问题讨论】:

你成功了吗?我的要求是类似的。很想知道你的案子的结果。 【参考方案1】:

我认为你可以通过customizing docker0 bridge 来实现,甚至可以创建你的own network bridge

【讨论】:

【参考方案2】:

每个 docker 容器只有一个 IP。我们也可以通过将桥接网络设置为自定义 IP,

docker network create net1 --driver=bridge --subnet="192.168.0.1/27"

如果您不提及驱动程序,则默认为桥接网络。

所以在这里使用 --subnet,您可以为网络提供自定义 IP 地址,并且使用该网络,您还可以为该网络内的容器提供自定义 IP 地址。

然后运行一个容器,

docker run -it --network=net1 --ip="192.168.0.3" --name=MyContainer image_name

现在,通过这种方式,您可以制作 32-27=5 即 (2^5)-2 个 docker 容器。

【讨论】:

【参考方案3】:

嗯,我想知道我是否真的理解了你问题的正确含义。 你说: “而传出流量来自 ContainerA 可以选择的该范围内的地址。” 这意味着您的连接应该使用 UDP。 或者如果入站和出站流量没有相同的 IP,TCP 连接会中断?对吧?

我认为您可以创建一个网络并将该网络上的 IP 地址分配给您的容器。 您可以在命令行中执行此操作,但我宁愿使用 docker-compose 文件。 可能是这样的:

version: '2.1'

services:

  containerA:
    image: xxx
    networks:
      local_net:
        ipv4_address: 10.0.0.10
        ipv4_address: 10.0.0.11
        ...

  containerB:
    image: xxx
    networks:
      local_net:
        ipv4_address: 10.0.0.20
        ipv4_address: 10.0.0.21
        ...
      
networks:
  local_net:
    ipam:
      driver: default
      config:
        - subnet: 10.0.0.0/24
          gateway: 172.16.200.1

如果你想自动创建文件,我认为你可以编写脚本。

【讨论】:

以上是关于Docker 容器的多个静态 IP的主要内容,如果未能解决你的问题,请参考以下文章

Docker 容器的多个静态 IP

docker实现跨主机通信(使用静态路由方式)

Docker部署ewomail邮件服务器

Docker 镜像、容器命令

为 Docker 容器分配静态 IP

Docker