Docker可以将多个容器端口映射到一个主机端口吗?

时间:2016-06-07 22:41:09

标签: docker docker-networking

根据我的理解,端口映射是1比1,我不明白为什么用于容器数据中的端口映射的数据结构是这样的,

"NetworkSettings": {
[...]
"Ports": {
    "8888/tcp": [
        {
            "HostIp": "0.0.0.0",
            "HostPort": "8888"
        }
    ]
}

"8888/tcp"键映射到列表而不是单个对象。因此,在Java客户端中,Ports的数据结构就像这个Map<String, List<PortBinding>>,但List这里只能包含1个元素吗?还是我非常想念一些基本的东西?

3 个答案:

答案 0 :(得分:8)

这是完全合法的:

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。

答案 1 :(得分:0)

johnharris85 的回答是正确的。在这里,我想指出,您可以将多个主机端口映射到同一个容器端口,而相反是不可能的(除非它们具有不同的 IP 地址)。想想邮递员怎么把东西送到两个门牌号相同的房子里。

答案 2 :(得分:0)

因此,您希望一个传入连接成为到两个后端服务的连接。那根本做不到:这与有连接的语义不兼容。

但是您可以做的是拥有一个系统,其中一些连接到一个后端,而其他连接到另一个后端。这需要一个连接到主机端口的反向代理,然后转发到后端服务:多个容器。

您还必须清楚反向代理如何决定要转发到哪个后端服务:您为什么想要该功能。两种选择是:负载平衡和扇出。对于负载平衡,连接是共享的,因此您可以获得拥有多个后端服务器的性能提升。对于扇出,您可以根据请求的 URL 决定使用的后端服务器。

最流行的 HTTP 代理是 Apache Httpd 和 Nginx。