docker工运行在错误的端口上的图像

我有一个春季启动应用程序,我创build了这样一个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。 我想要它在8888上运行

docker 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 

顺便说一句,为什么它显示testing服务器而不是testing服务器?

通常,我希望能够在几个不同的端口上运行此服务器

来自命令的结果

 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 

从您的意见中可以看出,您的应用程序似乎正在侦听您的容器内的端口8080,但是您已经将主机上的端口8888映射到容器内的端口80,并使用docker run -p 8888:80 -t test-server 。 这将导致您看到的无法访问的端口。 您可以通过以下方式映射到端口8080:

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

或者,由于您使用的是spring引导,因此如果要更改侦听端口,可以将应用程序属性中的server.port值设置为端口80。

有不同的端口需要考虑。

首先是你的应用程序绑定在一个端口上。 对于spring引导,默认为8080,这是进程绑定到容器内的端口号。

通过EXPOSE中的EXPOSE指令,您可以知道应在容器的networking接口上显示哪些端口。 所以如果你启动另一个容器直接访问给定的容器,你只能访问暴露的端口。 在大多数情况下, expose端口应该与容器内的进程绑定的端口号相匹配。

第三个选项是运行容器时定义的端口映射。 基本上说:打开docker主机上的一个端口,并将所有stream量路由到后一个端口上的容器。

所以你所有的当前设置说:

  • 在我的docker主机上打开端口8888
  • 将我的docker主机的8888上的所有stream量映射到容器的端口80
  • 该容器暴露端口80
  • 在容器中没有绑定到端口80的进程
  • 默认情况下,弹簧引导应用程序绑定到端口8080

所以,有不同的select。 您可以在Dockerfile中公开端口8080,并将端口映射为-p 8888:8080 。 如果您希望您的进程在容器内的特定端口上运行,则可以在启动Spring应用程序(如--server.port=8888时添加configuration属性。 但请注意,这只会影响java应用程序绑定的端口,而不会影响您稍后访问的端口。 EXPOSE必须始终与内部使用的端口相匹配,才能访问内部运行的进程。

一个额外的信息:通过映射一个像-p 8888:8080这样的端口,你也打开了你的容器上的端口8080(这可以看作是某种暴露内部端口的情况,结果是相同的。使得容器的端口(这里是8080)是可访问的,所以当没有端口映射到主机时, EXPOSE指令与容器到容器通信相关。