繁体   English   中英

Docker-compose“端口”:监听多个 IP 地址/IP 范围

[英]Docker-compose "ports": listen on multiple IP addresses / IP range

而不是像 localhost 那样监听单个 IP 地址:

ports:
- "127.0.0.1:80:80"

我希望容器只收听本地网络,即:

ports:
- "10.0.0.0/16:80:80"

ERROR: The Compose file './docker-compose.yml' is invalid because:
services.SERVICE.ports contains an invalid type, it should be a number, or an object

这可能吗?

我还不想使用群模式等。


如果不支持 IP 范围,可能至少有多个 IP 地址,例如10.0.0.210.0.0.3

ERROR: for CONTAINER  Cannot start service SERVICE: driver failed programming external connectivity on endpoint CONTAINER (...): Error starting userland proxy: listen tcp 10.0.0.3:80: bind: cannot assign requested address

ERROR: for SERVICE  Cannot start service SERVICE: driver failed programming external connectivity on endpoint CONTAINER (...): Error starting userland proxy: listen tcp 10.0.0.3:80: bind: cannot assign requested address

或者甚至不支持收听10.0.0.3

主机连接到10.0.0.0/16

> ifconfig
ens10: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        inet 10.0.0.2  netmask 255.255.255.255  broadcast 10.0.0.2
        inet6 f**0::8**0:ff:f**9:b**7  prefixlen 64  scopeid 0x20<link>
        ether **:00:00:**:**:**  txqueuelen 1000  (Ethernet)

Listening to a single IP address似乎不正确。 该服务正在侦听 IP 地址。

假设您的 VM 有两个网络接口(以太网卡):

网络 1 → 子网: 10.0.0.0/24和 IP 10.0.0.100
网络 2 → 子网: 10.0.1.0/24和 IP 10.0.1.200

  • 如果您设置127.0.0.1:80:80这意味着您的服务正在侦听127.0.0.1的 ( localhost ) 端口 80。
  • 如果您想从10.0.0.0/24子网访问服务,您应该设置10.0.0.100:80:80并使用http://10.0.0.100:80地址以便能够从外部主机连接您的容器

如果要同时从多个网络访问服务,可以将容器端口绑定到多个端口,其中 IP 是连接源 IP ):

ports:
  - 10.0.0.100:80:80
  - 10.0.1.200:80:80
  - 127.0.0.1:80:80

如果存在防火墙并限制该网络,请不要忘记在 VM 的防火墙上打开 80 端口

如果您给 Compose ports:docker run -p )一个 IP 地址,它必须是主机接口的特定已知 IP 地址,或0.0.0.0表示“所有接口”。 Docker 守护程序将此特定 IP 地址提供给bind (2)调用,该调用接受地址而不是网络,并遵循ip (7)中针对 IPv4 的规则。

使用您显示的输出,您只能将容器绑定到10.0.0.2 如果要使用同一网络上的其他IP地址,还需要分配给主机; 例如,我如何(从 CLI)将多个 IP 地址分配给一个接口? 在 Ask Ubuntu 上,然后你可以将一个容器绑定到新添加的地址。

如果您的系统位于多个物理网络上,则可以有任意数量的ports:只要主机地址和主机端口是唯一的。 特别是您可以有多个ports:所有端口都转发到同一个容器端口。

ports:
  # make this visible to the external load balancer on port 80
  - '192.168.17.2:80:3000'
  # also make this visible to the internal network also on port 80
  - '10.0.0.2:80:3000'
  # and the management network but on port 3000
  - '10.99.0.36:3000:3000'

同样,主机必须已经在ifconfig输出中具有这些 IP 地址。

我想你误解了这个领域。

当您映射 127.0.0.1:80:80 时,您会将接口 127.0.0.1 从您的主机映射到您的容器。

对于 127.0.0.1,您只能从主机内部访问它。

当您映射 10.0.0.3:80:80 时,您会将接口 10.0.0.3 从您的主机映射到您的容器。 并且所有可以访问 10.0.0.3 的 ip 都可以访问您的 docker 容器映射。

但无论如何,这个字段不会对谁访问这个容器进行任何过滤

编辑:修改后,我发现我对您的问题有误解。

您希望 docker 创建“桥接接口”以不共享主机的 ip。

我认为使用端口映射时这是不可能的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM