创建目录:
1 2
| mkdir -p ruoyi-project/{redis,nginx,mysql,java} cd ruoyi-project
|
目录结构:

1. 创建Docker自定义网络
1
| docker network create ruoyi-net
|
2.mysql
创建init文件夹:mkdir init
导入2个sql文件
1 2
| ls init/ quartz.sql ruoyi-vue-pro.sql
|
创建mysql_data:mkdir mysql_data
启动mysq容器
1 2 3 4 5 6 7 8 9 10 11 12 13
| docker run -d \ --name mysql-db \ --network ruoyi-net \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=123456 \ -e MYSQL_DATABASE=ruoyi-vue-pro \ -e MYSQL_USER=ruoyi \ -e MYSQL_PASSWORD=Aa123qwe \ -v $(pwd)/mysql_data:/var/lib/mysql \ -v $(pwd)/init:/docker-entrypoint-initdb.d \ mysql:8.0 \ --character-set-server=utf8mb4 \ --collation-server=utf8mb4_unicode_ci
|
等待30秒让MySQL完成初始化
检查数据库导入结果
1
| docker exec mysql-db mysql -uruoyi -pAa123qwe -e "USE \`ruoyi-vue-pro\`; SHOW TABLES;"
|
如果导入失败,可换手动导入
1 2 3
| docker exec -i mysql-db mysql -uruoyi -pAa123qwe ruoyi-vue-pro < init/ruoyi-vue-pro.sql
docker exec -i mysql-db mysql -uruoyi -pAa123qwe ruoyi-vue-pro < init/quartz.sql
|
重启容器
再次检查数据库导入结果
1
| docker exec mysql-db mysql -uruoyi -pAa123qwe -e "USE \`ruoyi-vue-pro\`; SHOW TABLES;"
|
3. Redis容器
创建redis_data:mkdir redis_data
启动Redis容器
1 2 3 4 5 6 7
| docker run -d \ --name redis-cache \ --network ruoyi-net \ -p 6379:6379 \ -v $(pwd)/redis_data:/data \ redis:6.2-alpine \ redis-server --requirepass redis123 --appendonly yes
|
验证Redis连接:
1
| docker exec -it redis-cache redis-cli -a redis123 ping
|
4.java
1 2
| cd ../java vim Dockerfile
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| # 第一阶段:构建(如果需要从源码构建) FROM maven:3.8.6-jdk-8 AS builder COPY settings.xml /root/.m2/settings.xml COPY ruoyi-vue-pro /ruoyi-vue-pro WORKDIR /ruoyi-vue-pro RUN mvn clean install package '-Dmaven.test.skip=true'
# 第二阶段: 运行 FROM eclipse-temurin:8-jre ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone WORKDIR /app COPY --from=builder /ruoyi-vue-pro/yudao-server/target/yudao-server.jar yudao-server.jar # JVM 内存优化参数(根据实际情况调整) ENV JAVA_OPTS="-Xms256m -Xmx512m -XX:+UseG1GC" # 健康检查(Spring Boot Actuator 需配置) HEALTHCHECK --interval=30s --timeout=3s \ CMD curl http://localhost:48080 || exit 1 # 启动命令(支持传递额外参数) ENTRYPOINT exec java $JAVA_OPTS -jar yudao-server.jar $0 $@
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
<mirrors> <mirror> <id>aliyunmaven</id> <mirrorOf>*</mirrorOf> <name>Aliyun Maven</name> <url>https://maven.aliyun.com/repository/public</url> </mirror> </mirrors> </settings>
|
拉取后端代码
1
| git clone https://gitee.com/zhijiantianya/ruoyi-vue-pro.git
|
修改后端配置文件:


构建后端镜像:
在java目录下
1
| docker build -t ruoyi-backend -f Dockerfile .
|
启动后端容器
1
| docker run --name ruoyi-back --network ruoyi-net -p 48080:48080 ruoyi-backend
|
5.nginx
1 2 3 4 5
| mkdir conf
cd conf
vim ruoyi.conf
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| server { listen 80; charset utf-8; server_name _;
location / { root /usr/share/nginx/html; index index.html; }
location /prod-api/ { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://192.168.13.8:48080/; # 这个地址要设置当前主机的内网ip地址. } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| # ========= 阶段1: 构建阶段 ========= FROM node:20-alpine AS build
# 设置工作目录 WORKDIR /app
# 复制依赖配置文件 (package.json / package-lock.json 或 pnpm-lock.yaml) COPY yudao-ui-admin-vue3 ./
# 安装依赖 (可换淘宝镜像加速) RUN npm config set registry https://registry.npmmirror.com/ \ && npm install -g pnpm@8.15.5 \ && pnpm install
# 构建生产环境静态文件 RUN npm run build:prod -- --debug
# ========= 阶段2: 运行阶段 ========= FROM nginx:latest
# 删除默认配置 RUN rm -rf /usr/share/nginx/html/*
# 复制构建产物到 Nginx 默认目录 COPY --from=build /app/dist-prod /usr/share/nginx/html
# 可选: 替换 Nginx 配置 (解决 history 路由刷新 404 问题) COPY conf/ruoyi.conf /etc/nginx/conf.d/default.conf
# 暴露端口 EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
|
拉取前端代码
1
| git clone https://gitee.com/yudaocode/yudao-ui-admin-vue3.git
|
修改配置文件
v1使用宿主机ip(成功)
宿主机ip

宿主机ip


原因:前端代码里包含了后端ip,可直接访问到后端。
此时,nginx的后端部分是不需要写的。
v2使用容器名(失败)
1 2 3 4 5
| vite_base_url='http://java_back:48080' vite_base_url='http://java_back:48080'
#conf/ruoyi.conf proxy_pass http://java_back:48080/;
|
原因:location /prod-api/ {}的/prod-api不能与前端代码匹配,只能访问前端,一直卡在前端。
v3使用容器名(成功)
1 2 3 4 5
| vite_base_url='/prod-api' vite_base_url='/prod-api'
#conf/ruoyi.conf proxy_pass http://java_back:48080/;
|
原因:location /prod-api/ {}的/prod-api能与前端代码的vite_base_url=’/prod-api’的/prod-api匹配,
匹配成功后会跳转到proxy_pass http://java_back:48080/;由反向代理访问。
v4使用容器名(成功)
1 2 3 4 5
| vite_base_url='http://java_back:48080' vite_base_url='http://java_back:48080'
#conf/ruoyi.conf 不需要后端部分
|
原因:前端代码的vite_base_url=’http://java_back:48080'包含了后端地址。
缺陷:需要前端能访问后端且能解析域名,但生产环境中前端是不能访问后端的。
在nignx目录下
构建前端镜像
1
| docker build -t ruoyi:v1 .
|
启动前端容器
1
| docker run --name ruoyi --network ruoyi-net -p 80:80 ruoyi:v1
|
浏览器用无痕浏览访问宿主机ip
