Docker 可以将多个容器端口映射到一个主机端口吗?
Can Docker map multiple container ports to one host port?
根据我的理解端口映射是1对1的,我不明白的是为什么容器数据中用于端口映射的数据结构是这样的,
"NetworkSettings": {
[...]
"Ports": {
"8888/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "8888"
}
]
}
"8888/tcp"
键映射到列表而不是单个对象。因此在 Java 客户端中,Ports 的数据结构是这样的 Map<String, List<PortBinding>>
,但是这里的 List
只能包含 1 个元素,对吗?还是我错过了一些基本的东西?
这是完全合法的:
docker run -tid -p 8080:80 -p 8090:80 nginx
"Ports": {
"443/tcp": null,
"80/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "8090"
},
{
"HostIp": "0.0.0.0",
"HostPort": "8080"
}
]
}
所以不,这不是 1 比 1。
johnharris85 的回答是正确的。在这里,我想指出的是,您可以将多个主机端口映射到同一个容器端口,反之是不可能的(除非它们具有不同的 IP 地址)。试想邮递员怎么能把东西送到两间房子,门牌号一样
因此,您希望一个传入连接成为到两个后端服务的连接。这根本做不到:它与建立连接的语义不兼容。
但是您可以做的是拥有一个系统,其中一些连接进入一个后端,而其他连接进入不同的后端。那需要一个反向代理连接到主机端口,然后转发到后端服务:多个容器。
您还必须清楚反向代理如何决定转发到哪个后端服务:您为什么需要该功能。两个选择是:负载平衡和扇出。对于负载平衡,连接被共享,因此您可以获得拥有多个后端服务器的性能提升。对于扇出,您根据请求的 URL 决定使用的后端服务器。
最流行的 HTTP 代理是 Apache Httpd 和 Nginx。
根据我的理解端口映射是1对1的,我不明白的是为什么容器数据中用于端口映射的数据结构是这样的,
"NetworkSettings": {
[...]
"Ports": {
"8888/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "8888"
}
]
}
"8888/tcp"
键映射到列表而不是单个对象。因此在 Java 客户端中,Ports 的数据结构是这样的 Map<String, List<PortBinding>>
,但是这里的 List
只能包含 1 个元素,对吗?还是我错过了一些基本的东西?
这是完全合法的:
docker run -tid -p 8080:80 -p 8090:80 nginx
"Ports": {
"443/tcp": null,
"80/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "8090"
},
{
"HostIp": "0.0.0.0",
"HostPort": "8080"
}
]
}
所以不,这不是 1 比 1。
johnharris85 的回答是正确的。在这里,我想指出的是,您可以将多个主机端口映射到同一个容器端口,反之是不可能的(除非它们具有不同的 IP 地址)。试想邮递员怎么能把东西送到两间房子,门牌号一样
因此,您希望一个传入连接成为到两个后端服务的连接。这根本做不到:它与建立连接的语义不兼容。
但是您可以做的是拥有一个系统,其中一些连接进入一个后端,而其他连接进入不同的后端。那需要一个反向代理连接到主机端口,然后转发到后端服务:多个容器。
您还必须清楚反向代理如何决定转发到哪个后端服务:您为什么需要该功能。两个选择是:负载平衡和扇出。对于负载平衡,连接被共享,因此您可以获得拥有多个后端服务器的性能提升。对于扇出,您根据请求的 URL 决定使用的后端服务器。
最流行的 HTTP 代理是 Apache Httpd 和 Nginx。