容器化部署RuoYi-Vue-Plus全栈解决方案:从零到生产的Docker Compose实践

在当今快速迭代的开发环境中,传统的手动部署方式正逐渐被容器化技术所取代。对于采用前后端分离架构的RuoYi-Vue-Plus这类企业级快速开发框架而言,Docker Compose提供了一种优雅的解决方案——它不仅能将复杂的依赖关系简化为声明式配置,更能确保开发、测试和生产环境的高度一致性。本文将深入探讨如何通过容器化技术,在30分钟内完成从零开始到完整可用的RuoYi-Vue-Plus环境部署。

1. 环境规划与准备工作

在开始容器化部署之前,合理的环境规划是成功的第一步。与传统部署方式不同,容器化方案需要考虑网络拓扑、存储卷映射、服务依赖关系等特殊因素。

基础环境要求

  • Docker Engine ≥ 20.10.14(需支持Compose V2格式)
  • 可用磁盘空间 ≥ 5GB(包含镜像层和持久化数据)
  • 内存 ≥ 4GB(建议8GB以上以获得流畅体验)

提示:在Windows/macOS上建议使用Docker Desktop,Linux环境下需单独安装docker-compose插件

验证Docker环境是否就绪:

docker --version
docker-compose version

对于国内用户,推荐配置镜像加速以提升拉取效率。创建或修改 /etc/docker/daemon.json

{
  "registry-mirrors": [
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
  ]
}

2. 编写Docker Compose编排文件

容器化部署的核心在于精心设计的 docker-compose.yml 文件。我们将采用多服务架构,确保各组件既能独立运行又可协同工作。

创建项目目录结构:

ruoyi-docker/
├── compose/
│   ├── mysql/
│   │   └── init/          # 初始化SQL脚本
│   ├── redis/
│   │   └── redis.conf     # Redis自定义配置
│   └── ruoyi/
│       ├── apps/          # 应用jar包目录
│       └── config/        # 应用配置文件
└── docker-compose.yml

完整的 docker-compose.yml 配置示例:

version: '3.8'

services:
  mysql:
    image: mysql:8.0.32
    container_name: ruoyi-mysql
    environment:
      MYSQL_ROOT_PASSWORD: RuoYi@123
      MYSQL_DATABASE: ry_vue_plus
      TZ: Asia/Shanghai
    volumes:
      - ./compose/mysql/data:/var/lib/mysql
      - ./compose/mysql/init:/docker-entrypoint-initdb.d
    ports:
      - "3306:3306"
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 5s
      timeout: 10s
      retries: 3

  redis:
    image: redis:7.0.11
    container_name: ruoyi-redis
    volumes:
      - ./compose/redis/data:/data
      - ./compose/redis/redis.conf:/usr/local/etc/redis/redis.conf
    command: redis-server /usr/local/etc/redis/redis.conf
    ports:
      - "6379:6379"
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 5s
      timeout: 3s
      retries: 5

  ruoyi-backend:
    build:
      context: .
      dockerfile: Dockerfile.backend
    container_name: ruoyi-backend
    depends_on:
      mysql:
        condition: service_healthy
      redis:
        condition: service_healthy
    volumes:
      - ./compose/ruoyi/apps:/app
      - ./compose/ruoyi/config:/config
    ports:
      - "8080:8080"
    environment:
      SPRING_PROFILES_ACTIVE: dev
    restart: unless-stopped

  ruoyi-frontend:
    build:
      context: .
      dockerfile: Dockerfile.frontend
    container_name: ruoyi-frontend
    ports:
      - "80:80"
    depends_on:
      - ruoyi-backend
    restart: unless-stopped

关键配置解析:

  • 服务依赖管理 :通过 depends_on + healthcheck 确保启动顺序
  • 数据持久化 :所有关键数据通过volume映射到宿主机
  • 时区统一 :所有容器强制使用Asia/Shanghai时区
  • 资源隔离 :每个服务运行在独立容器中

3. 构建自定义镜像与配置优化

标准镜像往往不能满足特定需求,我们需要为前后端分别构建定制化镜像。

后端Dockerfile(Dockerfile.backend)

FROM eclipse-temurin:11-jdk-focal

WORKDIR /app

