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.2
和 10.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 地址。
而不是听单个 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.2
和 10.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 地址。