在CentOS 7.9系统上使用Docker部署RuoYi-Vue前后端分离系统
安装Docker
# 安装必要工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加阿里云镜像
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装Docker引擎
sudo yum install -y docker-ce docker-ce-cli containerd.io
# 查看Docker版本信息
docker -v
# 启动 docker 服务
sudo systemctl start docker
# 停止 docker 服务
sudo systemctl stop docker
# 查看 docker 服务状态
sudo systemctl status docker
# 重启 docker 服务
sudo systemctl restart docker
# 设置开机自启
sudo systemctl enable docker
安装Docker Compose
# github连接不稳定,可能需要梯子
curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 授权
sudo chmod +x /usr/local/bin/docker-compose
# 验证安装
docker-compose --version
准备项目文件
创建项目文件夹
sudo mkdir -p /opt/ruoyi/{mysql/data,mysql/init,redis/data,backend,frontend}
结构为:
/opt/ruoyi/
├── docker-compose.yml # Docker Compose主编排文件
├── mysql/
│ ├── data/ # 数据库数据持久化目录
│ └── init/ # 初始化SQL脚本目录
├── redis/
│ └── data/ # Redis数据持久化目录
├── backend/
│ ├── Dockerfile # 后端镜像构建文件
│ └── ruoyi-admin.jar # 后端JAR包(需上传)
└── frontend/
├── Dockerfile # 前端镜像构建文件
└── dist/ # 前端静态资源(需上传)
配置MySQL与Redis
将RuoYi项目中的数据库初始化SQL文件(ry_xxxxxx.sql和 quartz.sql)上传到 /opt/ruoyi/mysql/init/目录下。
配置后端服务SpringBoot
将本地打包好的 ruoyi-admin.jar文件上传到服务器的 /opt/ruoyi/backend/目录下。
创建后端的Dockerfile
在 /opt/ruoyi/backend/目录下创建 Dockerfile文件:
# 使用较小的JDK基础镜像,这里以OpenJDK 8为例
FROM openjdk:8-jre-slim
# 设定时区
ENV TZ=Asia/Shanghai
# 安装字体库(若依验证码需要)
RUN apt-get update && apt-get install -y --no-install-recommends fontconfig libfreetype6 && rm -rf /var/lib/apt/lists/*
# 设置工作目录
WORKDIR /app
# 将jar包复制到容器内
COPY ruoyi-admin.jar app.jar
# 暴露端口
EXPOSE 8080
# 启动命令
ENTRYPOINT ["java", "-jar", "app.jar"]
配置前端服务Vue
将前端打包生成的 dist文件夹 上传到服务器的 /opt/ruoyi/frontend/目录下。
再把之前准备好的 nginx.conf文件 也上传到 /opt/ruoyi/frontend/目录下。
创建前端的Dockerfile
在 /opt/ruoyi/frontend/目录下创建 Dockerfile文件:
FROM nginx:1.21-alpine
# 将打包好的静态文件复制到Nginx的默认站点目录
COPY dist/ /usr/share/nginx/html/
# 复制自定义的Nginx配置文件
COPY nginx.conf /etc/nginx/conf.d/default.conf
编写Docker Compose编排文件
在 /opt/ruoyi/目录下创建 docker-compose.yml文件
version: '3.8'
services:
ruoyi-mysql:
image: mysql:8.0
container_name: ruoyi-mysql
command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password
environment:
MYSQL_ROOT_PASSWORD: root@123 # 请修改为强密码
MYSQL_DATABASE: ry-vue # 数据库名,需与RuoYi配置一致
ports:
- "3306:3306"
volumes:
- ./mysql/data:/var/lib/mysql # 数据持久化
- ./mysql/init:/docker-entrypoint-initdb.d # 初始化SQL
networks:
- ruoyi-net
ruoyi-redis:
image: redis:6.2-alpine
container_name: ruoyi-redis
ports:
- "6379:6379"
volumes:
- ./redis/data:/data
command: redis-server --requirepass redis@123 # 请修改为强密码,需与RuoYi配置一致
networks:
- ruoyi-net
ruoyi-backend:
build: ./backend # 根据backend目录下的Dockerfile构建镜像
container_name: ruoyi-backend
depends_on: # 明确依赖关系,先启动db和redis
- ruoyi-mysql
- ruoyi-redis
environment:
TZ: Asia/Shanghai
networks:
- ruoyi-net
# 不直接映射宿主机端口,通过Nginx反向代理访问,更安全
ruoyi-frontend:
build: ./frontend # 根据frontend目录下的Dockerfile构建镜像
container_name: ruoyi-frontend
depends_on:
- ruoyi-backend
ports:
- "80:80" # 将前端Nginx服务暴露在80端口
networks:
- ruoyi-net
networks:
ruoyi-net: # 创建自定义网络,便于容器间通过服务名(如ruoyi-backend)通信
⚠注:这里配置的要与后端代码ruoyi-admin/src/main/resources/application.yml和application-druid.yml中的数据库名,账号,密码,端口等保持一致。
redis:
host: ruoyi-redis
port: 6379
password: redis@123 # 与docker-compose.yml中redis的command密码一致
url: jdbc:mysql://ruoyi-mysql:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: root@123 # 与docker-compose.yml中的MYSQL_ROOT_PASSWORD一致
构建并启动所有服务
cd /opt/ruoyi
# 构建镜像并启动所有容器(-d 表示后台运行)
docker-compose up -d --build
验证部署与排查
检查容器状态:
docker-compose ps
所有服务(mysql, redis, backend, frontend)的状态应为 "Up"。
查看日志:
docker logs ruoyi-backend # 查看后端日志
docker logs ruoyi-frontend # 查看前端Nginx日志
docker logs ruoyi-mysql # 查看数据库日志
访问
在浏览器中输入 http://你的服务器IP,应能访问到RuoYi-Vue的登录界面。默认用户名是 admin,密码是 admin123
⚠注:确保服务器防火墙已开放80、3306、6379等端口。