Spring docker 容器中的启动应用程序端口映射

Spring boot apps port mapping in docker container

在我的 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镜像构建命令如下:

docker image build -t user-service .

构建此映像后,我的 docker 运行 命令如下:

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

这里,user-service是我的docker图片TAG。 之后,我就可以在8080端口访问应用了。

但问题是当我 运行 另一个带有端口映射 -p 8081:8081 的容器时,应用程序是 运行ning 但不会使用端口 8081 访问。

我的docker运行命令是:

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

现在我的目标是在 docker

中使用我的外部和内部端口映射跳过 application.yml 服务器端口

备注:

  1. 这是 .jar 部署。对于 WAR 部署,我们可以通过服务器配置轻松跳过 application.yml 服务器端口。
  2. 我会将端口从 docker 映像更改为 运行 容器。在 docker build
  3. 之后,我没有修改 application.yml 文件或 Dockerfile 的范围

提前致谢

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

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

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

与其提供精确简洁的解决方案,不如让我也解释一下为什么它对您不起作用,我认为这对我们将阅读本文的同事更有价值 post。

所以从 spring 引导部分开始。

Spring boot 对 docker.

一无所知

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

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

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

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

您可以阅读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 引导部分(--server.port 和所有内容)的内容