我有一个spring boot应用程序,我创建了这样的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
不过,为什么它显示test-ser而不是test-server?
通常,我希望能够在几个不同的端口上运行此服务器
命令
的结果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 :(得分:2)
您的评论有点难以理解,但您的应用程序似乎正在侦听容器内的端口8080,但您已将主机上的端口8888映射到容器内的端口80 docker run -p 8888:80 -t test-server
。这将导致您看到的无法访问的端口。您可以使用以下地址映射到端口8080:
docker run -p 8888:8080 -t test-server
或者,由于您正在使用spring boot,因此如果要更改侦听端口,可以将应用程序属性中的server.port
值设置为端口80。
答案 1 :(得分:2)
需要考虑不同的端口。
首先,您的应用程序绑定在端口上。对于spring boot,默认为8080,这是进程绑定到容器内的端口号。
使用Dockerfile中的EXPOSE
指令,您可以说明应在容器的网络接口上公开哪些端口。因此,如果您启动另一个直接访问给定容器的容器,则只能访问公开的端口。在大多数情况下,expose
d端口应该与容器内部进程绑定的端口号相匹配。
第三个选项是您在运行容器时定义的端口映射。这基本上是说:在docker主机上打开一个端口,并将所有流量路由到后一个端口上的容器。
所以你当前所有的设置都说:
所以,有不同的选择。您可以在Dockerfile中公开端口8080,并将端口映射为-p 8888:8080
。如果希望进程在容器内的特定端口上运行,则可以在启动Spring应用程序时添加配置属性,如--server.port=8888
。但请注意,这只会影响绑定Java应用程序的端口,而不会影响以后访问它的端口。 EXPOSE
必须始终与内部使用的端口匹配,才能访问内部运行的进程。
一个附加信息:通过映射像-p 8888:8080
这样的端口,你也可以打开容器上的端口8080(这可以看作某种暴露内部端口。发生的情况是一样的。有一个添加了iptables规则,以便可以访问容器的端口(此处为8080)。因此,当没有端口映射到主机时,EXPOSE
指令与容器到容器的通信相关。