SpringReport Docker部署:容器化方案

SpringReport Docker部署:容器化方案

【免费下载链接】springreport SpringReport是一款企业级的报表系统,支持在线设计报表,并绑定动态数据源,无需写代码即可快速生成想要的报表,可以支持excel报表和word报表两种格式,同时还可以支持excel多人协同编辑 【免费下载链接】springreport 项目地址: https://gitcode.com/caiyangyang007/springreport

概述

SpringReport作为一款企业级报表系统,支持在线设计Excel和Word报表,通过Docker容器化部署可以显著提升部署效率、环境一致性和系统可维护性。本文将详细介绍SpringReport的Docker容器化部署方案,涵盖前后端分离架构的完整部署流程。

技术架构分析

SpringReport采用典型的前后端分离架构:

mermaid

核心组件依赖

组件版本作用
Java1.8+后端运行环境
Node.js16+/18+前端构建环境
MySQL5.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. 多容器微服务部署模式

适用于生产环境,各组件独立部署:

mermaid

详细部署步骤

步骤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_ACTIVEdockerSpring环境配置
SPRING_DATASOURCE_URLjdbc:mysql://mysql:3306/springreport数据库连接
SPRING_REDIS_HOSTredisRedis主机
MQ_NAME_SERVERmq: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 >

【免费下载链接】springreport SpringReport是一款企业级的报表系统,支持在线设计报表,并绑定动态数据源,无需写代码即可快速生成想要的报表,可以支持excel报表和word报表两种格式,同时还可以支持excel多人协同编辑 【免费下载链接】springreport 项目地址: https://gitcode.com/caiyangyang007/springreport

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值