200字
RuoYi-Cloud 构建+Docker部署
2025-10-23
2025-10-23

后端部署

第一步:构建后端应用包

若依微服务是Java项目,需要先通过Maven打包成可执行的JAR文件,才能放入Docker镜像中运行。

 # 克隆若依微服务源码
 git clone https://gitee.com/y_project/RuoYi-Cloud.git
 ​
 cd Ruoyi-cloud  # 进入若依微服务项目根目录
 mvn clean package -DskipTests  # 用Maven打包
  • mvn clean:清空之前的编译结果,避免旧文件干扰。

  • package:将项目编译、打包成JAR文件(位于各模块的target目录下)。

  • -DskipTests:跳过单元测试(新手部署时可节省时间,避免测试失败阻碍打包)。

第二步:编写Dockerfile

ruoyi-gateway(网关服务)

 # 基础镜像:使用OpenJDK 11的精简版(JRE足以运行Java程序,比JDK体积小)
 FROM openjdk:11-jre-slim
 # 安装字体依赖(若依可能生成报表、验证码等,需要字体支持,否则可能出现乱码)
 RUN apt-get update && apt-get install -y \
     fontconfig \
     libfreetype6 \
     && rm -rf /var/lib/apt/lists/*  # 清理安装缓存,减小镜像体积
 WORKDIR /app  # 设置容器内的工作目录(后续命令默认在此目录执行)
 # 复制打包好的JAR文件到容器内,并重命名为app.jar(简化命令)
 COPY ./ruoyi-gateway/target/ruoyi-gateway.jar app.jar
 # 复制配置文件到容器内的config目录(配置文件优先从外部挂载,这里作为默认)
 COPY ./ruoyi-gateway/src/main/resources/bootstrap.yml /app/config/bootstrap.yml
 EXPOSE 8080  # 声明容器对外暴露的端口(网关默认端口)
 ENTRYPOINT ["java", "-jar", "app.jar"]  # 容器启动时执行的命令(运行JAR包)

ruoyi-module-system(系统服务)

 FROM openjdk:11-jre-slim
 RUN apt-get update && apt-get install -y \
     fontconfig \
     libfreetype6 \
     && rm -rf /var/lib/apt/lists/*
 WORKDIR /app
 COPY ./ruoyi-modules/ruoyi-system/target/ruoyi-modules-system.jar app.jar
 COPY ./ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml /app/config/bootstrap.yml
 EXPOSE 9201  # 系统服务默认端口
 ENTRYPOINT ["java", "-jar", "app.jar"]

ruoyi-auth(认证服务)

 FROM openjdk:11-jre-slim
 RUN apt-get update && apt-get install -y \
     fontconfig \
     libfreetype6 \
     && rm -rf /var/lib/apt/lists/*
 WORKDIR /app
 COPY ./ruoyi-auth/target/ruoyi-auth.jar app.jar
 COPY ./ruoyi-auth/src/main/resources/bootstrap.yml /app/config/bootstrap.yml
 EXPOSE 9200  # 认证服务默认端口
 ENTRYPOINT ["java", "-jar", "app.jar"]
  • 基础镜像选openjdk:11-jre-slim:Java程序运行需要JRE环境,精简版镜像体积小,部署更快。

  • 安装字体:若依生成验证码、导出Excel等功能依赖系统字体,不安装可能出现乱码。

  • 复制JAR和配置文件:镜像需要包含程序运行的核心文件,配置文件放在config目录便于后续外部挂载修改。

第三步:准备基础依赖服务

若依微服务运行需要依赖3个核心组件:MySQL(数据库)、Redis(缓存)、Nacos(服务注册/配置中心),我们用Docker拉取并运行这些组件。

1. 拉取所需镜像并克隆项目

 # 拉取Nacos(服务注册/配置中心)、Redis(缓存)、MySQL(数据库)镜像
 docker pull nacos/nacos-server:v2.3.2
 docker pull redis:6.2.20
 docker pull mysql:8.0
 ​
 # 克隆若依微服务源码(如果还没有源码的话)
 git clone https://gitee.com/y_project/RuoYi-Cloud.git

2. 创建自定义Docker网络

 docker network create ruoyi-network  # 命名为ruoyi-network
  • Docker容器默认用“桥接网络”,但不同容器间通信需要知道对方IP,IP可能变化。

  • 允许容器通过“容器名”通信(如ruoyi-mysql直接访问MySQL),无需记IP,更稳定。

3. 运行MySQL数据库

MySQL用于存储若依的业务数据、配置数据等,需要持久化数据(避免容器删除后数据丢失)。

 # 创建数据持久化目录(宿主机目录,用于映射容器内的数据库文件)
 mkdir -p /opt/ruoyi/mysql/data
 ​
 # 运行MySQL容器
 docker run -d \
   --name ruoyi-mysql \  # 给容器起个名字(方便后续操作)
   -p 3306:3306 \  # 端口映射:宿主机3306端口 -> 容器3306端口(外部可通过宿主机端口访问)
   -e MYSQL_ROOT_PASSWORD=123456 \  # 设置MySQL root用户密码
   -e MYSQL_DATABASE=ry-cloud \  # 初始化时创建主业务数据库
   -e MYSQL_DATABASE=ry-config \  # 初始化时创建Nacos配置数据库
   -e TZ=Asia/Shanghai \  # 设置时区为上海(避免时间错乱)
   -v /opt/ruoyi/mysql/data:/var/lib/mysql \  # 数据持久化:容器内数据目录映射到宿主机
   --restart=always \  # 宿主机重启后,容器自动启动
   mysql:8.0
 ​
 # 将MySQL加入自定义网络(让其他服务能通过容器名访问)
 docker network connect ruoyi-network ruoyi-mysql

4. 导入MySQL数据库脚本

若依需要预先创建数据库并导入初始化数据,否则服务启动会报错。

数据库名称

用途说明

对应 SQL 文件

ry-cloud

若依微服务主业务数据库

ry_20250523.sql

ry-config

Nacos 配置中心存储配置的数据库

ry_config_20250902.sql

quartz

定时任务(Quartz)数据库

quartz.sql

ry-seata

分布式事务(Seata)数据库(可选)

ry_seata_20210128.sql

 # 进入若依项目目录,将sql文件夹复制到MySQL容器内的/tmp目录
 cd RuoYi-Cloud
 docker cp ./sql ruoyi-mysql:/tmp/
 ​
 # 进入MySQL容器内部
 docker exec -it ruoyi-mysql /bin/bash
 ​
 # 登录MySQL(输入之前设置的密码123456)
 mysql -u root -p

登录后执行SQL创建数据库并导入数据:

 -- 创建主业务数据库
 CREATE DATABASE IF NOT EXISTS `ry-cloud` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
 -- 创建Nacos配置数据库
 CREATE DATABASE IF NOT EXISTS `ry-config` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
 -- 创建定时任务数据库
 CREATE DATABASE IF NOT EXISTS `quartz` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
 -- 创建Seata分布式事务数据库(可选,若不用Seata可跳过)
 CREATE DATABASE IF NOT EXISTS `ry-seata` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
 ​
 ​
 -- 导入主业务数据
 use ry-cloud;
 source /tmp/sql/ry_20250523.sql;
 ​
 -- 导入Nacos配置数据
 use ry-config;
 source /tmp/sql/ry_config_20250902.sql;
 ​
 -- 导入定时任务数据
 use quartz;
 source /tmp/sql/quartz.sql;
 ​
 -- (可选)导入Seata数据
 use ry-seata;
 source /tmp/sql/ry_seata_20210128.sql;
  • 若依服务启动时会读取数据库中的表结构和初始数据(如管理员账号、菜单配置),没有这些数据会启动失败。

  • docker cp用于将宿主机的SQL文件复制到容器内,再通过source命令执行导入。

5. 运行Redis缓存

Redis用于若依的缓存(如登录令牌、临时数据),提高性能。

 # 创建数据持久化目录(缓存数据和配置文件)
 mkdir -p /opt/ruoyi/redis/{data,conf}
 ​
 docker run -d \
   --name ruoyi-redis \  # 容器名
   --network ruoyi-network \  # 直接加入自定义网络(无需再单独connect)
   -p 6379:6379 \  # 端口映射
   -v /opt/ruoyi/redis/data:/data \  # 持久化缓存数据(Redis默认数据目录)
   -e REDIS_PASSWORD=123456 \  # 设置Redis密码
   --restart=always \  # 自动重启
   redis:6.2.20 \
   redis-server --appendonly yes  # 开启AOF持久化(确保缓存数据不丢失)

为什么这么做?

  • 缓存持久化:--appendonly yes开启AOF模式,Redis会将操作日志写入文件,重启后可恢复数据。

  • 加入网络:若依服务需要连接Redis,通过ruoyi-redis容器名访问。

6. 运行Nacos服务注册/配置中心

Nacos用于管理微服务的注册(服务发现)和配置(集中配置文件),若依的所有服务都需要注册到Nacos。

 # 创建数据持久化目录(Nacos的数据和日志)
 mkdir -p /opt/ruoyi/nacos/{data,logs}
 ​
 docker run -d \
   --name ruoyi-nacos \  # 容器名
   --network ruoyi-network \  # 加入自定义网络
   -p 8848:8848 \  # Nacos默认端口
   -e MODE=standalone \  # 单机模式(新手测试用,生产环境用集群)
   -e SPRING_DATASOURCE_PLATFORM=mysql \  # 配置存储到MySQL(默认存内存,重启丢失)
   -e MYSQL_SERVICE_HOST=ruoyi-mysql \  # MySQL地址(容器名,因为在同一网络)
   -e MYSQL_SERVICE_PORT=3306 \  # MySQL端口
   -e MYSQL_SERVICE_DB_NAME=ry-config \  # 存储Nacos配置的数据库(之前创建的)
   -e MYSQL_SERVICE_USER=root \  # MySQL用户名
   -e MYSQL_SERVICE_PASSWORD=123456 \  # MySQL密码
   -e MYSQL_DATABASE_NUM=1 \  # 数据库数量(单库)
   -e TZ=Asia/Shanghai \  # 时区
   -e NACOS_AUTH_ENABLE=false \  # 关闭密码认证(简化操作,生产环境建议开启)
   -v /opt/ruoyi/nacos/data:/home/nacos/data \  # 持久化Nacos数据
   -v /opt/ruoyi/nacos/logs:/home/nacos/logs \  # 持久化日志
   --restart=always \
   nacos/nacos-server:v2.3.2

访问Nacos控制台

打开浏览器访问 http://你的服务器IP:8848/nacos/。(关闭了认证不需要密码,默认账号密码都是nacos

  • 单机模式:MODE=standalone,无需配置集群。

  • 配置存MySQL:默认Nacos配置存在内存中,重启后丢失,用SPRING_DATASOURCE_PLATFORM=mysql指定存到之前创建的ry-config数据库。

7. 修改Nacos配置(关键步骤)

若依服务的配置存储在Nacos中,需要修改Redis地址(默认可能是本地,需改为容器名)。

(1)登录Nacos后,找到ruoyi-gateway-dev.ymlruoyi-auth-dev.ymlruoyi-system-dev.yml等配置文件:

找到网关配置

(2)修改Redis配置,将host改为ruoyi-redis(Redis容器名),password改为之前设置的123456

 spring:
   redis:
     host: ruoyi-redis  # 同一网络内用容器名访问
     port: 6379
     password: 123456  # 之前设置的Redis密码

修改Redis配置

(3)修改MySQL配置(同上):

       datasource:
           # 主库数据源
           master:
             driver-class-name: com.mysql.cj.jdbc.Driver
             url: jdbc:mysql://ruoyi-mysql:3306/ry-cloud?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
             username: root
             password: 123456

发布配置

(3)点击“发布”保存配置:

  • 若依网关服务需要连接Redis存储令牌,默认配置可能指向localhost(容器内的localhost不是宿主机),必须改为Redis容器名ruoyi-redis(同一网络内可解析)。

8. 启动ruoyi-gateway(网关服务)

网关是微服务的入口,所有前端请求都通过网关转发到对应服务。

 # 创建配置和日志目录(用于外部挂载)
 mkdir -p /opt/ruoyi/ruoyi-gateway/{config,logs}
 ​
 # 复制项目中的网关配置文件到宿主机目录(后续挂载到容器)
 cp ./ruoyi-gateway/src/main/resources/bootstrap.yml /opt/ruoyi/ruoyi-gateway/config/
 ​
 # 启动网关容器
 docker run -d \
   --name ruoyi-gateway \  # 容器名
   --network ruoyi-network \  # 加入自定义网络
   -p 8080:8080 \  # 端口映射(网关默认端口)
   -v /opt/ruoyi/ruoyi-gateway/config:/app/config \  # 挂载配置文件(修改宿主机文件即可生效)
   -v /opt/ruoyi/ruoyi-gateway/logs:/var/log/ruoyi \  # 挂载日志目录(方便查看日志)
   -e TZ=Asia/Shanghai \  # 时区
   ruoyi/ruoyi-gateway:v1.1  # 镜像名(需先通过Dockerfile构建)

验证启动

查看Nacos的“服务列表”,若ruoyi-gateway显示,则启动成功。

网关服务注册成功

注意事项

  • 配置文件中的Nacos地址必须是ruoyi-nacos:8848(容器名),而非IP。

    网关日志示例

  • 若启动失败,查看日志:tail -f /opt/ruoyi/ruoyi-gateway/logs/xxx.logdocker logs <容器ID>

    网关启动成功日志

9. 启动ruoyi-auth(认证服务)

认证服务负责用户登录、令牌生成等功能,依赖Nacos和Redis。

 # 创建配置和日志目录
 mkdir -p /opt/ruoyi/ruoyi-auth/{config,logs}
 ​
 # 复制认证服务配置文件
 cp ./ruoyi-auth/src/main/resources/bootstrap.yml /opt/ruoyi/ruoyi-auth/config/
 ​
 # 启动容器
 docker run -d \
   --name ruoyi-auth \
   --network ruoyi-network \
   -p 9200:9200 \  # 认证服务端口
   -v /opt/ruoyi/ruoyi-auth/config:/app/config \
   -v /opt/ruoyi/ruoyi-auth/logs:/var/log/ruoyi \
   -e TZ=Asia/Shanghai \
   ruoyi/ruoyi-auth:v1.1

10. 启动ruoyi-system(系统服务)

系统服务包含用户管理、菜单管理等核心业务功能,依赖数据库、Nacos、Redis。

 # 创建配置和日志目录
 mkdir -p /opt/ruoyi/ruoyi-system/{config,logs}
 ​
 # 复制系统服务配置文件
 cp ./ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml /opt/ruoyi/ruoyi-system/config
 ​
 # 启动容器
 docker run -d \
   --name ruoyi-system \
   --network ruoyi-network \
   -p 9201:9201 \  # 系统服务端口
   -v /opt/ruoyi/ruoyi-system/config:/app/config \
   -v /opt/ruoyi/ruoyi-system/logs:/var/log/ruoyi \
   -e TZ=Asia/Shanghai \
   ruoyi/ruoyi-system:v1.1

都看到这了,请乐哥喝一罐可乐吧

前端部署

若依前端是Vue项目,需要编译成静态文件后用Nginx运行,可以用“多阶段构建”减小镜像体积。

第一步:准备Nginx配置

Nginx用于运行前端静态文件,并将API请求转发到后端网关(解决跨域问题)。

 worker_processes  1;  # 工作进程数
 ​
 events {
     worker_connections  1024;  # 每个进程最大连接数
 }
 ​
 http {
     include       mime.types;
     default_type  application/octet-stream;
     sendfile        on;
     keepalive_timeout  65;
 ​
     # 定义后端网关地址(通过容器名访问,因为在同一网络)
     upstream cloudbackend {
         server ruoyi-gateway:8080;
     }
 ​
     server {
         listen       80;
         server_name  localhost;
 ​
         # 前端静态文件目录
         location / {
             root   /usr/share/nginx/html;  # 前端编译后的dist目录
             try_files $uri $uri/ /index.html;  # 支持Vue路由跳转
             index  index.html index.htm;
         }
 ​
         # API请求转发到后端网关(解决跨域)
         location /prod-api/ {
             proxy_set_header Host $http_host;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_pass http://cloudbackend/;  # 转发到上面定义的cloudbackend
         }
 ​
         error_page   500 502 503 504  /50x.html;
         location = /50x.html {
             root   html;
         }
     }
 }
  • 前端请求后端API时,直接访问会有跨域问题(浏览器限制),通过Nginx代理转发即可解决。

  • upstream定义后端网关地址,方便统一管理。

第二步:编写前端Dockerfile(多阶段构建)

ruoyi-ui目录下创建Dockerfile,分两阶段构建:

 # 第一阶段:构建前端静态资源(用Node环境编译)
 FROM node:16-alpine AS builder
 # 安装证书(避免npm安装依赖时证书错误)
 RUN apk add --no-cache ca-certificates
 # 设置npm镜像为国内源(加速依赖下载)
 RUN npm config set registry https://registry.npmmirror.com/ \
     && npm config set fetch-retry-mintimeout 60000 \
     && npm config set fetch-retrytimeout 120000
 WORKDIR /app  # 工作目录
 COPY package*.json ./  # 复制依赖描述文件
 RUN npm cache clean --force  # 清理缓存
 RUN npm install --verbose  # 安装依赖
 COPY . .  # 复制所有前端代码
 RUN npm run build:prod  # 编译生成dist目录(静态文件)
 ​
 ​
 # 第二阶段:运行阶段(用Nginx运行静态文件)
 FROM nginx:alpine
 # 从第一阶段复制编译好的dist目录到Nginx
 COPY --from=builder /app/dist /usr/share/nginx/html
 # 复制Nginx配置文件
 COPY nginx.conf /etc/nginx/nginx.conf
 EXPOSE 80  # 暴露端口
 CMD ["nginx", "-g", "daemon off;"]  # 启动Nginx(前台运行)

为什么这么做?

  • 多阶段构建:第一阶段用Node编译后,第二阶段只保留编译结果(dist目录)和Nginx,镜像体积更小(从几百MB减到几十MB)。

  • 国内npm源:加速依赖下载,避免因网络问题导致构建失败。

第三步:构建前端镜像

 # 进入前端目录
 cd /root/RuoYi-Cloud/ruoyi-ui
 ​
 # 构建镜像(标签为ruoyi-ui:v1.0)
 docker build -t ruoyi-ui:v1.0 .

验证:执行docker images | grep ruoyi-ui,若能看到镜像则构建成功。

第四步:启动前端容器

 # 创建配置和日志目录
 mkdir -p /opt/ruoyi/ruoyi-ui/{config,logs}
 # 复制Nginx配置文件到宿主机(用于挂载)
 cp ./ruoyi-ui/nginx.conf /opt/ruoyi/ruoyi-ui/config/
 ​
 # 启动容器
 docker run -d \
   --name ruoyi-ui \
   --network ruoyi-network \  # 加入网络,才能通过ruoyi-gateway访问后端
   -p 82:80 \  # 宿主机82端口映射到容器80端口(前端访问端口)
   -v /opt/ruoyi/ruoyi-ui/config/nginx.conf:/etc/nginx/nginx.conf \  # 挂载配置
   -v /opt/ruoyi/ruoyi-ui/logs:/var/log/nginx \  # 挂载日志
   -e TZ=Asia/Shanghai \
   ruoyi/ui:v1.0
  • 加入ruoyi-network网络:前端容器内的Nginx需要通过ruoyi-gateway容器名访问后端网关。

  • 端口映射:通过宿主机82端口访问前端页面(避免与其他服务端口冲突)。

第五步:验证部署

  1. 检查所有容器是否正常运行:

     docker ps | grep ruoyi  # 状态为Up表示正常
  2. 访问前端页面:

    打开浏览器访问 http://你的服务器IP:82,用默认账号admin、密码admin123登录。若能正常显示菜单,则部署成功。

  3. 若登录失败,查看日志排查:

    • 前端日志:tail -f /opt/ruoyi/ruoyi-ui/logs/ruoyicloud_error.log

    • 后端日志:查看对应服务的logs目录(如/opt/ruoyi/ruoyi-gateway/logs

总结

  1. 后端:通过Maven打包Java项目,用Dockerfile构建镜像,依次启动依赖服务(MySQL、Redis、Nacos)和若依核心服务(网关、认证、系统)。

  2. 前端:用Node编译Vue项目,通过Nginx运行,代理API请求到后端网关。

  3. 关键:所有服务加入同一Docker网络,通过容器名通信;数据和配置文件挂载到宿主机,方便修改和持久化。

评论