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

时间:2016-12-05 19:38:26

标签: java docker spring-boot

我有一个spring boot应用程序,我创建了这样的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

  3. 它可以工作但是在端口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
    

2 个答案:

答案 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主机上打开一个端口,并将所有流量路由到后一个端口上的容器。

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

  • 在我的泊坞主机上打开端口8888
  • 将我的泊坞主机8888上的所有流量映射到容器的端口80
  • 容器公开端口80
  • 在容器中没有绑定到端口80的进程
  • 弹出启动应用程序默认绑定到端口8080

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

一个附加信息:通过映射像-p 8888:8080这样的端口,你也可以打开容器上的端口8080(这可以看作某种暴露内部端口。发生的情况是一样的。有一个添加了iptables规则,以便可以访问容器的端口(此处为8080)。因此,当没有端口映射到主机时,EXPOSE指令与容器到容器的通信相关。