RuoYi-Vue容器化:Docker部署全流程

【免费下载链接】RuoYi-Vue 🎉 基于SpringBoot,Spring Security,JWT,Vue & Element 的前后端分离权限管理系统,同时提供了 Vue3 的版本 【免费下载链接】RuoYi-Vue 项目地址: https://gitcode.com/yangzongzhuan/RuoYi-Vue

前言:为什么选择Docker部署?

还在为RuoYi-Vue项目的环境配置、依赖冲突、部署复杂而头疼吗?传统部署方式需要手动安装JDK、Node.js、MySQL、Redis等组件,配置繁琐且容易出错。Docker容器化部署为您提供了一站式解决方案,实现:

  • 环境一致性:开发、测试、生产环境完全一致
  • 快速部署:一键启动,分钟级完成部署
  • 资源隔离:各服务独立运行,互不干扰
  • 易于扩展:支持水平扩展和负载均衡
  • 版本管理:镜像版本控制,轻松回滚

本文将带您从零开始,完整实现RuoYi-Vue项目的Docker容器化部署。

环境准备与工具安装

系统要求

  • Linux/Windows/macOS系统
  • Docker 20.10+
  • Docker Compose 2.0+

Docker安装指南

Ubuntu/CentOS系统
# 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc

# 安装依赖
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release

# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 设置稳定版仓库
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装Docker引擎
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

# 启动Docker
sudo systemctl start docker
sudo systemctl enable docker

# 验证安装
sudo docker run hello-world
Windows系统
  1. 下载Docker Desktop for Windows
  2. 双击安装包完成安装
  3. 重启计算机后启动Docker Desktop
macOS系统
  1. 下载Docker Desktop for Mac
  2. 拖拽应用到Applications文件夹
  3. 启动Docker应用

Docker Compose安装

# Linux系统
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# 验证安装
docker-compose --version

项目结构分析与Docker化规划

RuoYi-Vue架构概览

mermaid

容器服务依赖关系

服务名称 技术栈 端口 依赖服务
ruoyi-ui Vue.js + Node.js 80 ruoyi-admin
ruoyi-admin SpringBoot + JDK8 8080 mysql, redis
mysql MySQL 5.7/8.0 3306 -
redis Redis 6.x 6379 -

Dockerfile编写与镜像构建

后端Dockerfile (ruoyi-admin)

创建 Dockerfile 文件:

# 后端Dockerfile
FROM openjdk:8-jdk-alpine

# 设置工作目录
WORKDIR /app

# 添加构建好的jar包
COPY ruoyi-admin/target/ruoyi-admin.jar app.jar

# 暴露端口
EXPOSE 8080

# 设置JVM参数
ENV JAVA_OPTS="-Xms512m -Xmx1024m -Dspring.profiles.active=prod"

# 启动应用
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]

前端Dockerfile (ruoyi-ui)

创建 ruoyi-ui/Dockerfile 文件:

# 前端Dockerfile
FROM node:16-alpine as builder

# 设置工作目录
WORKDIR /app

# 复制package文件
COPY package*.json ./

# 安装依赖
RUN npm install --registry=https://registry.npmmirror.org

# 复制源代码
COPY . .

# 构建生产版本
RUN npm run build:prod

# 生产阶段
FROM nginx:alpine

# 复制构建好的文件
COPY --from=builder /app/dist /usr/share/nginx/html

# 复制nginx配置
COPY nginx.conf /etc/nginx/conf.d/default.conf

# 暴露端口
EXPOSE 80

# 启动nginx
CMD ["nginx", "-g", "daemon off;"]

Nginx配置文件

创建 ruoyi-ui/nginx.conf

server {
    listen       80;
    server_name  localhost;
    
    # 前端静态资源
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        try_files $uri $uri/ /index.html;
    }
    
    # 后端API代理
    location /prod-api/ {
        proxy_pass http://ruoyi-admin:8080/;
        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;
    }
    
    # 静态资源缓存
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }
}

