Spring Boot3 应用打包成 Docker 镜像的全流程

B站影视 韩国电影 2025-08-06 05:14 1

摘要:在当今快速迭代的互联网软件开发领域,将 Spring Boot3 应用高效地打包成 Docker 镜像,对于实现敏捷部署、确保环境一致性以及提升应用的可维护性至关重要。今天,就为各位互联网软件开发人员详细拆解这一过程。

在当今快速迭代的互联网软件开发领域,将 Spring Boot3 应用高效地打包成 Docker 镜像,对于实现敏捷部署、确保环境一致性以及提升应用的可维护性至关重要。今天,就为各位互联网软件开发人员详细拆解这一过程。

在开始打包之旅前,要确保相关工具均已就位。首先,本地环境需安装好 Docker,它是构建和运行容器的基石。同时,项目若使用 Maven 进行构建管理,需确认 Maven 已正确配置,版本也需符合项目要求。对于 Spring Boot3 项目本身,务必保证其能在本地通过mvn clean package命令成功打包成 Jar 包,这是后续操作的基础。

开启 docker 远程访问:在使用此插件前,需要开启 docker 远程访问,这一步涉及到对 docker 配置的修改,通过配置dockerHost地址,让插件能够与 docker 守护进程通信。比如设置dockerHost为http://192.168.0.1:2375,但在实际应用中,请根据自身网络环境和安全需求谨慎设置。

编写 Dockerfile:在项目根目录下创建 Dockerfile 文件,其内容大致如下:

FROM openjdk:17 - jdk - alpine MAINTAINER chengxuyuanshitang RUN mkdir -p /workspace/Java/demo COPY target /demo.Jar /workspace/java/demo/demo.jar ENTRYPOINT (" java", " -Djava.security.egd=file:/dev/./urandom", " -jar", "/workspace/java/demo/demo.jar") CMD (" --spring.profiles.active=test") EXPOSE 8080

这里对各指令详细解释:

FROM指令用于指定基础镜像,在此选择了openjdk:17 - jdk - alpine,它是基于 Alpine Linux 的 OpenJDK 17 镜像,体积小巧且能满足 Java 应用运行需求。之所以选择它,是因为 Alpine Linux 具有轻量级、安全性高的特点,可有效减少镜像体积,提升部署效率。MAINTAINER指令声明镜像维护者信息,方便后续维护与沟通。RUN指令用于在镜像构建过程中执行命令,这里创建了/workspace/java/demo目录,用于存放应用相关文件。COPY指令将本地项目打包生成的demo.jar文件复制到镜像内的/workspace/java/demo目录下。它与ADD指令类似,但ADD指令支持自动解压缩,不过会使构建镜像时的缓存失效,导致构建速度变慢,因此在不需要自动解压缩功能时,官方推荐使用COPY指令。ENTRYPOINT指令指定容器启动时执行的命令,这里设置为运行demo.jar。与CMD指令类似,CMD指令也用于指定容器启动命令,但 Dockerfile 中只能有一条CMD指令生效,而ENTRYPOINT在运行时可被docker run的--entrypoint参数替代。如果docker run跟在镜像名后面的参数,对于CMD来说是替换默认值,对于ENTRYPOINT则是添加在其后面的参数。CMD指令在此处设置了 Spring Boot 应用的运行时参数,指定激活test配置文件。EXPOSE指令通知 Docker 容器在运行时侦听 8080 端口,方便外部访问应用服务。

POM.XML 文件配置:在项目的pom.xml文件中添加docker - maven - plugin插件配置:

org.springframework.bootspring - boot - maven - plugin

com.spotifydocker - maven - plugin1.2.2build - image

package

buildhttp://192.168.0.1:2375${project.artifactId}${project.version}${project.basedir}

标签定义了插件的执行时机,这里将build目标绑定到package阶段,意味着执行mvn package命令时,插件会自动构建镜像。

标签内配置了关键信息,如dockerHost指定远程 Docker API 地址,imageName定义生成镜像的名称,imageTags设置镜像标签,dockerDirectory指定 Dockerfile 所在目录。

maven 打包:在项目根目录下执行mvn package命令,Maven 会先按照项目配置进行编译、测试等常规操作,生成 Jar 包,然后触发docker - maven - plugin插件构建 Docker 镜像。构建完成后,可通过docker images命令查看本地生成的镜像。

(二)基于自定义基础镜像构建

假设服务采用的是 JDK 21 和 Spring Boot 3.1.0 版本。

构建基础镜像:基于ubuntu构建一个 JDK 版本为 21 的基础镜像。将openjdk - 21.0.2_linux - x64_bin.tar.gz拷贝到 Dockerfile 的同级目录下,执行命令docker build - t xj/jdk:21.0.2.构建基础镜像。之所以选择ubuntu作为基础,是因为它具有丰富的软件包资源和良好的社区支持,便于后续安装和配置其他依赖。

编写服务镜像的 Dockerfile:内容如下:

ENV TZ = Asia / Shanghai \ SERVER_DIR = /home/app/ RUN mkdir -p $SERVER_DIR \&& chmod -R 777 $SERVER_DIR # 拷贝文件到容器ADD./snowflake - 0.0.1.zip $SERVER_DIRRUN unzip /home/app/snowflake - 0.0.1.zip -d $SERVER_DIR \&& chmod +x /home/app/start.sh# 设置工作目录WORKDIR $SERVER_DIRCMD ("/home/app/start.sh","run")

这里通过ENV指令设置了时区和服务目录,使用RUN指令创建目录并赋予权限,ADD指令拷贝打包后的zip文件到容器内,再解压并设置启动脚本权限,WORKDIR指定工作目录,CMD设置容器启动时执行的命令。

构建服务镜像:将打包后的zip文件snowflake - 0.0.1.zip拷贝到 Dockerfile 的同级目录下,执行命令docker build - t xj/snowflake:1.0.0.构建服务镜像。构建成功后可以使用docker images命令查看构建后的镜像。

创建部署目录和文件:首先在服务器上创建一个部署目录snowflake,在该目录下创建docker - compose.yml文件。

配置挂载目录:在部署目录下创建挂载目录data,将打包后的服务文件snowflake - 0.0.1.zip拷贝到挂载目录中并解压。这里将整个部署目录/home/app挂载到了宿主机,这样后续如果需要修改配置文件等一些静态文件的话直接修改,完了重启服务就可以了,不用重新构建镜像。

启动容器:在docker - compose.yml同级目录下使用命令docker - compose up - d启动容器,如果不出意外,服务就启动成功了。需要注意的是,如果以前是直接在服务器上部署服务,注意start.sh启动脚本,一般都是使用nohup后台启动的,而 Docker 容器中默认的主进程如果退出,容器就会停止运行。所以如果使用 docker 启动服务的话一定要前台启动。

通过以上步骤,我们实现了将 Spring Boot3 应用打包成 Docker 镜像并进行部署的全过程。Docker 使得应用的部署变得更加简单和一致,无论是在本地开发环境还是在生产环境,都能保证应用的可靠运行。希望这篇文章能帮助各位开发者在工作中更高效地完成相关任务,让我们一起在互联网软件开发的道路上不断前行。

来源:从程序员到架构师一点号

相关推荐