【问题标题】:docker runs image on wrong portdocker 在错误的端口上运行图像
【发布时间】:2017-04-20 07:17:44
【问题描述】:

我有一个 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

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

【问题讨论】:

  • 你能在 docker 外运行 nmap -A -p8080,8888 localhost 并向我们展示结果吗?
  • 这个命令有问题,因为我得到 Failed to resolve p8080,8888
  • 命令运行良好 - 你忘了 p 前面的 - 吗?
  • 是的,很抱歉。我更新了我的问题
  • 好的,nmap 的输出是一切都在做它应该做的——你的问题在哪里?

标签: java docker spring-boot


【解决方案1】:

您的 cmets 有点难以理解,但您的应用程序似乎正在侦听容器内的端口 8080,但您已使用 docker run -p 8888:80 -t test-server 将主机上的端口 8888 映射到容器内的端口 80。这将导致您看到的端口无法访问。您可以使用以下命令映射到端口 8080:

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

或者,由于您使用的是 spring boot,如果您想更改监听端口,可以在应用程序属性中将 server.port 的值设置为端口 80。

【讨论】:

  • 查看this question了解更多关于在spring boot中设置监听端口的细节。
【解决方案2】:

需要考虑不同的端口。

首先是绑定在端口上的应用程序。对于 Spring Boot,默认为 8080,这是进程绑定到容器内的端口号。

通过 Dockerfile 中的 EXPOSE 指令,您可以说明哪些端口应该在容器的网络接口上公开。因此,如果您启动另一个容器直接访问给定的容器,您只能访问公开的端口。在大多数情况下,exposed 端口应该与容器内的进程绑定的端口号相匹配。

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

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

  • 在我的 docker 主机上打开 8888 端口
  • 将我的 docker 主机 8888 上的所有流量映射到容器的 80 端口
  • 容器暴露了 80 端口
  • 容器中没有绑定到80端口的进程
  • spring boot 应用默认绑定到里面的8080端口

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

附加信息:通过映射-p 8888:8080 之类的端口,您还可以在容器上打开端口 8080(这可以看作是某种暴露内部端口。发生的情况是一样的。有一个 iptables 规则添加使得容器的端口(这里是 8080)是可访问的。所以EXPOSE 指令在没有到主机的端口映射时与容器到容器的通信相关。

【讨论】:

    猜你喜欢
    • 2021-08-22
    • 2017-07-30
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多