2015-06-20 121 views
14

正在研究使用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不需要代理... –

回答

4

這既是一個關於向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環境中添加代理,並讓它處理主機端口上的請求並將其轉發給適當的容器 –

7

您可以使用不同的主機端口運行這兩個容器,並使用偵聽主機端口的haproxy/nginx/varnish(本地或另一個容器內),並根據URL重定向到正確的容器。

+1

對於Nginx來說,以下帶有docker-gen的nginx代理解決方案可以提供幫助:https://github.com/jwilder/nginx-proxy您基本上在docker環境中添加一個代理並讓它處理主機上的請求端口並將其轉發到適當的容器 –

5

是的,這是可能的,只要你使用不同的網絡地址,您正在收聽的每個重複端口。

例如,您的主機分配有以下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) 
1

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

docker inspect -f '{{ .NetworkSettings.IPAddress }}' <container ID> 
相關問題