Docker容器中的Spring Boot应用程序端口映射

在我的 application.yml 文件中,我在 8080 上添加了服务器端口。

server:
  port: 8080

现在在我的 Dockerfile 中,我公开了端口范围 8080-8089。我的目标是在不同的外部和内部端口上运行此映像。

我的 Dockerfile 在下面给出

FROM openjdk:8-jdk-alpine
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} user-service.jar
EXPOSE 8000-8089

ENTRYPOINT ["java","-jar","/user-service.jar"]

我的 docker image build 命令如下:

docker image build -t user-service .

现在构建此映像后,我的 docker run 命令如下所示:

docker run -d -p 8080:8080  -it user-service

在这里,user-service 是我的 docker 镜像标签。在此之后,我可以访问 8080 端口上的应用程序。

但问题是,当我使用端口映射 -p 8081:8081 运行另一个容器时,应用程序正在运行,但无法使用端口 8081 访问。

我的 docker run 命令是:

docker run -d -p 8081:8081  -it user-service

现在我的目标是我想在 docker 中使用我的外部和内部端口映射跳过 application.yml 服务器端口

笔记

1.这是.jar部署。对于 WAR 部署,我们可以通过服务器的配置轻松跳过 application.yml 服务器端口。

  1. 我将把 docker 镜像中的端口改为运行容器。在 docker build 之后,我没有修改 application.yml 文件或 Dockerfile 的范围

提前致谢

stack overflow Spring boot apps port mapping in docker container
原文答案
author avatar

接受的答案

是的,最后我想通了。对于 Spring boot 嵌入式 tomcat 部署,在运行容器期间,您必须设置 SERVER_PORT 以覆盖 application.yml 服务器端口属性。

docker run -d -e SERVER_PORT=8081 -p 8081:8081  -it user-service

答案:

作者头像

与其提供一个精确简洁的解决方案,让我也解释一下为什么它对你不起作用,我认为它对我们读过这篇文章的同事来说会更有价值。

所以从弹簧靴部分开始。

Spring Boot 对 docker 一无所知。

当您输入 server.port: 8080 时,它仅意味着 Spring Boot 应用程序启动了准备好接受该端口上的连接的 Web 服务器。

如果您想在不修改 application.yaml 的情况下从外部更改该映射,您可以通过传递附加参数来实现:

java -jar myapp.jar --server.port=8081

这将有效地覆盖 yaml 中的定义。还有其他方法(例如环境变量)。 Spring boot 支持许多不同的配置方式,并且有一些方式优先于 yaml 中指定的配置。其中以 SERVER_PORT 环境变量为例。

您可以阅读 the official spring boot documentation chapter 了解更多信息

无论设置中是否存在 docker,上述所有情况都会发生。

现在,至于 docker 部分。

当您使用 -p A:B 运行容器时,这意味着它将主机中的端口 A 转发到容器内的端口 B。

所以这就是它不起作用的原因:你跑

docker run -d -p 8081:8081 -it user-service

但是没有人准备好接受容器内端口 8081 上的连接。因此,说您的 docker 服务不起作用是不准确的——它启动但您不能调用它。

因此,最简单的方法是使用 -p 8081:8080 之类的东西运行,这样从主机的角度来看,端口不会发生冲突,但容器可以访问。

如果您还想更改 docker 容器中的端口(无论出于何种原因),您可以阅读上面关于 spring boot 部分的内容(使用 --server.port 和所有内容)

作者头像

Dockerfile 中的 EXPOSE 指令只提示应该映射哪些端口。 -p 8081:8081 不起作用的原因是您的应用程序侦听 8080 而不是 8081

你应该改用 -p 8081:8080 ;这会将主机的端口 8081 映射到容器 8080

docker run -d -p 8080:8080 -it user-service
docker run -d -p 8081:8080 -it user-service
docker run -d -p 8082:8080 -it user-service