在我的 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 服务器端口。
- 我将把 docker 镜像中的端口改为运行容器。在 docker build 之后,我没有修改 application.yml 文件或 Dockerfile 的范围
提前致谢
与其提供一个精确简洁的解决方案,让我也解释一下为什么它对你不起作用,我认为它对我们读过这篇文章的同事来说会更有价值。
所以从弹簧靴部分开始。
Spring Boot 对 docker 一无所知。
当您输入
server.port: 8080
时,它仅意味着 Spring Boot 应用程序启动了准备好接受该端口上的连接的 Web 服务器。如果您想在不修改 application.yaml 的情况下从外部更改该映射,您可以通过传递附加参数来实现:
这将有效地覆盖 yaml 中的定义。还有其他方法(例如环境变量)。 Spring boot 支持许多不同的配置方式,并且有一些方式优先于 yaml 中指定的配置。其中以
SERVER_PORT
环境变量为例。您可以阅读 the official spring boot documentation chapter 了解更多信息
无论设置中是否存在 docker,上述所有情况都会发生。
现在,至于 docker 部分。
当您使用
-p A:B
运行容器时,这意味着它将主机中的端口 A 转发到容器内的端口 B。所以这就是它不起作用的原因:你跑
但是没有人准备好接受容器内端口 8081 上的连接。因此,说您的 docker 服务不起作用是不准确的——它启动但您不能调用它。
因此,最简单的方法是使用
-p 8081:8080
之类的东西运行,这样从主机的角度来看,端口不会发生冲突,但容器可以访问。如果您还想更改 docker 容器中的端口(无论出于何种原因),您可以阅读上面关于 spring boot 部分的内容(使用
--server.port
和所有内容)