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 服务器端口
备注:
- 这是 .jar 部署。对于 WAR 部署,我们可以通过服务器配置轻松跳过 application.yml 服务器端口。
- 我会将端口从 docker 映像更改为 运行 容器。在 docker build
之后,我没有修改 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
和所有内容)的内容
在我的 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 服务器端口备注:
- 这是 .jar 部署。对于 WAR 部署,我们可以通过服务器配置轻松跳过 application.yml 服务器端口。
- 我会将端口从 docker 映像更改为 运行 容器。在 docker build 之后,我没有修改 application.yml 文件或 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
和所有内容)的内容