SpringReport Docker部署:容器化方案
概述
SpringReport作为一款企业级报表系统,支持在线设计Excel和Word报表,通过Docker容器化部署可以显著提升部署效率、环境一致性和系统可维护性。本文将详细介绍SpringReport的Docker容器化部署方案,涵盖前后端分离架构的完整部署流程。
技术架构分析
SpringReport采用典型的前后端分离架构:
核心组件依赖
| 组件 | 版本 | 作用 |
|---|---|---|
| Java | 1.8+ | 后端运行环境 |
| Node.js | 16+/18+ | 前端构建环境 |
| MySQL | 5.7+ | 主数据库 |
| Redis | 最新版 | 缓存和会话管理 |
| 消息队列 | 2.3.0+ | 消息处理 |
Docker部署方案设计
1. 单容器部署模式
适用于开发测试环境,将所有服务部署在单个容器中:
# Dockerfile.all-in-one
FROM openjdk:8-jdk-alpine
# 安装Node.js和构建工具
RUN apk add --no-cache nodejs npm
# 设置工作目录
WORKDIR /app
# 复制后端代码
COPY SpringReport/ ./
# 复制前端代码
COPY SpringReport-ui-vue2/ ./frontend-vue2
COPY SpringReport-ui-vue3/ ./frontend-vue3
# 构建前端
RUN cd frontend-vue2 && npm install && npm run build:prod
RUN cd frontend-vue3 && npm install && npm run build
# 构建后端
RUN mvn clean package -DskipTests
# 暴露端口
EXPOSE 9099 8080
# 启动脚本
CMD ["java", "-jar", "web/target/springreport-web.jar"]
2. 多容器微服务部署模式
适用于生产环境,各组件独立部署:
详细部署步骤
步骤1:准备Docker环境
# 安装Docker和Docker Compose
sudo apt-get update
sudo apt-get install docker.io docker-compose
# 验证安装
docker --version
docker-compose --version
步骤2:创建Docker编排文件
创建docker-compose.yml文件:
version: '3.8'
services:
# MySQL数据库
mysql:
image: mysql:8.0
container_name: springreport-mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: springreport
MYSQL_USER: report
MYSQL_PASSWORD: report
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
- ./sql脚本和其他/mysql脚本/springreport.sql:/docker-entrypoint-initdb.d/springreport.sql
restart: unless-stopped
# Redis缓存
redis:
image: redis:alpine
container_name: springreport-redis
ports:
- "6379:6379"
volumes:
- redis_data:/data
restart: unless-stopped
# 消息队列
mq:
image: message-queue:5.1.3
container_name: springreport-mq
ports:
- "9876:9876"
volumes:
- mq_data:/home/mq/store
restart: unless-stopped
# 后端应用
backend:
build:
context: .
dockerfile: Dockerfile.backend
container_name: springreport-backend
ports:
- "9099:9099"
environment:
- SPRING_PROFILES_ACTIVE=docker
- SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/springreport
- SPRING_REDIS_HOST=redis
- MQ_NAME_SERVER=mq:9876
depends_on:
- mysql
- redis
- mq
restart: unless-stopped
# 前端服务 (Vue2)
frontend-vue2:
build:
context: .
dockerfile: Dockerfile.frontend-vue2
container_name: springreport-frontend-vue2
ports:
- "9527:80"
restart: unless-stopped
# 前端服务 (Vue3)
frontend-vue3:
build:
context: .
dockerfile: Dockerfile.frontend-vue3
container_name: springreport-frontend-vue3
ports:
- "8089:80"
restart: unless-stopped
# Nginx反向代理
nginx:
image: nginx:alpine
container_name: springreport-nginx
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./ssl:/etc/nginx/ssl
depends_on:
- frontend-vue2
- frontend-vue3
- backend
restart: unless-stopped
volumes:
mysql_data:
redis_data:
mq_data:
步骤3:创建后端Dockerfile
创建Dockerfile.backend:
FROM openjdk:8-jdk-alpine
# 设置时区
RUN apk add --no-cache tzdata && \
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo "Asia/Shanghai" > /etc/timezone
# 创建应用目录
WORKDIR /app
# 复制Maven包装器
COPY mvnw .
COPY .mvn .mvn
# 复制pom文件
COPY SpringReport/pom.xml .
COPY SpringReport/common/pom.xml common/
COPY SpringReport/data/pom.xml data/
COPY SpringReport/pojo/pom.xml pojo/
COPY SpringReport/service/pom.xml service/
COPY SpringReport/web/pom.xml web/
# 下载依赖
RUN ./mvnw dependency:go-offline -B
# 复制源码
COPY SpringReport/src ./src
COPY SpringReport/common/src ./common/src
COPY SpringReport/data/src ./data/src
COPY SpringReport/pojo/src ./pojo/src
COPY SpringReport/service/src ./service/src
COPY SpringReport/web/src ./web/src
# 构建应用
RUN ./mvnw package -DskipTests
# 暴露端口
EXPOSE 9099
# 启动应用
ENTRYPOINT ["java", "-jar", "web/target/springreport-web.jar"]
步骤4:创建前端Dockerfile
创建Dockerfile.frontend-vue2:
FROM node:18-alpine as builder
WORKDIR /app
# 复制前端代码
COPY SpringReport-ui-vue2/ .
# 安装依赖并构建
RUN npm install --registry=https://registry.npmmirror.com
RUN npm run build:prod
# 生产环境
FROM nginx:alpine
# 复制构建结果
COPY --from=builder /app/dist /usr/share/nginx/html
# 复制nginx配置
COPY nginx-vue2.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
创建Dockerfile.frontend-vue3:
FROM node:18-alpine as builder
WORKDIR /app
# 复制前端代码
COPY SpringReport-ui-vue3/ .
# 安装依赖并构建
RUN npm install --registry=https://registry.npmmirror.com
RUN npm run build
# 生产环境
FROM nginx:alpine
# 复制构建结果
COPY --from=builder /app/dist /usr/share/nginx/html
# 复制nginx配置
COPY nginx-vue3.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
步骤5:创建Nginx配置
创建nginx.conf:
events {
worker_connections 1024;
}
http {
upstream backend {
server backend:9099;
}
upstream frontend-vue2 {
server frontend-vue2:80;
}
upstream frontend-vue3 {
server frontend-vue3:80;
}
# Vue2前端服务
server {
listen 80;
server_name vue2.springreport.local;
location / {
proxy_pass http://frontend-vue2;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# 后端API代理
location /api/ {
proxy_pass http://backend/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
# Vue3前端服务
server {
listen 80;
server_name vue3.springreport.local;
location / {
proxy_pass http://frontend-vue3;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location /api/ {
proxy_pass http://backend/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
# 默认服务
server {
listen 80 default_server;
server_name _;
location / {
return 301 http://vue2.springreport.local;
}
}
}
步骤6:创建环境配置文件
创建application-docker.properties:
# Docker环境配置
server.port=9099
management.server.port=9016
# 文件存储路径(使用容器内路径)
file.path=/app/files/
file.url.prefix=http://localhost:9099/images/
# 数据库配置(使用Docker服务名)
spring.datasource.url=jdbc:mysql://mysql:3306/springreport?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false
spring.datasource.username=report
spring.datasource.password=report
# Redis配置
spring.redis.host=redis
spring.redis.port=6379
spring.redis.database=2
# 消息队列配置
mq.name-server=mq:9876
# 日志配置
logging.path=/app/logs
logging.level.root=INFO
# 跨域配置(Docker环境)
cors.allowed.origins=*
cors.allowed.methods=GET,POST,PUT,DELETE,OPTIONS
步骤7:部署和启动
# 构建并启动所有服务
docker-compose up -d --build
# 查看服务状态
docker-compose ps
# 查看日志
docker-compose logs -f backend
# 停止服务
docker-compose down
# 带数据卷停止
docker-compose down -v
环境变量配置
核心环境变量
| 环境变量 | 默认值 | 说明 |
|---|---|---|
| SPRING_PROFILES_ACTIVE | docker | Spring环境配置 |
| SPRING_DATASOURCE_URL | jdbc:mysql://mysql:3306/springreport | 数据库连接 |
| SPRING_REDIS_HOST | redis | Redis主机 |
| MQ_NAME_SERVER | mq:9876 | 消息队列地址 |
| FILE_PATH | /app/files/ | 文件存储路径 |
数据库初始化
创建数据库初始化脚本init-db.sh:
#!/bin/bash
# 等待MySQL服务启动
echo "等待MySQL服务启动..."
while ! nc -z mysql 3306; do
sleep 1
done
echo "MySQL服务已启动,开始初始化数据库..."
# 执行SQL脚本
mysql -h mysql -u root -proot springreport < /docker-entrypoint-initdb.d/springreport.sql
echo "数据库初始化完成!"
监控和运维
健康检查配置
在docker-compose.yml中添加健康检查:
services:
backend:
# ... 其他配置
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9099/actuator/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
mysql:
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 30s
timeout: 10s
retries: 5
redis:
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 30s
timeout: 10s
retries: 5
日志管理
配置日志收集和监控:
# 查看实时日志
docker-compose logs -f
# 导出日志
docker-compose logs > springreport-logs-$(date +%Y%m%d).log
# 使用ELK栈进行日志分析(可选)
# 集成Filebeat或Fluentd进行日志收集
性能优化建议
1. 资源限制
在`docker-compose.yml中配置资源限制:
services:
backend:
deploy:
resources:
limits:
cpus: '2'
memory: 2G
reservations:
cpus: '1'
memory: 1G
mysql:
deploy:
resources:
limits:
cpus: '2'
memory: 4G
reservations:
cpus: '1'
memory: 2G
2. JVM调优
在Dockerfile中添加JVM参数:
# 优化JVM参数
ENV JAVA_OPTS="-Xms1g -Xmx2g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:ParallelGCThreads=4 -XX:ConcGCThreads=2"
CMD ["java", "$JAVA_OPTS", "-jar", "web/target/springreport-web.jar"]
3. 数据库连接池优化
在application-docker.properties中配置:
# 连接池配置
spring.datasource.druid.initial-size=5
spring.datasource.druid.min-idle=5
spring.datasource.druid.max-active=20
spring.datasource.druid.max-wait=60000
spring.datasource.druid.time-between-eviction-runs-millis=60000
spring.datasource.druid.min-evictable-idle-time-millis=300000
常见问题排查
1. 容器启动失败
# 查看容器日志
docker logs springreport-backend
# 进入容器调试
docker exec -it springreport-backend sh
# 检查网络连通性
docker exec springreport-backend ping mysql
2. 数据库连接问题
# 检查MySQL容器状态
docker exec springreport-mysql mysql -uroot -proot -e "SHOW DATABASES;"
# 检查表结构
docker exec springreport-mysql mysql -ureport -preport springreport -e "SHOW TABLES;"
3. 前端资源加载问题
# 检查Nginx配置
docker exec springreport-nginx nginx -t
# 查看前端容器文件
docker exec springreport-frontend-vue2 ls -la /usr/share/nginx/html
安全配置
1. 网络安全
# 在docker-compose.yml中配置网络
networks:
springreport-net:
driver: bridge
internal: true # 内部网络,不暴露到宿主机
services:
backend:
networks:
- springreport-net
# 只有Nginx暴露到外部
nginx:
networks:
- springreport-net
- default
2. SSL证书配置
创建SSL目录并配置Nginx:
# 创建SSL证书目录
mkdir -p ssl
# 生成自签名证书(生产环境使用正式证书)
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout ssl/springreport.key -out ssl/springreport.crt
更新Nginx配置支持HTTPS:
server {
listen 443 ssl;
server_name vue2.springreport.local;
ssl_certificate /etc/nginx/ssl/springreport.crt;
ssl_certificate_key /etc/nginx/ssl/springreport.key;
# SSL配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
location / {
proxy_pass http://frontend-vue2;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
备份和恢复
1. 数据库备份
创建备份脚本backup.sh:
#!/bin/bash
# 备份数据库
docker exec springreport-mysql mysqldump -ureport -preport springreport >
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



