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

时间:2018-03-18 22:57:43

标签: docker networking ipv4

所以我在Azure中的vm上运行了docker,我有5个不同的公共ipv4地址分配给这个实例,主机级别的私有ips为172.16.0.4 - 在eth0上为172.16.0.8。

在我的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

1 个答案:

答案 0 :(得分:1)

除非您使用--net=host选项docker run

,否则主机接口和地址不可用于容器内运行的进程

容器通常在其自己的网络命名空间中运行,并具有自己的地址空间。如果您在容器中运行ip address show,您将看到与您在主机上运行ip address show的内容不同的接口集

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

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

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

  • 可以&#34;桥接&#34;从容器直接连接到网络以及Dockers macvlan driverpipework。这在云提供商上更为复杂,因为大多数提供商都会过滤网络上的mac地址,因此您需要重新配置容器中接口的MAC地址。