# 安装必要工具
RUN apt-get update && apt-get install -y \
    wait-for-it \
    && rm -rf /var/lib/apt/lists/*

# 复制构建好的jar包
COPY compose/ruoyi/apps/ruoyi-admin.jar /app/ruoyi-admin.jar
COPY compose/ruoyi/config/application-dev.yml /config/application-dev.yml

# 健康检查
HEALTHCHECK --interval=30s --timeout=3s \
    CMD curl -f http://localhost:8080/ || exit 1

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "/app/ruoyi-admin.jar", "--spring.config.location=/config/application-dev.yml"]

前端Dockerfile(Dockerfile.frontend)

FROM nginx:1.23.3-alpine

# 删除默认配置
RUN rm -rf /etc/nginx/conf.d/*

# 复制构建产物和自定义配置
COPY compose/ruoyi/ui/dist /usr/share/nginx/html
COPY compose/ruoyi/config/nginx.conf /etc/nginx/conf.d/ruoyi.conf

# 设置时区
RUN apk add --no-cache tzdata \
    && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo "Asia/Shanghai" > /etc/timezone

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

MySQL初始化脚本 (compose/mysql/init/01_schema.sql):

CREATE USER 'ruoyi'@'%' IDENTIFIED BY 'RuoYi@123';
GRANT ALL PRIVILEGES ON ry_vue_plus.* TO 'ruoyi'@'%';
FLUSH PRIVILEGES;

Redis自定义配置 (compose/redis/redis.conf):

bind 0.0.0.0
protected-mode no
daemonize no
requirepass RuoYi@123
timeout 0
tcp-keepalive 300

4. 部署流程与运维管理

完整的部署过程可分为准备、构建、运行三个阶段,每个阶段都有其最佳实践。

阶段一:准备构建产物

  1. 克隆项目仓库:
    git clone https://gitee.com/JavaLionLi/RuoYi-Vue-Plus.git
    
  2. 后端构建:
    cd RuoYi-Vue-Plus
    mvn clean package -DskipTests
    cp ruoyi-admin/target/ruoyi-admin.jar ../ruoyi-docker/compose/ruoyi/apps/
    
  3. 前端构建:
    cd ruoyi-ui
    npm install --registry=https://registry.npm.taobao.org
    npm run build:prod
    cp -r dist ../ruoyi-docker/compose/ruoyi/ui/
    

阶段二:启动容器集群

cd ruoyi-docker
docker-compose up -d --build

常用运维命令

操作类型 命令示例 说明
服务启停 docker-compose stop ruoyi-backend 停止指定服务
日志查看 docker-compose logs -f ruoyi-frontend 跟踪前端日志
状态检查 docker-compose ps 查看服务状态
配置重载 docker-compose restart ruoyi-backend 重启后端服务
数据备份 tar -czvf mysql_backup.tar.gz compose/mysql/data 备份MySQL数据

性能调优建议

  • 对于生产环境,建议在 docker-compose.yml 中添加资源限制:
    ruoyi-backend:
      deploy:
        resources:
          limits:
            cpus: '2'
            memory: 2G
    
  • Redis配置优化:
    maxmemory 1gb
    maxmemory-policy allkeys-lru
    

5. 故障排查与常见问题

容器化环境的问题诊断有其特殊性,掌握正确的排查方法能极大提高效率。

典型问题与解决方案

  1. MySQL连接失败

    • 现象:后端启动时报数据库连接异常
    • 排查步骤:
      docker exec -it ruoyi-mysql mysql -uroot -pRuoYi@123
      SHOW GRANTS FOR 'ruoyi'@'%';
      
    • 解决方案:确保初始化脚本正确执行
  2. Redis认证失败

    • 现象:后端日志中出现 NOAUTH 错误
    • 验证命令:
      docker exec -it ruoyi-redis redis-cli -a RuoYi@123 PING
      
    • 修复方法:检查 redis.conf 中的 requirepass 配置
  3. 前端静态资源404

    • 检查方法:
      docker exec ruoyi-frontend ls -l /usr/share/nginx/html
      
    • 可能原因:构建产物未正确复制到镜像中

网络连通性测试

# 测试后端到MySQL
docker exec ruoyi-backend ping ruoyi-mysql

# 测试前端到后端API
docker exec ruoyi-frontend curl -I http://ruoyi-backend:8080

日志分析技巧

  • 使用 grep 过滤关键错误:
    docker-compose logs | grep -i error
    
  • 按时间范围查看日志:
    docker logs --since 2023-07-01T00:00:00 ruoyi-backend
    

6. 进阶配置与生产建议

当准备将容器化部署方案应用于生产环境时,需要考虑更多高可用和安全因素。

安全加固措施

  • 修改所有默认密码(MySQL root、Redis、应用账号)
  • 限制容器网络访问:
    networks:
      ruoyi_net:
        driver: bridge
        internal: true
    
  • 启用TLS加密数据库连接

高可用方案

  1. MySQL主从复制

    mysql-master:
      image: mysql:8.0
      environment:
        MYSQL_REPLICATION_USER: replica
        MYSQL_REPLICATION_PASSWORD: Replica@123
    
    mysql-slave:
      image: mysql:8.0
      depends_on:
        - mysql-master
      environment:
        MYSQL_REPLICATION_USER: replica
        MYSQL_REPLICATION_PASSWORD: Replica@123
        MYSQL_REPLICATION_MODE: slave
    
  2. Redis哨兵模式

    redis-sentinel:
      image: redis:7.0
      command: redis-sentinel /usr/local/etc/redis/sentinel.conf
      volumes:
        - ./sentinel.conf:/usr/local/etc/redis/sentinel.conf
    

监控方案集成

  • Prometheus配置示例:
    ruoyi-backend:
      environment:
        - JAVA_TOOL_OPTIONS=-javaagent:/app/prometheus/jmx_prometheus_javaagent.jar=8081:/app/prometheus/config.yaml
    

CI/CD集成建议

# 示例GitLab CI配置
stages:
  - build
  - deploy

build_backend:
  stage: build
  script:
    - mvn clean package -DskipTests
    - cp target/*.jar docker/compose/ruoyi/apps/

deploy:
  stage: deploy
  script:
    - docker-compose up -d --build

更多推荐