Docker Compose编排配置

创建 docker-compose.yml 文件:

version: '3.8'

services:
  # MySQL数据库服务
  mysql:
    image: mysql:8.0
    container_name: ruoyi-mysql
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: ry-vue
      MYSQL_USER: ruoyi
      MYSQL_PASSWORD: RuoYi@123
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
      - ./sql:/docker-entrypoint-initdb.d
    command: 
      --character-set-server=utf8mb4 
      --collation-server=utf8mb4_unicode_ci
      --default-authentication-plugin=mysql_native_password
    networks:
      - ruoyi-network
    restart: unless-stopped

  # Redis缓存服务
  redis:
    image: redis:6-alpine
    container_name: ruoyi-redis
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data
    command: redis-server --appendonly yes --requirepass 123456
    networks:
      - ruoyi-network
    restart: unless-stopped

  # 后端SpringBoot应用
  ruoyi-admin:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: ruoyi-admin
    environment:
      - SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
      - SPRING_DATASOURCE_USERNAME=ruoyi
      - SPRING_DATASOURCE_PASSWORD=RuoYi@123
      - SPRING_REDIS_HOST=redis
      - SPRING_REDIS_PORT=6379
      - SPRING_REDIS_PASSWORD=123456
    ports:
      - "8080:8080"
    depends_on:
      - mysql
      - redis
    networks:
      - ruoyi-network
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080"]
      interval: 30s
      timeout: 10s
      retries: 3

  # 前端Vue应用
  ruoyi-ui:
    build:
      context: ./ruoyi-ui
      dockerfile: Dockerfile
    container_name: ruoyi-ui
    ports:
      - "80:80"
    depends_on:
      - ruoyi-admin
    networks:
      - ruoyi-network
    restart: unless-stopped

# 数据卷定义
volumes:
  mysql_data:
    driver: local
  redis_data:
    driver: local

# 网络定义
networks:
  ruoyi-network:
    driver: bridge

环境配置文件调整

后端应用配置

修改 ruoyi-admin/src/main/resources/application-docker.yml

# 数据源配置
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://mysql:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
    username: ruoyi
    password: RuoYi@123

  # Redis配置
  redis:
    host: redis
    port: 6379
    password: 123456
    database: 0
    timeout: 3000ms
    lettuce:
      pool:
        max-active: 20
        max-wait: -1ms
        max-idle: 8
        min-idle: 0

# 日志配置
logging:
  level:
    com.ruoyi: debug
  file:
    name: logs/ruoyi-admin.log

# 跨域配置(用于Docker环境)
cors:
  allowed-origins: http://localhost:80,http://ruoyi-ui:80
  allowed-methods: GET,POST,PUT,DELETE,OPTIONS
  allowed-headers: "*"
  allow-credentials: true

前端环境配置

创建 ruoyi-ui/.env.docker 文件:

# 后端API地址(Docker内部网络)
VUE_APP_BASE_API = /prod-api
VUE_APP_WS_API = ws://localhost/prod-api

# 构建配置
NODE_ENV = production

构建与部署流程

1. 项目构建

# 克隆项目
git clone https://gitcode.com/yangzongzhuan/RuoYi-Vue.git
cd RuoYi-Vue

# 后端构建
mvn clean package -DskipTests

# 前端构建(可选,Docker构建时会自动执行)
cd ruoyi-ui
npm install --registry=https://registry.npmmirror.org
npm run build:prod
cd ..

2. Docker镜像构建

# 构建所有服务镜像
docker-compose build

# 或者分别构建
docker build -t ruoyi-admin .
docker build -t ruoyi-ui ./ruoyi-ui

3. 启动服务

# 一键启动所有服务
docker-compose up -d

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs -f

# 停止服务
docker-compose down

4. 服务验证

# 检查容器运行状态
docker ps

# 验证前端服务
curl http://localhost

# 验证后端API
curl http://localhost:8080

# 验证数据库连接
docker exec -it ruoyi-mysql mysql -uruoyi -pRuoYi@123 ry-vue

