docker工运行在错误的端口上的图像
我有一个春季启动应用程序,我创build了这样一个dockerfile:
FROM java:8 EXPOSE 80 ADD /target/test-server.jar test-server.jar ENTRYPOINT ["java","-jar","test-server.jar"]
接下来我按照下面的步骤
-
docker build -t test-server .
-
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
指令与容器到容器通信相关。