【问题标题】:Docker host multiple containers with different ip address but on same portDocker托管多个具有不同IP地址但在同一端口上的容器
【发布时间】:2021-03-18 12:36:38
【问题描述】:

我有三个 tomcat 容器运行在具有不同子网和网关的不同桥接网络上 例如:

container1 172.16.0.1 bridge1
container2 192.168.0.1 bridge2
container3 192.168.10.1 bridge3

这些容器在不同的端口上运行,例如 8081、8082、8083

有没有办法在同一个 8081 中运行所有三个容器? 如果可能的话,我该如何在docker中做到这一点。

【问题讨论】:

    标签: docker docker-container


    【解决方案1】:

    您需要设置reverse proxy。顾名思义,这是一个与标准代理相反的代理。标准代理从内部网络获取请求并从外部网络(互联网)为它们提供服务,而反向代理从外部网络获取请求并通过从内部网络获取信息来服务它们。

    有多个应用程序可以作为反向代理,但最常用的是:

    大部分 reveres 代理可以在您的 docker 上作为另一个容器运行。由于有大量教程,其中一些工具很容易上手。

    反向代理不仅仅是公开单个端口并将流量转发到后端端口。反向代理可以管理和分配负载(负载平衡),可以将来自客户端的 URI 更改为后端可以理解的 URI(URL 重写),可以更改后端的响应(内容重写) 等。

    反向 HTTP/HTTP 流量

    假设您有 HTTP 服务,您需要做些什么来设置反向代理,在您的示例中如下所示:

    1. 决定使用哪个工具。作为初学者,我建议使用 NginX
    2. 为代理创建一个配置文件,它将接收来自端口 80 的请求并分发到端口 8081、8082、8083。由于容器位于不同的网络上,您需要决定是否要将流量转发到他们的 IP 地址(我不建议这样做,因为 IP 可以更改),或者在主机上发布端口并使用主机 IP。另一种选择是在同一个网络上运行所有这些。
    3. 根据具体情况,您需要设置X-Forwarding-* 标志和/或URL 重写和内容重写。
    4. 运行容器并将端口 80 发布为 8080(如果您在主机上公开容器,您的 8081 将已被占用)。

    反向 TCP/UDP 流量

    如果您有非 HTTP 服务(原始 TCPUDP 服务),那么您可以使用 HAProxy。除了配置步骤 #2 之外,步骤相同。由于流量的非HTTP性质,配置有所不同,您可以在this SO中找到示例

    【讨论】:

    • 是否有可能使用 docker-compose,yml 实现我的查询?
    • docker-compose 只是为了编排容器生命周期,但是你可以在你的 docker-compose 中添加代理作为另一个服务,所以当你发出docker-compose up你的服务将与代理一起启动
    • 如何在 docker 的两个不同网络上运行的两个容器内进行通信?
    • 对此没有简单的答案,这完全取决于您的网络是如何设置的以及您的主机是什么。您需要阅读有关 docker 网络的更多信息。但是您也可以将代理容器添加到所有网络,这样代理容器就能够将容器名称解析为 IP 地址。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 2016-07-23
    • 2017-10-03
    • 2017-11-28
    • 1970-01-01
    相关资源
    最近更新 更多