# 验证Redis连接
docker exec -it ruoyi-redis redis-cli -a 123456

生产环境部署优化

1. 使用Docker Swarm或Kubernetes

创建 docker-stack.yml

version: '3.8'

services:
  mysql:
    image: mysql:8.0
    deploy:
      replicas: 1
      resources:
        limits:
          memory: 1G
        reservations:
          memory: 512M
    # ... 其他配置

  ruoyi-admin:
    image: ruoyi-admin:latest
    deploy:
      replicas: 3
      update_config:
        parallelism: 1
        delay: 10s
      resources:
        limits:
          memory: 2G
        reservations:
          memory: 1G
    # ... 其他配置

2. 健康检查与监控

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"]
  interval: 30s
  timeout: 10s
  retries: 3
  start_period: 40s

3. 日志管理

logging:
  driver: "json-file"
  options:
    max-size: "10m"
    max-file: "3"

常见问题与解决方案

1. 数据库连接问题

# 检查数据库容器是否正常运行
docker logs ruoyi-mysql

# 检查数据库用户权限
docker exec -it ruoyi-mysql mysql -uroot -p123456
GRANT ALL PRIVILEGES ON *.* TO 'ruoyi'@'%';
FLUSH PRIVILEGES;

2. 内存不足问题

# 调整JVM内存参数
environment:
  - JAVA_OPTS=-Xms512m -Xmx1024m -XX:MaxMetaspaceSize=256m

3. 端口冲突问题

# 修改端口映射
ports:
  - "8081:8080"  # 主机端口:容器端口

4. 构建缓存清理

# 清理Docker构建缓存
docker system prune -a

# 重新构建指定服务
docker-compose build --no-cache ruoyi-admin

性能优化建议

1. 镜像优化

# 使用多阶段构建减少镜像大小
FROM openjdk:8-jdk-alpine as builder
WORKDIR /app
COPY . .
RUN mvn clean package -DskipTests

FROM openjdk:8-jre-alpine
COPY --from=builder /app/ruoyi-admin/target/ruoyi-admin.jar /app.jar

2. 数据库优化

# MySQL配置优化
command: 
  --innodb-buffer-pool-size=512M
  --innodb-log-file-size=256M
  --max-connections=200

3. 前端资源优化

# Gzip压缩
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss application/json;

安全最佳实践

1. 使用环境变量文件

创建 .env 文件:

MYSQL_ROOT_PASSWORD=your_secure_password
MYSQL_PASSWORD=your_secure_password
REDIS_PASSWORD=your_secure_password

2. 网络隔离

networks:
  ruoyi-internal:
    internal: true
  ruoyi-external:
    driver: bridge

3. 镜像扫描

# 使用Trivy扫描镜像漏洞
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy image ruoyi-admin:latest

总结

通过本文的Docker容器化部署方案,您已经掌握了RuoYi-Vue项目的现代化部署方式。这种方案带来了以下优势:

  1. 标准化部署:统一的Dockerfile和Compose配置
  2. 环境一致性:消除"在我机器上能运行"的问题
  3. 快速扩展:轻松实现水平扩展和负载均衡
  4. 易于维护:版本化的镜像管理和一键回滚
  5. 资源优化:合理的资源分配和性能调优

现在,您可以自信地将RuoYi-Vue项目部署到任何支持Docker的环境中,享受容器化带来的便利和效率提升。

下一步建议

  • 探索Kubernetes集群部署
  • 实现CI/CD自动化流水线
  • 设置监控告警系统
  • 建立备份恢复机制

祝您部署顺利!如有问题,欢迎在社区交流讨论。

【免费下载链接】RuoYi-Vue 🎉 基于SpringBoot,Spring Security,JWT,Vue & Element 的前后端分离权限管理系统,同时提供了 Vue3 的版本 【免费下载链接】RuoYi-Vue 项目地址: https://gitcode.com/yangzongzhuan/RuoYi-Vue

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