Skip to main content

Docker 部署spring boot

首先我们知道Java是在JVM上运行,然后就是springboot是一个Java开发框架,那么意味着springboot也是在JVM上进行

那么使用docker部署spring boot我们就很明确进行的步骤就是搭建一个运行环境(在docker中就是容器),其次就是我如何运行这个程序,显然我们需要打包我们的程序,目前行业通用做法是打包成war包和jar包

war包和jar包

特点JARWAR
目的Java 应用程序和库Web 应用程序
包含内容Java 类、资源、清单文件JSP、Servlet、HTML、CSS、JavaScript、配置文件、依赖项
目录结构可以包含WEB-INF 目录,但不是必须的必须包含WEB-INF 目录
部署可执行的Java 应用程序部署到Web 容器
命令示例jar cvf myapp.jar myappjar cvf myweb.war .

Springboot中集成了Tomcat服务器,也就意味着在JRE运行环境中可以直接启动

通过docker-maven-plugin构建镜像

这里使用的是最为常用的maven构建,由spofity开源,具体可以看Github - docker-maven-plugin

步骤操作内容示例/说明
1️⃣添加插件依赖pom.xml<build> 部分添加 docker-maven-plugin 插件
2️⃣编写 Dockerfile在项目根目录下创建 Dockerfile 文件
3️⃣配置插件参数设置镜像名、构建上下文、Dockerfile 路径等
4️⃣构建项目并打包镜像使用 mvn package docker:build 构建镜像
5️⃣验证镜像是否构建成功使用 docker images 查看
6️⃣可选:推送到远程仓库配置远程仓库地址,执行 docker:push

目前我使用的是https://dmp.fabric8.io/

<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.38.0</version>

<!-- 将 docker 镜像构建绑定到 package 阶段 -->
<executions>
<execution>
<id>build-image</id>
<phase>package</phase> <!-- 在 maven package 时执行 -->
<goals>
<goal>build</goal> <!-- 触发 docker 构建 -->
</goals>
</execution>
</executions>

<configuration>
<!-- 镜像名称(包含镜像名和版本) -->
<images>
<image>
<name>mall/xxx:${project.version}</name> <!-- eg: mall/xxx:1.0.0 -->

<build>
<!-- 基础镜像 -->
<from>openjdk:17</from>

<!-- 将本地编译后的 jar 包复制进镜像 -->
<assembly>
<descriptorRef>artifact</descriptorRef> <!-- 自动包含 target 目录下的主 jar -->
</assembly>

<!-- 容器启动命令入口 -->
<entryPoint>
<arg>java</arg>
<arg>-jar</arg>
<arg>-Dspring.profiles.active=prod</arg> <!-- 指定 spring 启动配置 -->
<arg>/maven/${project.build.finalName}.jar</arg> <!-- jar 包路径 -->
</entryPoint>
</build>
</image>
</images>
</configuration>
</plugin>

相关容器编排dockercompose

version: '3.8'

services:
# 应用服务(Spring Boot)
app:
image: mall/xxx:1.0.0 # 使用你通过 Maven 构建的镜像名
container_name: mall-app # 容器名称
restart: always # 当容器异常退出时自动重启
ports:
- "8080:8080" # 映射容器 8080 端口到宿主机
environment:
# JVM 启动参数(容器中生效,用于内存调优)
- JAVA_OPTS=-Xms512m -Xmx1024m -XX:+UseG1GC -XX:MaxMetaspaceSize=256m

# Spring Boot 的运行环境配置(可选)
- SPRING_PROFILES_ACTIVE=prod

# 设置容器的时区
- TZ=Asia/Shanghai
# 入口命令,使用环境变量中的 JVM 参数启动 jar 包
command: sh -c "java $JAVA_OPTS -jar /maven/xxx.jar"
depends_on:
- mysql # 依赖 mysql 服务,先启动
- redis # 依赖 redis 服务,先启动

# MySQL 数据库服务
mysql:
image: mysql:8.0
container_name: mall-mysql
restart: always
ports:
- "3306:3306" # 映射 MySQL 端口
environment:
MYSQL_ROOT_PASSWORD: root # MySQL root 密码
MYSQL_DATABASE: mall # 初始化数据库
TZ: Asia/Shanghai # 设置 MySQL 容器时区
volumes:
- mysql_data:/var/lib/mysql # 数据卷挂载,实现数据持久化

# Redis 缓存服务
redis:
image: redis:6.2
container_name: mall-redis
restart: always
ports:
- "6379:6379" # 映射 Redis 端口
volumes:
- redis_data:/data # Redis 数据持久化挂载

# 数据卷定义(用于持久化 MySQL 和 Redis 数据)
volumes:
mysql_data:
redis_data: