当前位置: 首页 > 知识库问答 >
问题:

Docker在同一端口上承载多个具有不同ip地址的容器

韦昊焜
2023-03-14

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

container1 172.16.0.1 bridge1
container2 192.168.0.1 bridge2
container3 192.168.10.1 bridge3

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

有没有办法在同一个8081中运行所有三个容器?如果可能的话,我怎么能在docker做呢。

共有1个答案

鲁城
2023-03-14

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

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

  • NginX

大多数reveres代理可以作为docker上的另一个容器运行。其中一些工具很容易启动,因为有大量的教程。

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

假设您有HTTP服务,在您的示例中,设置反向代理需要执行以下操作:

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

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

 类似资料:
  • 我有一个依赖于多个docker容器的应用程序。我使用docker撰写,以便所有容器都在同一个网络中进行容器间通信。但是,我的两个容器在各自的容器中监听相同的端口8080,但是映射到主机上的不同端口: 8072,8073。对于集装箱间的通信,因为我们使用集装箱的端口,这会引起问题吗? 限制条件: 我需要两个容器才能运行我的应用程序。因此,我无法将具有相同内部端口的其他容器隔离到不同的网络 所有容器都

  • 问题内容: 不熟悉Unix网络,添加虚拟接口等,现在尝试学习。我们正在尝试对我们的应用程序进行docker化。 我的要求是:将ip分配给可从外部应用程序/浏览器访问的docker容器。 容器ip应该基本上可以从同一网络中的其他计算机ping通。我不想使用端口转发。 我想访问docker容器,就像我们使用ip地址访问VM。没有端口映射,-p标志。如果我在容器中运行任何服务器,例如Apache或Tom

  • 问题内容: 我遇到的情况是,我在同一台服务器上使用不同的端口运行两个不同的Web应用程序。它们都在运行Java的Jetty servlet容器,因此它们都使用名为JSESSIONID的cookie参数来跟踪会话ID。这两个Web应用程序正在争用会话ID。 打开Firefox标签,然后转到WebApp1 WebApp1的HTTP响应具有带有JSESSIONID = 1的set-cookie标头 Fi

  • 问题内容: 我想更改mysql docker容器的默认公开端口,但是如果我尝试使用此命令: 这没用。 如果我使用标准端口3306:3306,则工作正常,但我想更改端口。有可能吗? 我已经尝试过-p 52000:3600,但是我总是得到: 问题答案: 您需要在(服务器的)首选TCP端口上映射容器端口3306: 所以对于你的mysql

  • 我想netty是我所知道的最好的java网络框架,在阅读并尝试一些示例后,我有疑问: 1.使用netty 4.0为具有不同协议的多端口创建网络服务器的最佳方法是什么? 每个服务器创建: EventLoopGroup bossGroup=new NioEventLoopGroup();//(1) EventLoopGroup workerGroup=新的NioEventLoopGroup(); Se

  • 我正在尝试为不同的环境设置一个带有docker-comment的Redis。因此,我需要在同一个端口上公开两个带有traefik的域: 域。通讯:6379 我无法在容器上公开这些端口,因为它们运行在同一台服务器上。 我的docker compose文件(用于域开发人员)如下所示: 我还尝试将treafik配置为使用以下endpoint: 当连接到“domain-dev.com:6379”时,无法断