创建目录

1
2
mkdir -p ruoyi-project/{redis,nginx,mysql,java}
cd ruoyi-project

目录结构:

1. 创建Docker自定义网络

1
docker network create ruoyi-net

2.mysql

1
cd 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容器

1
cd ../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
vim settings.xml
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
vim Dockerfile
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(成功)

1
vim env.local

宿主机ip

1
vim env.prod

宿主机ip

1
vim vite.config.ts


原因:前端代码里包含了后端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