docker - 绑定(bind)到单个 docker 容器中的多个 ip 地址

标签 docker networking ipv4

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

在我的 node.js 应用程序中,我想发出一个 http 请求,但在这 5 个 ip 之间进行负载平衡,所以当我发出请求时,我为每个要绑定(bind)的请求选择不同的 172.x ip,但是我'我得到:错误:绑定(bind) 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

最佳答案

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

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

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

之外,您可能会超出 Docker 可以为您设置的范围
  • docker run --net host 会起作用,但会为容器提供对主机网络的访问权限,这具有安全隐患。

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

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

关于docker - 绑定(bind)到单个 docker 容器中的多个 ip 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49353672/

相关文章:

linux - 无需 dyndns 即可从世界各地访问树莓派

wordpress - 如何使用 Docker 容器运行多个独立的 Wordpress 网站

docker - Gitlab-runner,docker :20. 10.2-dind 显示错误,无法连接到位于 tcp://docker:2375 的 Docker 守护进程

Windows模拟网线丢失

java - 在java中通过网络发送文本数据

c - 套接字 sendto() 返回 EINVAL

Lua 函数检查是否 ipv4 或 ipv6 或字符串

ruby-on-rails - MacOs Errno::ENOENT上的Docker:没有这样的文件或目录-getcwd

docker - 无法提取图像:针对gin-web的提取访问被拒绝,存储库不存在或可能需要 'docker login'

java - netty如何确定读取何时完成?