Docker-compose "ports": 监听多个IP地址/IP范围

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

而不是听单个 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)

我想你误解了这个字段。

当您映射 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。

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

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就是connection source 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 地址提供给 IPv4 的 bind(2) call, which takes an address and not a network, and follows the rules in ip(7)

根据您显示的输出,您只能将容器绑定到 10.0.0.2。如果要使用同一网络中的其他IP地址,也需要将它们分配给主机;参见 How can I (from CLI) assign multiple IP addresses to one interface? 上的示例 Ubuntu,然后您可以将容器绑定到 newly-added 地址。

如果您的系统位于多个物理网络上,您可以拥有任意数量的 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 地址。