2016-12-05 102 views
1

我有一個春天啓動應用程序的形象和我創建dockerfile像這樣的:搬運工跑錯埠

FROM java:8 
EXPOSE 80 
ADD /target/test-server.jar test-server.jar 
ENTRYPOINT ["java","-jar","test-server.jar"] 

接下來我請按照下列步驟操作:

  1. docker build -t test-server .

  2. docker run -p 8888:80 -t test-server

它可以工作,但在端口8080上,默認爲tomcat。我希望它從搬運工PS

3debfb5a9084  test-server  "java -jar test-ser" About a minute ago Up About a minute 0.0.0.0:8888->80/tcp thirsty_euclid 

順便說一下8888

運行結果,爲什麼會出現測試SER,而不是測試服務器?

一般情況下,我希望能夠從命令

結果在幾個不同的端口上運行該服務器

nmap -A -p8080,8888 localhost 

Starting Nmap 7.12 (https://nmap.org) at 2016-12-05 20:49 CET 
Nmap scan report for localhost (127.0.0.1) 
Host is up (0.000059s latency). 
PORT  STATE SERVICE VERSION 
8080/tcp closed http-proxy 
8888/tcp open tcpwrapped 

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . 
Nmap done: 1 IP address (1 host up) scanned in 5.45 seconds 
+0

你可以運行'nmap -A -p8080, 8888 localhost'外面的docker並且顯示我們的結果? – msrd0

+0

這個命令出了什麼問題,因爲我得到了無法解析的p8080,8888 – Mont

+0

這個命令運行正常 - 你忘記了p前面的'-'嗎? – msrd0

回答

1

這是一個有點困難,從您的意見,瞭解,但似乎應用程序正在監聽容器內的端口8080,但已將主機上的端口8888映射到容器內的端口80,其中docker run -p 8888:80 -t test-server。這將導致您看到的無法訪問的端口。你可以映射到端口8080:

docker run -p 8888:8080 -t test-server 

或者,因爲你使用Spring啓動,你可以在你的應用程序的屬性,如果你想改變監聽端口設置server.port價值80端口。

+0

請參閱[此問題](http://stackoverflow.com/q/21083170/596285)瞭解有關在彈簧啓動中設置偵聽端口的更多詳細信息。 – BMitch

2

有不同的端口需要考慮。

首先,您的應用程序綁定在一個端口上。對於spring啓動,默認爲8080,這是進程綁定到容器內的端口號。

通過Dockerfile中的EXPOSE指令,您可以知道應該在容器的網絡接口上公開哪些端口。所以如果你啓動另一個容器直接訪問給定的容器,你只能訪問暴露的端口。在大多數情況下,端口應該與容器內的進程綁定的端口號相匹配。

第三個選項是您在運行容器時定義的端口映射。基本上說:在Docker主機上打開一個端口,並將所有流量路由到後一個端口上的容器。

因此,在當前所有的設置都表示:

  • 我的搬運工主機
  • 地圖上我的搬運工主機8888的所有通信到容器的端口打開8888端口80
  • 容器暴露的端口80
  • 在容器中沒有綁定到端口80的進程
  • 默認彈簧引導應用綁定到端口8080內

所以,有不同的選擇。您可以在Dockerfile中顯示端口8080,並將端口映射爲-p 8888:8080。如果您希望您的進程在容器內的特定端口上運行,則可以在啓動彈簧應用程序(如--server.port=8888)時添加配置屬性。但請注意,這隻會影響java應用程序綁定的端口,而不會影響稍後訪問的端口。 EXPOSE必須始終與內部使用的端口相匹配,才能訪問內部運行的進程。

一個額外的信息:通過映射一個像-p 8888:8080這樣的端口,你也打開了你的容器上的端口8080(這可以被看作是暴露內部端口的某種形式,發生的情況是相同的。這樣容器的端口(這裏是8080)是可以訪問的,所以EXPOSE指令與沒有端口映射到主機時的容器到容器通信有關