绑定到单个 docker 容器中的多个 IP 地址

Bind to multiple ip addresses in a single docker container

所以我在 Azure 的虚拟机上有 docker 运行,我有 5 个不同的 public ipv4 地址分配给这个实例,主机级别的私有 ips 是 172.16 .0.4 - 172.16.0.8 在 eth0.

在我的 node.js 应用程序中,我想发出一个 http 请求,但要在这 5 个 ips 之间进行负载平衡,所以当我发出请求时,我会为每个请求选择不同的 172.x ips绑定到,但我得到:错误:绑定 EADDRNOTAVAIL 172.16.0.4 等

我需要做些什么来允许 docker 容器实例访问这些 ips 吗?

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

容器内的进程 运行 无法使用主机接口和地址,除非您使用 --net=host option to docker run

一个容器通常运行在它自己的网络名称space中有它自己的地址space。如果您 运行 ip address show 在容器中,您将看到一组与您在主机

上 运行ning ip address show 所做的不同的接口

要通过特定 IP 路由来自容器的出站请求,除了 --net=host

之外,您可能超出了 Docker 可以为您设置的范围
  • docker run --net host 可以工作,但允许容器访问主机网络,这具有安全隐患。

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

  • 可以 "bridge" 从容器直接连接到网络以及 Dockers macvlan 驱动程序pipework。这在云提供商上更为复杂,因为大多数提供商会过滤网络上的 mac 地址,因此您需要重新配置容器中接口的 MAC 地址。