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

时间:2015-06-20 19:56:57

标签: docker port

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

例如,我希望在{myserver}有一个端点:8080 / v1 /,另一个在{myserver}:8080 / v2 /。

如果它完全相关,那么这些将是基于Java:8的Docker镜像,在Spring Boot REST框架上使用java jar构建。

Docker容器可以实现吗?

4 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:6)

这是关于tcp端口作为docker工作方式的方式的问题。与两个应用程序无法绑定到同一个tcp端口的方式相同,两个docker容器也不能。

正如@Sergei Rodionov所指出的,SO_REUSEPORT可以用来允许多个进程共享同一个tcp端口(这可以在启动你的java应用程序时指定)。我认为这不会对容器起作用。

答案 2 :(得分:6)

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

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

你可以有两个独立的容器都在监听: 192.168.11.223:80 10.88.88.12:80

如果你看一下docker run的语法:

-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)

答案 3 :(得分:3)

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

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