Name Last Update
..
nginx Loading commit data...
.env.example Loading commit data...
.gitignore Loading commit data...
README.md Loading commit data...
docker-compose.yml Loading commit data...

README.md

Docker Compose 部署(单体版)

目标:用 Docker Compose V2 快速搭建一套可登录的体验环境,了解各组件之间的依赖关系。

包含:yudao-server 后端、前端 Nginx、MySQL、Redis。仅用于入门体验与测试,不是生产高可用方案。

文件列表

script/docker-compose
├── README.md
├── docker-compose.yml       <-- 编排文件,相对路径均相对于本目录
├── .env.example             <-- 环境变量示例,复制为 .env 后修改
├── .gitignore               <-- 忽略 .env、web/dist/
├── nginx
│   └── default.conf         <-- 静态资源、history 回退、/admin-api、/app-api、/infra/ws 反向代理
└── web
    └── dist                 <-- 需自行放入前端打包产物(不随仓库提供)
服务 镜像 说明
mysql mysql:8.4 首次启动导入 sql/mysql/ruoyi-vue-pro.sql、sql/mysql/quartz.sql,数据卷 yudao-boot_mysql-data
redis redis:7.4-alpine 开启密码与 AOF,数据卷 yudao-boot_redis-data
yudao-server yudao-server:${IMAGE_TAG} 由 yudao-server/Dockerfile 构建,端口 48080,只在 Compose 网络内访问
web nginx:1.28-alpine 对宿主机开放 ${WEB_PORT}(默认 8080)

容器之间通过服务名(mysql、redis、yudao-server)访问。MySQL、Redis、后端默认不映射到宿主机,不会与本机已有的 3306、6379、48080 冲突;需要时取消 docker-compose.yml 中对应 ports 的注释。

前置条件

  • Docker Engine + Docker Compose V2.20.2 及以上(docker compose version 可查看)
  • JDK 17、Maven(与源码根 pom.xml 的 java.version 一致)
  • 已按前端项目的部署说明完成打包

1. 打包后端

在源码根目录执行:

mvn clean package -pl yudao-server -am -Dmaven.test.skip=true

产物为 yudao-server/target/yudao-server.jar,docker compose build 时由 yudao-server/Dockerfile 复制进镜像。

2. 准备前端产物

前端是独立仓库,这里不构建前端源码。打包前确认前端生产环境配置:

  • 浏览器访问地址使用 Nginx 的同源地址,例如 http://localhost:8080,不要写 yudao-server、127.0.0.1:48080 等容器名或后端端口
  • API 路径为 /admin-api:yudao-ui-admin-vue3 为 .env.prod 的 VITE_BASE_URL + VITE_API_URL;yudao-ui-admin-vben 为 apps/web-*/.env.production 的 VITE_BASE_URL、VITE_GLOB_API_URL
  • 前端 VITE_APP_CAPTCHA_ENABLE 与 .env 中的 YUDAO_CAPTCHA_ENABLE 一致

将打包产物目录中的内容(包含 index.html)复制到 script/docker-compose/web/dist/,在源码根目录执行:

mkdir -p script/docker-compose/web/dist
cp -R /path/to/前端打包产物目录/. script/docker-compose/web/dist/

例如 yudao-ui-admin-vue3 执行 pnpm build:prod 后为 dist-prod;yudao-ui-admin-vben 执行 pnpm build:antd 后为 apps/web-antd/dist。

3. 配置环境变量

cd script/docker-compose
cp .env.example .env

按需修改 .env,至少替换 MYSQL_ROOT_PASSWORD、MYSQL_PASSWORD、REDIS_PASSWORD 三个示例密码。

