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=bridge
mode 似乎不支持这一点。我能得到的最接近的是 传入 到任何 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的主要内容,如果未能解决你的问题,请参考以下文章