【问题标题】:Bind to multiple ip addresses in a single docker container绑定到单个 docker 容器中的多个 ip 地址
【发布时间】:2018-03-18 22:57:42
【问题描述】:

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

在我的 node.js 应用程序中,我想发出一个 http 请求,但在这 5 个 ips 之间进行负载平衡,所以当我发出请求时,我为每个要绑定的请求选择不同的 172.x ips,但我' m 获取:错误:绑定 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 中设置会更容易。

标签: docker networking ipv4


【解决方案1】:

主机接口和地址对容器内运行的进程不可用,除非您使用 --net=host 选项到 docker run

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

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

  • docker run --net host 可以工作,但允许容器访问主机网络,这具有安全隐患。

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

  • 也可以使用Dockers macvlan driverpipework 将容器中的接口直接“桥接”到网络。这在云提供商上更为复杂,因为大多数提供商会过滤网络上的 MAC 地址,因此您需要重新配置容器中接口的 MAC 地址。

【讨论】:

  • 可能有一个更简单的选项将网络范围路由到 docker 主机,这取决于路由和公共 IP 在 Azure 上的工作方式。
猜你喜欢
  • 1970-01-01
  • 2023-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-10
相关资源
最近更新 更多