变量 默认值 说明
WEB_PORT 8080 前端访问端口
IMAGE_TAG local 后端镜像 tag
MYSQL_DATABASE ruoyi-vue-pro 数据库名
MYSQL_ROOT_PASSWORD 示例值 MySQL root 密码,仅供初始化与运维使用
MYSQL_USER / MYSQL_PASSWORD yudao / 示例值 应用使用的账号,只拥有 MYSQL_DATABASE 库权限
REDIS_PASSWORD 示例值 Redis 密码
SPRING_PROFILES_ACTIVE dev 后端 profile
JAVA_OPTS -Xms512m -Xmx512m ... JVM 参数
YUDAO_CAPTCHA_ENABLE true 是否开启登录验证码

后端的数据库(主库 master、从库 slave)、Redis 连接,由 docker-compose.yml 通过环境变量覆盖 application-dev.yaml 中的 127.0.0.1 等地址;其余配置仍使用 application.yaml、application-dev.yaml。

4. 构建并启动

以下命令均在 script/docker-compose 目录执行:

# 检查配置(变量缺失会直接报错)
docker compose config

# 构建后端镜像并启动
docker compose up -d --build

# 查看状态与日志
docker compose ps
docker compose logs -f yudao-server

首次启动时 MySQL 需要导入 SQL,yudao-server 会等到 MySQL、Redis 健康检查通过后再启动。日志出现 Started YudaoServerApplication 后访问:

5. 更新

# 后端:回到源码根目录重新打包,再回到本目录重建、重启
cd ../..
mvn clean package -pl yudao-server -am -Dmaven.test.skip=true
cd script/docker-compose
docker compose up -d --build yudao-server

# 前端:清空 web/dist/ 内的文件(保留 dist 目录本身)后复制新产物,再重启 web;修改 nginx/default.conf 后同样执行
rm -rf web/dist/*
cp -R /path/to/前端打包产物目录/. web/dist/
docker compose restart web

如需回滚,可在打包前修改 .env 的 IMAGE_TAG,保留旧 tag 的镜像。

6. 停止与数据

# 停止并删除容器,保留数据卷
docker compose down

不要执行 docker compose down -v,它会删除 yudao-boot_mysql-data、yudao-boot_redis-data 数据卷,数据库内容将全部丢失。

数据库初始化说明

  • SQL 只在 mysql-data 数据卷为空(首次启动)时执行一次;之后修改 SQL 文件、.env 中的 MYSQL_* 账号密码,都不会作用于已有数据库。
  • 首次导入中途失败(例如容器被强制停止),数据卷会处于半初始化状态,需要确认数据可丢弃后执行 docker compose down、docker volume rm yudao-boot_mysql-data 再重新启动。
  • 已有数据卷升级到新版本时,SQL 不会自动执行。请先备份,再手动执行对应的升级 SQL,例如:
docker compose exec -T mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" "$MYSQL_DATABASE"' < /path/to/upgrade.sql
  • 使用外部 MySQL 时:自行导入 sql/mysql/ruoyi-vue-pro.sql、sql/mysql/quartz.sql,删除 docker-compose.yml 中的 mysql 服务及 yudao-server 对它的 depends_on,并把 SPRING_DATASOURCE_DYNAMIC_DATASOURCE_MASTER_*、SLAVE_* 改为外部地址;容器内的 127.0.0.1 指向容器自身,不是宿主机。

其他分支同步替换点

本目录按 JDK 17 + Spring Boot 3.x 分支编写。同步到其他分支时,只需替换:

分支 后端 Dockerfile 基础镜像 Redis 环境变量前缀
JDK 8 + Spring Boot 2.x eclipse-temurin:8-jre SPRING_REDIS_*(spring.redis.*)
JDK 17 + Spring Boot 3.x eclipse-temurin:17-jre SPRING_DATA_REDIS_*(spring.data.redis.*)
JDK 25 + Spring Boot 4.x eclipse-temurin:25-jre SPRING_DATA_REDIS_*(spring.data.redis.*)

并核对该分支 yudao-server/src/main/resources/application-*.yaml 的数据源、Redis 配置项与 sql/mysql 下的 SQL 文件名。