在单个Docker容器中绑定多个IP地址

3
我在Azure的虚拟机上运行着Docker,这个实例有5个不同的公共IPv4地址,而主机级别的私有IP是eth0上的172.16.0.4-172.16.0.8。
在我的Node.js应用程序中,我想要进行HTTP请求并在这5个IP地址之间进行负载均衡。但是当我尝试绑定不同的172.x IP地址进行请求时,出现了错误:Error: bind EADDRNOTAVAIL 172.16.0.4等。
我需要做些什么才能让Docker容器实例可以访问这些IP地址呢?
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0d:3a:73:c1:f2 brd ff:ff:ff:ff:ff:ff
inet 172.16.0.4/24 brd 172.16.0.255 scope global eth0
   valid_lft forever preferred_lft forever
inet 172.16.0.5/24 brd 172.16.0.255 scope global secondary eth0
   valid_lft forever preferred_lft forever
inet 172.16.0.6/24 brd 172.16.0.255 scope global secondary eth0
   valid_lft forever preferred_lft forever
inet 172.16.0.7/24 brd 172.16.0.255 scope global secondary eth0
   valid_lft forever preferred_lft forever
inet 172.16.0.8/24 brd 172.16.0.255 scope global secondary eth0
   valid_lft forever preferred_lft forever

你如何在Azure上进行公共IP映射?我习惯于使用AWS EIP到接口设置,但如果您可以将其映射到任意后端IP,则在Docker中设置更容易。 - Matt
1个回答

4

在容器内运行的进程无法访问主机接口和地址,除非您使用 --net=host 选项来运行 docker run

容器通常在其自己的网络命名空间中运行,拥有自己的地址空间。如果在容器中运行 ip address show 命令,则会看到与主机上运行 ip address show 命令时不同的接口集。

要通过特定 IP 从容器路由出站请求,您可能需要超出 Docker 可以为您设置的范围,除了 --net=host 选项。

  • docker run --net host 可以运行,但会给容器访问主机网络的权限,这存在安全隐患。

  • 使用 pipework 在容器内分配 5 个虚拟接口,并设置 NAT 或基于源地址/接口的路由规则来查看每个源地址/接口。

  • 也可以使用 Docker 的 macvlan 驱动程序pipework 直接将接口从容器桥接到网络。在云提供商上,这更为复杂,因为大多数提供商会过滤网络上的 MAC 地址,所以需要重新配置容器中接口的 MAC 地址。


在 Azure 上,可能有一种更简单的选项是将网络范围路由到 Docker 主机,这取决于路由和公共 IP 的工作方式。 - Matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接