多个Docker容器可以使用相同的主机/端口运行吗?

问题描述:

正在研究使用Docker进行REST服务项目。我有一个问题是我们是否可以使用Docker在同一主机/端口上运行多个版本的服务。多个Docker容器可以使用相同的主机/端口运行吗?

例如,我想有在{} myserver的端点:8080/V1 /在{} MYSERVER,另一:8080/V2 /。

如果是相关的一切,这是Java的:与在春季启动REST框架java的罐子构建基于8倍泊坞的图像。

Docker容器有可能吗?

+2

这是一个XY问题。没有使用代理的容器(例如nginx),这是可能的。容器在这里无关紧要;您可以在容器中运行后端服务...或不运行。 – dnozay

+0

这是一个有趣的问题,因为Docker可能已经集成了路由的小代理功能。想象一下,像:一个容器与Apache,另一个与Node.js一起工作:80不需要代理... –

这既是一个关于向TCP端口工作的方式泊坞窗作品的问题。就像两个应用程序不能绑定到同一个tcp端口一样,两个docker容器也不能。

由于@Sergei罗季奥诺夫指出SO_REUSEPORT可以用来允许多个进程共享同一个TCP端口(这样就可以启动你的Java应用程序时指定)。我认为这不会跨越集装箱。

+0

如果初始套接字与SO_REUSEPORT选项绑定会怎样? –

+0

在我看来,SO_REUSEPORT旨在用于同一台机器上的进程。你认为它可以跨越集装箱吗? –

+0

@RobertMoskal对于Nginx而言,以下带有docker-gen的nginx代理解决方案可以帮助您:github.com/jwilder/nginx-proxy您基本上在您的docker环境中添加代理,并让它处理主机端口上的请求并将其转发给适当的容器 –

您可以使用不同的主机端口运行这两个容器,并使用侦听主机端口的haproxy/nginx/varnish(本地或另一个容器内),并根据URL重定向到正确的容器。

+1

对于Nginx来说,以下带有docker-gen的nginx代理解决方案可以提供帮助:https://github.com/jwilder/nginx-proxy您基本上在docker环境中添加一个代理并让它处理主机上的请求端口并将其转发到适当的容器 –

是的,这是可能的,只要你使用不同的网络地址,您正在收听的每个重复端口。

例如,您的主机分配有以下IP地址: 192.168.11.223 10.88.88.12

你可以有两个不同的容器都监听: 192.168.11.223:80 10.88.88.12: 80

如果你看一下语法泊坞窗运行:

-p=[]  : Publish a container᾿s port or a range of ports to the host 
      format: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort | containerPort 
      Both hostPort and containerPort can be specified as a range of ports. 
      When specifying ranges for both, the number of container ports in the range must match the number of host ports in the range. (e.g., `-p 1234-1236:1234-1236/tcp`) 
      (use 'docker port' to see the actual mapping) 

是的,这是可能的,只要容器使用不同的IP地址。 您可以使用以下命令检查容器的IP地址。

docker inspect -f '{{ .NetworkSettings.IPAddress }}' <container ID>