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

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

例如,我想在{myserver}:8080 / v1 /和另一个位于{myserver}:8080 / v2 /的端点。

如果它是相关的,那么这些将是基于Java:8的基于Spring Boot REST框架的java jar构build的Docker镜像。

这是可能的Docker容器?

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

是的,只要您正在监听的每个重复的端口使用不同的networking地址,就可以这样做。

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

你可以有两个单独的容器,都听:192.168.11.223:80 10.88.88.12:80

如果你看看docker运行的语法:

-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. (eg, `-p 1234-1236:1234-1236/tcp`) (use 'docker port' to see the actual mapping) 

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

正如@Sergei Rodionov所指出的,SO_REUSEPORT可以用来允许多个进程共享同一个tcp端口(这可以在启动你的java应用程序时指定)。 我不认为这将跨越集装箱。

是的,只要容器使用不同的IP地址就可以。 你可以使用下面的命令来检查容器的IP地址。

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