【问题标题】:Can Docker map multiple container ports to one host port?Docker 可以将多个容器端口映射到一个主机端口吗?
【发布时间】:2016-10-08 00:25:30
【问题描述】:

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

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

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

【问题讨论】:

    标签: docker docker-networking


    【解决方案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"
                    }
                ]
            }
    

    所以不,这不是一对一。

    【讨论】:

    • 是否可以将多个 docker 端口映射到 1 个主机端口?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2014-09-01
        • 1970-01-01
        • 2022-12-09
        • 2020-02-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-10
        • 1970-01-01
        相关资源
        最近更新 更多