问题描述
server:
port: 8080
@H_502_0@现在在我的 Dockerfile 中,我公开了端口范围 8080-8089。
我的目标是在不同的外部和内部端口上运行此映像。
@H_502_0@我的 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"]
@H_502_0@我的docker镜像构建命令如下:
docker image build -t user-service .
@H_502_0@现在构建这个镜像后,我的 docker run 命令如下:
docker run -d -p 8080:8080 -it user-service
@H_502_0@这里,user-service 是我的 docker 镜像标签。
之后,我就可以在 8080 端口上访问该应用了。
@H_502_0@但问题是,当我使用端口映射 -p 8081:8081 运行另一个容器时,应用程序正在运行,但无法使用端口 8081 访问。
@H_502_0@我的 docker run 命令是:
docker run -d -p 8081:8081 -it user-service
@H_502_0@现在我的目标是我想在 docker 中使用我的外部和内部端口映射跳过 application.yml 服务器端口
@H_502_0@注意事项:
- 这是 .jar 部署。对于 WAR 部署,我们可以通过服务器的配置轻松跳过 application.yml 服务器端口。
- 我将从 docker 镜像更改端口以运行容器。在 docker build 之后我没有修改 application.yml 文件或 Dockerfile 的范围
解决方法
与其提供一个准确简洁的解决方案,不如让我解释一下为什么它对您不起作用,我认为这对我们曾经阅读过这篇文章的同事来说更有价值。
所以从弹簧靴部分开始。
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 引导部分的内容(包括 --server.port
和所有内容)
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 Boot 嵌入式 tomcat 部署,在运行容器期间,您必须设置 SERVER_PORT 以覆盖 application.yml
服务器端口属性。
docker run -d -e SERVER_PORT=8081 -p 8081:8081 -it user-service