50 Docker项目实战:RuoYi前后端部署项目
前言
本文详细阐述Ruo-Yi前后端分离项目的Docker化部署全流程,涵盖技术原理与实操步骤。全文从架构解析到docker-compose编排实践,提供完整的运维部署指南。标题大纲如下:
- 总体架构与运维关注点
- 后端技术栈与运维部署
- 系统架构图与数据流
- 运维部署与实践
- docker-compose_编排ruoyi实践
- 拉取maven镜像
- 使用dockerfile定义后端java项目的运行环境
- 编写docker-compose.yml文件构建ruoyi项目
- 使用docker-compose启动ruoyi项目
理论部分
1_总体架构与运维关注点
- RuoYi采用前后端分离架构,使前端与后端作为独立应用程序存在,实现开发、部署和扩展的解耦。
1.1_架构特性
前后端分离:前端与后端独立部署,通过HTTP RESTful API通信,提升部署灵活性但增加网络配置复杂性。
①_前端特性
静态Web应用:通常由Vue.js构建,需要Web服务器(如Nginx)托管静态资源(HTML/CSS/JS)。
②_后端特性
Java动态应用:作为Spring Boot应用运行在内嵌Tomcat容器中,通过API提供业务服务。
③_通信机制
HTTP RESTful API:前后端通信协议,运维需关注API网关配置、跨域(CORS)设置及网络稳定性。
1.2_运维挑战
网络复杂性:需配置Nginx反向代理实现API请求转发,同时处理静态资源服务。
组件依赖:涉及Nginx、JVM、MySQL、Redis等多组件协同,增加部署和监控复杂度。
2_后端技术栈与运维部署
- RuoYi后端采用Spring Boot框架构建,集成安全框架、数据持久层和缓存组件。
2.1_Spring_Boot框架
可执行JAR包:Spring Boot将应用打包为带内嵌Tomcat的JAR文件,简化部署流程,无需外部Web服务器。
①_Java环境依赖
JRE版本要求:运行需正确安装指定版本Java运行环境(文档中隐含JDK 1.8)。
2.2_Security框架
Spring_Security:提供认证与授权功能,运维需理解其会话管理机制(Session或JWT)。
①_集群部署要点
会话同步:集群环境下需配置会话保持或分布式令牌服务,确保用户会话连续性。
2.3_Data层组件
MyBatis:ORM框架将SQL语句存于XML文件,由运维协助定位数据库性能瓶颈。
①_MySQL运维
数据库管理:需维护MySQL安装、用户权限、备份策略及慢查询优化。
2.4_Cache组件
Redis:用于存储系统会话、验证码和缓存数据。
①_Redis高可用
高可用方案:需部署主从复制、哨兵(Sentinel)或集群模式保障服务连续性。
②_持久化策略
RDB与AOF:配置内存快照(RDB)或追加日志(AOF)防止数据丢失。
3_系统架构图与数据流
- 展示用户请求到数据处理的完整链路,明确各组件间交互关系。
3.1_数据流向
3.2_运维关键路径
请求处理流:
- 用户访问
http://服务器IP:8888 - Nginx返回前端静态资源
- 前端JS发起
/prod-api/开头的API请求 - Nginx将API请求反向代理至后端服务
- Spring Boot处理业务逻辑并访问数据库/缓存
- 返回响应经Nginx返回至浏览器
4_运维部署与实践
- 阐述从部署模式到监控策略的全方位运维方案。
4.1_部署模式
单机部署:所有组件集中部署,适用于测试环境。
分布式部署:组件分离部署于不同服务器,实现生产环境解耦。
集群部署:Spring Boot多实例配Nginx负载均衡,提升可用性。
4.2_关键配置项
Nginx配置要点:
proxy_pass:需精确配置后端服务地址(如http://java.com:8080/)- 超时设置:控制长连接等待时间
- 负载均衡算法:轮询或IP哈希等策略
应用配置: application.yml:配置数据库连接、Redis地址、文件路径- 环境隔离:生产环境使用
application-prod.yml
4.3_监控体系
应用监控:
- Druid监控:内置SQL执行分析
- Spring Boot Actuator:配合Prometheus实现JVM监控
系统监控: - Zabbix/Prometheus:监控CPU/内存/磁盘IO
日志管理: - ELK/EFK栈:集中收集、存储和检索应用日志
4.4_高可用策略
应用层:Nginx负载均衡调度无状态Java实例
数据层:
- MySQL:主从复制 + MHA高可用方案
- Redis:哨兵模式或Cluster集群
备份体系: - MySQL:全量/增量备份
- Redis:RDB快照备份
- 应用服务器:关键文件备份
实验部分
1_docker-compose_编排ruoyi实践
1.1_环境准备
服务器规格:Docker 20.10.18,7G内存,30G以上磁盘空间
- 安装docker
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce-20.10.18 docker-ce-cli-20.10.18 containerd.io
- docker加速器
mkdir /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors":[
"https://xdisb0be.mirror.aliyuncs.com",
"https://1c786b17d3614c7a876977ea63b80b7e.mirror.swr.myhuaweicloud.com"
]
}
EOF
systemctl daemon-reload
systemctl enable --now docker
① 工作目录创建
mkdir /opt/ruoyi
mkdir:创建目录命令
/opt/ruoyi:RuoYi项目根目录
② 系统初始化
- 下载docker-compose到指定路径(需要魔法,或者下载到本地然后上传)
curl -L "https://github.com/docker/compose/releases/download/1.21.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
chmod +x:添加执行权限
/usr/local/bin:系统可执行文件目录
- 拉取基础镜像
docker pull nginx:1.25.3
docker pull mysql:5.7
docker pull redis:latest
docker pull:下载镜像命令
镜像版本:nginx:1.25.3/mysql:5.7/redis:latest
- 安装git工具
yum install -y git
yum install:CentOS包管理命令
-y:自动确认安装
1.2_代码获取与配置
① 代码克隆
cd /opt/ruoyi
git clone https://gitee.com/y_project/RuoYi-Vue.git
git clone:代码拉取命令
网址:https://gitee.com/y_project/RuoYi-Vue.git
② 配置文件修改
application-druid.yml:数据库连接配置
vim /opt/ruoyi/RuoYi-Vue/ruoyi-admin/src/main/resources/application-druid.yml
# 主库数据源
master:
url: jdbc:mysql://mysql.server:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: 123456
需修改数据库地址和密码
mysql.server:后面创建mysql容器名称
password:密码修改为123456
application.yml:主应用配置
vim /opt/ruoyi/RuoYi-Vue/ruoyi-admin/src/main/resources/application.yml
# redis 配置
redis:
# 地址
host: redis.server
# 端口,默认为6379
port: 6379
需修改Redis地址等生产参数
redis.server:修改为之后创建redis容器的名称
1.3_前端构建环境
① Node容器启动
docker run -it --rm -v /opt/ruoyi/RuoYi-Vue/ruoyi-ui:/opt node:12 /bin/bash
docker run:创建并运行容器
-it:交互式终端
--rm:退出自动删除容器
-v:卷映射(本地./ruoyi-ui→容器/opt)
② 前端代码打包
cd /opt
npm install
npm run build:prod
npm install:安装前端依赖
npm run build:prod:生产环境打包命令
输出目录:/opt/ruoyi/RuoYi-Vue/ruoyi-ui/dist(包含前端静态文件)
1.4_拉取maven镜像
①_后端构建环境
- Maven容器启动
docker run -it --rm -v /opt/ruoyi/RuoYi-Vue:/vue maven:3.6.3-openjdk-11 /bin/bash
镜像:maven:3.6.3-openjdk-11
卷映射:本地代码→容器/vue目录
- JAR包构建
cd /vue
mvn package
# 或
mvn -DskipTests -B clean package
mvn package:Maven打包命令
mvn:调用 Maven 工具
clean:清理之前生成的文件(比如旧的编译结果)
package:重新编译代码并打包(生成 jar/war 等文件)
-DskipTests:跳过测试(省时间,适合快速打包)
-B:批处理模式(减少无关输出,日志更简洁)
输出文件:/opt/ruoyi/RuoYi-Vue/ruoyi-admin/target/ruoyi-admin.jar
功能:将Java源码编译为可执行JAR
1.5_使用dockerfile定义后端java项目的运行环境
①_Java环境配置
- 目录和文件准备
mkdir /opt/ruoyi/java
cp /opt/ruoyi/RuoYi-Vue/ruoyi-admin/target/ruoyi-admin.jar /opt/ruoyi/java
cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/epel.repo /opt/ruoyi/java/
关键路径:
- JAR源路径:
/opt/ruoyi/RuoYi-Vue/ruoyi-admin/target/ruoyi-admin.jar- 目标路径:
/opt/ruoyi/java/ruoyi-admin.jar
② Dockerfile创建
tee /opt/ruoyi/java/Dockerfile <<-'EOF'
FROM centos:7
RUN rm -rf /etc/yum.repos.d/*
COPY CentOS-Base.repo /etc/yum.repos.d/
COPY epel.repo /etc/yum.repos.d/
RUN yum clean all && yum makecache
RUN yum -y install java-1.8.0
WORKDIR /opt
COPY ./ruoyi-admin.jar /opt/
CMD [ "java","-jar","ruoyi-admin.jar" ]
EOF
FROM centos:7:基础镜像
COPY:导入阿里云仓库配置文件
yum install:安装JDK 1.8
CMD:容器启动命令(执行JAR包)
1.6_编写docker-compose.yml文件构建ruoyi项目
①_基础文件配置
- Nginx配置文件
tee /opt/ruoyi/java/nginx.conf <<-'EOF'
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 4096;
include /etc/nginx/mime.types;
default_type application/octet-stream;
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html;
}
location /prod-api/ {
proxy_pass http://java.com:8080/;
}
}
}
EOF
user nginx:指定用户
worker_processes auto:设置工作进程数为CPU核心数
worker_connections:允许worker进程数量
error_log:报错日志
log_format:访问日志格式
access_log:访问日志
include:引入外部配置文件
sendfile:开启文件传输
tcp_nopush:减少网络数据包数量,提升传输效率(类似"攒够一批数据再发送")
tcp_nodelay:禁用 Nagle 算法,让数据包立即发送,降低传输延迟。
keepalive_timeout:控制客户端连接保持空闲的最长时间,超时后自动关闭。
types_hash_max_size:最大文件,Nginx MIME 类型哈希表的大小设置。
listen 80:Nginx监听80端口
location /prod-api/:API请求路由规则
proxy_pass:反向代理目标地址
② docker-compose.yml
tee /opt/ruoyi/docker-compose.yaml <<-'EOF'
version: '3'
services:
ruoyi-web:
image: nginx:1.25.3
container_name: ruoyi-web
hostname: ruoyi-web
environment:
- LANG=C.UTF-8
- LC_ALL=C.UTF-8
ports:
- 8888:80
volumes:
- /opt/ruoyi/RuoYi-Vue/ruoyi-ui/dist/:/usr/share/nginx/html/
- /opt/ruoyi/java/nginx.conf:/etc/nginx/nginx.conf:ro
links:
- java:java.com
depends_on:
- java
java:
build: ./java
container_name: java.server
hostname: java
environment:
- LANG=C.UTF-8
- LC_ALL=C.UTF-8
links:
- db:mysql.server
- redis:redis.server
depends_on:
- db
- redis
db:
image: mysql:5.7
container_name: mysql.server
hostname: db
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=ry-vue
- LANG=C.UTF-8
- LC_ALL=C.UTF-8
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_general_ci
volumes:
- /opt/mysql-data4:/var/lib/mysql
- /opt/ruoyi/RuoYi-Vue/sql:/docker-entrypoint-initdb.d
redis:
image: redis
container_name: redis.server
hostname: redis:redis.server
environment:
- LANG=C.UTF-8
- LC_ALL=C.UTF-8
EOF
服务说明:
- ruoyi-web:Nginx服务,映射主机8888→容器80端口
- java:从
./java目录构建的JAR运行环境- db:MySQL服务,初始化目录
./RuoYi-Vue/sql- redis:缓存服务
环境变量:MYSQL_ROOT_PASSWORD=123456:数据库密码MYSQL_DATABASE=ry-vue:初始化数据库名
2_使用docker-compose启动ruoyi项目
2.1_服务启动
cd /opt/ruoyi
docker-compose up
关键路径:必须在
/opt/ruoyi目录执行
端口映射:8888(主机)→80(Nginx容器)
依赖关系:按db→redis→java→ruoyi-web顺序启动
2.2_使用验证
访问测试地址:http://192.168.10.23:8888
浏览器请求路径:
- 静态资源:
http://IP:8888→ Nginx返回dist/目录文件- API请求:
http://IP:8888/prod-api/system/user→ Nginx代理至Java服务
结语
前后端分离:实现前端静态资源与后端API服务解耦,需Nginx代理API请求路径(/prod-api/)。
Docker编排核心:docker-compose.yml定义四服务联动,Nginx挂载静态文件+代理8080端口,Java服务依赖数据库。
网络通信:容器通过自定义网络互通,Nginx通过links: java:java.com解析后端地址。
初始化关键:MySQL卷映射/opt/mysql-data4保留数据,SQL脚本目录./RuoYi-Vue/sql自动初始化。
[!question] 为什么API请求路径必须配置为/prod-api/?
因为RuoYi前端项目在构建时设置了代理前缀,所有API请求都附加/prod-api/路径,Nginx需匹配该路径转发到后端
[!question] 容器间如何实现服务发现?
通过docker-compose的links机制,内部服务使用hostname即可通信(如java容器访问mysql.server解析为db容器IP)
[!question] 如何验证Redis连接是否成功?
进入Java容器执行redis-cli -h redis.server ping,返回PONG表示连接正常
[!question] 为什么MySQL卷映射需要指定/etc/mysql/conf.d目录?
用于挂载自定义配置文件,但本项目仅使用command参数设置字符集,故未添加此映射
更多推荐


所有评论(0)