构建Docker镜像:dromara/mybatis-jpa-extra应用容器化部署指南
dromara/mybatis-jpa-extra是一个简化MyBatis CUID操作、增强SELECT分页查询的开源项目。本指南将详细介绍如何将该应用容器化,通过Docker实现便捷部署和运行。
项目概述
dromara/mybatis-jpa-extra项目旨在简化MyBatis的使用,提供了JPA风格的注解支持、增强的查询功能以及便捷的数据操作方法。项目结构清晰,主要包含以下模块:
- mybatis-jpa-extra:核心功能模块,提供JPA注解支持、查询构造器、分页等功能
- mybatis-jpa-extra-spring-boot-starter:Spring Boot自动配置模块
- mybatis-jpa-extra-test:测试模块,包含DAO、Service和实体类示例
- mybatis-jpa-extra-spring-boot-starter-test:Spring Boot集成测试模块
环境准备
在开始容器化之前,请确保已安装以下工具:
- Docker Engine (20.10.x或更高版本)
- Docker Compose (可选,用于多容器部署)
- Git
- JDK 17 (用于本地构建)
- Maven 3.6+ (用于本地构建)
项目使用Java 17和Spring Boot 3.4.2构建,详细依赖信息可查看pom.xml文件。
容器化方案设计
部署架构
采用多阶段构建策略,将应用构建和运行环境分离,最终生成轻量级镜像。部署架构如下:
基础镜像选择
根据项目使用的JDK版本,选择合适的基础镜像:
- 构建阶段:maven:3.8.5-openjdk-17-slim
- 运行阶段:eclipse-temurin:17-jre-alpine
Alpine版本的JRE镜像体积更小,适合生产环境使用。
Dockerfile编写
在项目根目录创建Dockerfile,实现多阶段构建:
# 构建阶段
FROM maven:3.8.5-openjdk-17-slim AS build
WORKDIR /app
COPY pom.xml .
# 缓存Maven依赖
RUN mvn dependency:go-offline -B
COPY . .
# 执行构建
RUN mvn package -DskipTests
# 运行阶段
FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
# 复制构建产物
COPY --from=build /app/mybatis-jpa-extra-spring-boot-starter-test/target/*.jar app.jar
# 暴露应用端口
EXPOSE 8080
# 启动命令
ENTRYPOINT ["java", "-jar", "app.jar"]
关键构建步骤说明
- 多阶段构建:使用Maven镜像构建项目,然后将产物复制到轻量级JRE镜像中,减小最终镜像体积
- 依赖缓存:单独处理pom.xml,利用Docker层缓存机制加速后续构建
- 测试跳过:构建时使用
-DskipTests参数跳过测试,加快构建速度 - Alpine镜像:运行阶段使用Alpine基础镜像,减小镜像体积
构建脚本编写
为简化构建过程,创建build-docker.sh脚本:
#!/bin/bash
# 构建Docker镜像
docker build -t dromara/mybatis-jpa-extra:latest .
# 可选:标记版本号,版本号从pom.xml中提取
VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
docker tag dromara/mybatis-jpa-extra:latest dromara/mybatis-jpa-extra:${VERSION}
echo "构建完成:"
echo "dromara/mybatis-jpa-extra:latest"
echo "dromara/mybatis-jpa-extra:${VERSION}"
给脚本添加执行权限:
chmod +x build-docker.sh
配置文件处理
为使容器化应用更灵活,需要外部化配置。创建docker-compose.yml文件:
version: '3.8'
services:
mybatis-jpa-extra:
build: .
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=prod
- SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/test?autoReconnect=true&characterEncoding=UTF-8&serverTimezone=UTC
- SPRING_DATASOURCE_USERNAME=root
- SPRING_DATASOURCE_PASSWORD=password
- SPRING_DATASOURCE_DRIVER_CLASS_NAME=com.mysql.cj.jdbc.Driver
depends_on:
- mysql
volumes:
- ./config:/app/config
mysql:
image: mysql:8.0
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_DATABASE=test
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data:
配置说明
- 环境变量:通过
environment配置数据库连接信息,避免硬编码 - 配置文件挂载:通过
volumes挂载外部配置目录,方便配置修改 - 依赖服务:使用Docker Compose管理MySQL依赖,实现一键部署
应用打包与优化
Maven打包配置
项目使用Maven构建,查看pom.xml中的构建配置,确保打包正确:
<build>
<plugins>
<!-- Maven Surefire插件,用于单元测试 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.4.2</version>
</plugin>
<!-- 源码打包插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<id>ossrh</id>
<phase>package</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
应用入口类
Spring Boot应用入口类位于mybatis-jpa-extra-spring-boot-starter-test/src/test/java/org/dromara/mybatis/jpa/test/MybatisJpaApplication.java,确保正确配置了@SpringBootApplication和@MapperScan注解:
@SpringBootApplication
@MapperScan("org.dromara.mybatis.jpa.test.dao.persistence")
public class MybatisJpaApplication implements ApplicationRunner {
// 应用代码...
}
镜像构建与测试
执行构建
运行构建脚本:
./build-docker.sh
本地测试运行
使用Docker Compose启动应用:
docker-compose up -d
查看应用日志:
docker-compose logs -f mybatis-jpa-extra
测试应用是否正常运行:
curl http://localhost:8080/actuator/health
镜像优化策略
减小镜像体积
- 多阶段构建:已在Dockerfile中实现,分离构建和运行环境
- 基础镜像选择:运行阶段使用alpine版本JRE
- 清理无用文件:构建过程中删除不必要的文件和依赖
优化Dockerfile
# 优化后的运行阶段
FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
# 添加非root用户
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
# 复制构建产物
COPY --from=build /app/mybatis-jpa-extra-spring-boot-starter-test/target/*.jar app.jar
# 暴露应用端口
EXPOSE 8080
# JVM参数优化
ENTRYPOINT ["java", "-XX:+UseContainerSupport", "-XX:MaxRAMPercentage=75.0", "-jar", "app.jar"]
优化说明:
- 添加非root用户,提高容器安全性
- 配置JVM参数,适应容器环境内存限制
部署策略
单机部署
使用Docker Compose一键部署:
docker-compose up -d
多环境部署
通过环境变量区分不同环境配置:
# 开发环境
SPRING_PROFILES_ACTIVE=dev docker-compose up -d
# 测试环境
SPRING_PROFILES_ACTIVE=test docker-compose up -d
# 生产环境
SPRING_PROFILES_ACTIVE=prod docker-compose up -d
容器编排平台部署
对于Kubernetes等容器编排平台,可创建对应的Deployment和Service配置:
# deployment.yaml示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: mybatis-jpa-extra
spec:
replicas: 3
selector:
matchLabels:
app: mybatis-jpa-extra
template:
metadata:
labels:
app: mybatis-jpa-extra
spec:
containers:
- name: mybatis-jpa-extra
image: dromara/mybatis-jpa-extra:latest
ports:
- containerPort: 8080
env:
- name: SPRING_PROFILES_ACTIVE
value: "prod"
- name: SPRING_DATASOURCE_URL
valueFrom:
secretKeyRef:
name: db-secret
key: url
常见问题解决
构建失败
- 依赖下载问题:检查网络连接,或配置Maven镜像源
- JDK版本不匹配:确保使用JDK 17,与项目配置一致
运行时问题
- 数据库连接失败:检查数据库地址、用户名和密码配置
- 端口冲突:修改Docker映射端口,避免与主机其他服务冲突
性能问题
- JVM内存配置:根据容器资源限制,调整JVM参数
- 数据库连接池:优化数据库连接池配置,参考application.properties
总结
通过本文档,我们学习了如何将dromara/mybatis-jpa-extra应用容器化,包括Dockerfile编写、多阶段构建、镜像优化和部署策略。容器化部署可以有效解决环境一致性问题,简化部署流程,提高应用可移植性。
项目的更多使用方法可参考README.md文件,包含了详细的API使用示例和配置说明。
附录:常用Docker命令
| 命令 | 说明 |
|---|---|
docker build -t <name>:<tag> . | 构建镜像 |
docker run -p 8080:8080 <name>:<tag> | 运行容器 |
docker ps | 查看运行中的容器 |
docker logs -f <container-id> | 查看容器日志 |
docker-compose up -d | 启动服务栈 |
docker-compose down | 停止服务栈 |
docker images | 列出本地镜像 |
docker rmi <image-id> | 删除镜像 |
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




