后端部署
第一步:构建后端应用包
若依微服务是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.git2. 创建自定义Docker网络
docker network create ruoyi-network # 命名为ruoyi-networkDocker容器默认用“桥接网络”,但不同容器间通信需要知道对方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-mysql4. 导入MySQL数据库脚本
若依需要预先创建数据库并导入初始化数据,否则服务启动会报错。
# 进入若依项目目录,将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.yml、ruoyi-auth-dev.yml、ruoyi-system-dev.yml等配置文件:

(2)修改Redis配置,将host改为ruoyi-redis(Redis容器名),password改为之前设置的123456:
spring:
redis:
host: ruoyi-redis # 同一网络内用容器名访问
port: 6379
password: 123456 # 之前设置的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.log或docker 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.110. 启动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端口访问前端页面(避免与其他服务端口冲突)。
第五步:验证部署
检查所有容器是否正常运行:
docker ps | grep ruoyi # 状态为Up表示正常访问前端页面:
打开浏览器访问
http://你的服务器IP:82,用默认账号admin、密码admin123登录。若能正常显示菜单,则部署成功。若登录失败,查看日志排查:
前端日志:
tail -f /opt/ruoyi/ruoyi-ui/logs/ruoyicloud_error.log后端日志:查看对应服务的logs目录(如
/opt/ruoyi/ruoyi-gateway/logs)
总结
后端:通过Maven打包Java项目,用Dockerfile构建镜像,依次启动依赖服务(MySQL、Redis、Nacos)和若依核心服务(网关、认证、系统)。
前端:用Node编译Vue项目,通过Nginx运行,代理API请求到后端网关。
关键:所有服务加入同一Docker网络,通过容器名通信;数据和配置文件挂载到宿主机,方便修改和持久化。
