本文以实际项目为例,详细介绍如何用 Docker 一键部署包含前端、后端、MySQL、Redis 的 Spring Boot + Vue + Nginx 全栈项目,零环境依赖,随时迁移服务器。
RuoYi-Vue 官方码云/Gitee仓库
https://gitee.com/y_project/RuoYi-Vue
建议直接git clone https://gitee.com/y_project/RuoYi-Vue.git
若需第三方Docker集成项目(如你用的)可以参考:
https://gitee.com/saucesome/ruoyi-vue-docker
也可以自己新建RuoYi-Deploy
等部署总目录,再分离前端、后端、数据库等子目录。
你应该不要直接用 nginx:latest 镜像挂前端静态资源,而是用自定义Dockerfile+nginx.conf来做 Vue 打包后的静态资源映射。
目录结构如下:
docker/
nginx/
Dockerfile
nginx.conf
html/ # 存放前端dist
Dockerfile 示例:
FROM nginx:latest
WORKDIR /home/ruoyi/projects/ruoyi-ui
COPY ./conf/nginx.conf /etc/nginx/nginx.conf
COPY ./html/dist /home/ruoyi/projects/ruoyi-ui
nginx.conf 示例(根据实际API反向代理、静态资源路径调整):
server {
listen 80;
server_name localhost;
location / {
root /home/ruoyi/projects/ruoyi-ui;
try_files $uri $uri/ /index.html;
index index.html;
}
# 后端API反向代理
location /dev-api/ {
proxy_pass http://ruoyi-backend:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
新机器只需安装好 Docker Desktop(Windows/Mac),或 docker-ce
(Linux)。
不需要单独安装 MySQL、Redis、Node、JDK 等环境。
提前准备好以下文件和文件夹,整理到一个目录(如 Docker/
)下:
RuoYi-Deploy/
├─ docker/
│ ├─ mysql/
│ │ ├─ ry-vue.sql # 你Navicat导出的sql
│ │ └─ ...(其它官方sql)
│ ├─ nginx/
│ │ ├─ Dockerfile
│ │ ├─ nginx.conf
│ │ └─ html/dist/ # 前端打包产物
│ ├─ redis/
│ └─ ruoyi/
│ ├─ ruoyi-admin.jar # 后端jar
│ └─ application-docker.yml
├─ ruoyi-vue-docker/ # 代码目录
│ ├─ ruoyi-ui/
│ ├─ ruoyi-admin/
│ └─ ...
└─ docker-compose.yml
前端(Vue):
打包后会在 dist
目录下生成前端静态文件,把整个 dist
文件夹拷贝到 docker/nginx/html/
下。
cd ruoyi-ui
npm install
npm run build
后端(Spring Boot):
生成的 ruoyi-admin.jar
通常在 target/
目录,把它复制到 docker/ruoyi/
目录下:
cd ruoyi-vue-docker/ruoyi-admin
# 推荐用以下命令,确保profile生效
mvn clean package -Dmaven.test.skip=true
cp target/ruoyi-admin.jar ../../docker/ruoyi/
你可以用官方 ry_20250522.sql
+ quartz.sql
我是用自己通过Navicat导出的 ry-vue.sql
(包含我所有表结构和数据)
推荐直接用 Navicat 导出的大sql(比如 ry-vue.sql),这样数据最全最稳!
第一种(推荐):用Docker自带机制初始化
把 sql 文件放到 docker/mysql/
下
docker-compose.yml 增加挂载:
- ./docker/mysql/ry-vue.sql:/docker-entrypoint-initdb.d/ry-vue.sql
只有第一次新建数据库才会自动导入!
第二种(手动导入,适合数据重建/调试)
进入MySQL容器,手动导入:
docker exec -it mysql bash
mysql -u root -p ry-vue < /docker/mysql/ry-vue.sql
确保数据库为空或无表时再操作,避免主键冲突/脏数据。
最终实测无坑的 docker-compose.yml 结构如下:
version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: ry-vue
ports:
- 3306:3306
volumes:
- ./mysql_data:/var/lib/mysql
- ./docker/mysql/ry-vue.sql:/docker-entrypoint-initdb.d/ry-vue.sql
redis:
image: redis:7.0
container_name: redis
restart: always
ports:
- 6379:6379
volumes:
- ./redis_data:/data
ruoyi-backend:
image: openjdk:17-jdk
container_name: ruoyi-backend
working_dir: /app
command: ["sh", "-c", "sleep 20 && java -jar ruoyi-admin.jar"]
volumes:
- ./docker/ruoyi/ruoyi-admin.jar:/app/ruoyi-admin.jar
- ./docker/ruoyi/application-docker.yml:/app/application-docker.yml
ports:
- 8080:8080
depends_on:
- mysql
- redis
environment:
SPRING_PROFILES_ACTIVE: docker
ruoyi-frontend:
build: ./docker/nginx
container_name: ruoyi-frontend
ports:
- 80:80
depends_on:
- ruoyi-backend
要写全套数据库和Redis配置,和本地开发的配置方式不同,例如:
server:
port: 8080
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://mysql:3306/ry-vue?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username: root
password: 123456
druid:
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
maxEvictableIdleTimeMillis: 900000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
filters: stat,wall,slf4j
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
useGlobalDataSourceStat: true
redis:
host: redis
port: 6379
database: 0
timeout: 10s
重点是 allowPublicKeyRetrieval=true
适配MySQL 8+!
每次重部署或重置,推荐流程:
# 1. 删除旧容器和数据库持久化目录(mysql_data/redis_data)
docker compose down -v
rm -rf ./mysql_data ./redis_data
# 2. 重建并启动
docker compose up --build -d
# 3. 查看后端日志确认无错
docker logs -f ruoyi-backend
404接口异常/端口正常:通常是 application-docker.yml 不全,或后端jar未挂载成功
MySQL表不存在:sql未正确导入或挂载,需重建数据卷、重启
数据库连不上:请检查 url
配置,host
必须是mysql容器名
nginx访问404:nginx.conf配置、前端静态文件目录映射错误
前端页面 http://localhost:80 可正常打开
后端 http://localhost:8080/swagger-ui.html 可访问swagger接口
容器健康运行,docker ps
无Exited
MySQL内表完整(show tables;
有32张表)
打包、导入顺序别错乱
application-docker.yml和docker-compose.yml配置务必配套
MySQL用 Navicat/命令行都可备份恢复,数据最好用.sql自定义导出
nginx代理、前端打包目录别乱,访问不到dist就全是白屏
改yml后记得重新打包jar!