所以我在 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 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/