前言

本文详细阐述Ruo-Yi前后端分离项目的Docker化部署全流程,涵盖技术原理与实操步骤。全文从架构解析到docker-compose编排实践,提供完整的运维部署指南。标题大纲如下:

  1. 总体架构与运维关注点
  2. 后端技术栈与运维部署
  3. 系统架构图与数据流
  4. 运维部署与实践
  5. docker-compose_编排ruoyi实践
  6. 拉取maven镜像
  7. 使用dockerfile定义后端java项目的运行环境
  8. 编写docker-compose.yml文件构建ruoyi项目
  9. 使用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_数据流向

访问8888端口

返回静态资源

代理/prod-api/请求

JDBC操作

Redis操作

用户浏览器

Nginx 1.25.3

Java应用集群

MySQL 5.7

Redis集群

3.2_运维关键路径

请求处理流

  1. 用户访问 http://服务器IP:8888
  2. Nginx返回前端静态资源
  3. 前端JS发起 /prod-api/ 开头的API请求
  4. Nginx将API请求反向代理至后端服务
  5. Spring Boot处理业务逻辑并访问数据库/缓存
  6. 返回响应经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

浏览器请求路径:

  1. 静态资源:http://IP:8888 → Nginx返回dist/目录文件
  2. 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参数设置字符集,故未添加此映射

更多推荐