2016-12-05 101 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指令与没有端口映射到主机时的容器到容器通信有关