Docker 教程

Dockerfile实战:部署 Spring Boot

点击学习开源企业 Docker 镜像仓库 Harbor 软件 教程。

假如我们有一个 Spring Boot 应用程序,该程序使用 jar 包的方式发布,项目结构如下图:

8ef29c28019d05fdc355eadbfebb2988_1725279010480-8c2ebae5-364e-468b-8669-000511c314c6.png

b6ccb5d761519fc49dfd02526c1ccb45_1725287989362-1864d34a-e2be-42d0-b474-a7d19518d443.png

⚠️注意,你可以访问 https://start.spring.io/ 地址,快速创建一个 Spring Boot 项目,如下图:

412a5422c0da87f4de17a925fe1e1620_1725279449239-7157b2c2-f662-4dbc-88f5-27485b2742bb.png

下面是使用 Dockerfile 部署 Spring Boot 项目的详细步骤:

编写 Dockerfile

下面 Dockerfile 将发布一个 Spring Boot2 的 jar 服务,该服务依赖 jdk1.8,监听 8081 端口,允许在启动容器时指定运行环境(dev、test、prod),根据环境不同,使用不同的配置信息。

Dockerfile 内容如下:

FROM openjdk:8-jre-alpine

WORKDIR /app
COPY target/demo_jar-0.0.1-SNAPSHOT.jar .

ENV ENVIROMENT=dev

EXPOSE 8080
ENTRYPOINT ["java", "-jar", "demo_jar-0.0.1-SNAPSHOT.jar", "--spring.profiles.active=${ENVIROMENT}"]

Dockerfile 文件分析:

  • FROM openjdk:8-jre-alpine:使用 openjdk:8-jre-alpine 作为基础镜像,这个镜像基于 Alpine Linux 并包含了 OpenJDK 8 的 Java 运行时环境(JRE)。Alpine Linux 是一个非常小巧的 Linux 发行版,这使得最终构建的 Docker 镜像体积较小。

  • WORKDIR /app:设置工作目录为 /app,后续的命令都将在这个目录下执行。

  • COPY target/demo_jar-0.0.1-SNAPSHOT.jar .:将本地构建生成的 demo_jar-0.0.1-SNAPSHOT.jar 文件复制到容器内的当前目录(即 /app)。

  • ENV ENVIROMENT=dev:设置环境变量 ENVIROMENT 的值为 dev,这个环境变量可能用于指定应用程序的运行环境,比如开发环境、测试环境或生产环境。

  • EXPOSE 8080:声明容器将在运行时监听 8080 端口,这使得外部可以通过这个端口访问容器内运行的应用程序。

  • ENTRYPOINT ["java", "-jar", "demo_jar-0.0.1-SNAPSHOT.jar", "--spring.profiles.active=${ENVIROMENT}"]:设置容器的入口点。当容器启动时,会执行 java -jar demo_jar-0.0.1-SNAPSHOT.jar --spring.profiles.active=${ENVIROMENT} 命令,即运行 demo_jar-0.0.1-SNAPSHOT.jar 这个 Java 应用程序,并通过 --spring.profiles.active=${ENVIROMENT} 参数激活对应名称的 Spring 配置文件,这里会使用前面设置的环境变量 ENVIROMENT 的值,即 dev。

构建镜像

使用上面的 Dockerfile 文件构建镜像:

root@g450:~/demo_jar# docker build -t demo_jar .
[+] Building 2.1s (8/8) FINISHED                                                                                                              docker:default
 => [internal] load build definition from Dockerfile                                                                                                    0.0s
 => => transferring dockerfile: 264B                                                                                                                    0.0s
 => [internal] load metadata for docker.io/library/openjdk:8-jre-alpine                                                                                 1.4s
 => [internal] load .dockerignore                                                                                                                       0.0s
 => => transferring context: 2B                                                                                                                         0.0s
 => CACHED [1/3] FROM docker.io/library/openjdk:8-jre-alpine@sha256:f362b165b870ef129cbe730f29065ff37399c0aa8bcab3e44b51c302938c9193                    0.0s
 => [internal] load build context                                                                                                                       0.1s
 => => transferring context: 84B                                                                                                                        0.0s
 => [2/3] WORKDIR /app                                                                                                                                  0.1s
 => [3/3] COPY target/demo_jar-0.0.1-SNAPSHOT.jar .                                                                                                     0.3s
 => exporting to image                                                                                                                                  0.3s
 => => exporting layers                                                                                                                                 0.2s
 => => writing image sha256:cb5f588c77acef4d4aab572970e4978063ff1cd19ac7949c7e7a301f5e1f5ea2                                                            0.0s
 => => naming to docker.io/library/demo_jar                                                                                                             0.0s

root@g450:~/demo_jar# docker images | grep demo_jar
demo_jar                        latest    1516f0743bb4   12 seconds ago   121MB

上面命令构建了一个名为 demo_jar 的镜像。

启动容器

使用 docker run 命令的 -e 选项设置环境变量,实现不同环境动态切换。

开发环境

root@g450:~/demo_jar# docker run --name demo_jar_dev -p 8081:8080 -e ENVIROMENT=dev -d demo_jar
e15bbf05418170af2c9cefe971187e43944ac8020ea9c7dd4e6486ace502cffa

访问 http://宿主机IP:8081/index 地址,如下图:

4fbfc062998d79948fb11835aaddfe72_1725290371598-97085df4-96a6-4a8a-9bb9-eb9a6a6291e3.png

测试环境

root@g450:~/demo_jar# docker run --name demo_jar_test -p 8082:8080 -e ENVIROMENT=test -d demo_jar
f4a22db6a39aebb8725c3e7dac4e58ee5ad1955cfc355b5d926a8f08ebc103bd

访问 http://宿主机IP:8082/index 地址,如下图:

d6f4785620b6db54b5db10b49952e745_1725290445438-57e777fb-ea13-4cd9-9c25-d08a1d0bb204.png

生产环境

root@g450:~/demo_jar# docker run --name demo_jar_prod -p 8083:8080 -e ENVIROMENT=prod -d demo_jar
85cdee8624d4705c1c03d29b903cac08d01c9d087d6ab513df8b59fbc222add3

访问 http://宿主机IP:8083/index 地址,如下图:

c2de5f791e80e873edfebfed26b29088_1725290468908-638c5976-8ba3-48f0-ae65-a645142e0ec7.png

点击学习开源企业 Docker 镜像仓库 Harbor 软件 教程。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号