当前位置: 首页 > news >正文

在Ubuntu 20.04上用Docker Compose一键部署RuoYi-Vue开发环境(含MySQL 5.7和Redis 6.2)

基于Docker Compose的RuoYi-Vue全栈开发环境容器化实践

在当今快节奏的软件开发领域,如何快速搭建稳定、可复现的开发环境已成为提升团队协作效率的关键因素。传统的手动配置方式不仅耗时耗力,还容易因环境差异导致"在我机器上能运行"的经典问题。本文将介绍如何利用Docker Compose容器编排技术,在Ubuntu 20.04系统上快速部署RuoYi-Vue前后端分离框架的完整开发环境,实现真正意义上的"一键部署"。

1. 环境架构设计与准备工作

RuoYi-Vue作为基于Spring Boot和Vue.js的企业级快速开发平台,其标准环境依赖包括MySQL数据库、Redis缓存以及Node.js运行环境。传统部署方式需要分别在主机上安装配置这些组件,而容器化方案则通过隔离的环境封装解决了版本冲突和依赖管理难题。

基础环境要求

  • Ubuntu 20.04 LTS(其他Linux发行版需调整部分命令)
  • Docker Engine ≥20.10.14
  • Docker Compose ≥2.5.1
  • 4GB以上内存(建议8GB)
  • 20GB可用磁盘空间

验证Docker环境是否就绪:

# 检查Docker版本 docker --version # 检查Docker Compose版本 docker compose version

若尚未安装Docker,可通过以下命令快速配置:

# 安装必要工具 sudo apt-get update && sudo apt-get install -y ca-certificates curl gnupg lsb-release # 添加Docker官方GPG密钥 sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg # 设置稳定版仓库 echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # 安装Docker引擎 sudo apt-get update && sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin # 验证安装 sudo docker run hello-world

2. Docker Compose编排文件深度解析

容器化部署的核心在于docker-compose.yml文件的编写,该文件定义了服务拓扑、网络配置和存储策略。下面是一个针对RuoYi-Vue优化的完整配置方案:

version: '3.8' services: mysql: image: mysql:5.7 container_name: ruoyi-mysql environment: MYSQL_ROOT_PASSWORD: RuoYiAdmin123 MYSQL_DATABASE: ry-vue TZ: Asia/Shanghai volumes: - mysql_data:/var/lib/mysql - ./init-sql:/docker-entrypoint-initdb.d ports: - "3306:3306" healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 5s timeout: 10s retries: 3 networks: - ruoyi-net redis: image: redis:6.2-alpine container_name: ruoyi-redis ports: - "6379:6379" volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 3s retries: 5 networks: - ruoyi-net backend: build: context: ./ruoyi-admin dockerfile: Dockerfile container_name: ruoyi-backend depends_on: mysql: condition: service_healthy redis: condition: service_healthy ports: - "8080:8080" volumes: - ./ruoyi-admin:/app - ~/.m2:/root/.m2 environment: SPRING_PROFILES_ACTIVE: dev networks: - ruoyi-net frontend: build: context: ./ruoyi-ui dockerfile: Dockerfile container_name: ruoyi-frontend ports: - "80:80" volumes: - ./ruoyi-ui:/app - /app/node_modules networks: - ruoyi-net volumes: mysql_data: redis_data: networks: ruoyi-net: driver: bridge

关键配置说明

  1. MySQL服务

    • 使用官方5.7镜像,通过volume实现数据持久化
    • 自动创建ry-vue数据库
    • 将SQL初始化脚本挂载到/docker-entrypoint-initdb.d目录实现自动执行
    • 配置健康检查确保服务可用性
  2. Redis服务

    • 选用轻量级alpine版本镜像
    • 数据卷持久化缓存内容
    • 自定义健康检查策略
  3. 后端服务

    • 基于自定义Dockerfile构建
    • 挂载Maven仓库目录加速依赖下载
    • 依赖MySQL和Redis的健康状态
  4. 前端服务

    • 单独构建Vue开发环境
    • 匿名卷隔离node_modules避免主机冲突
    • 开发模式热加载支持

3. 项目配置与容器化改造

3.1 后端服务容器化

ruoyi-admin目录下创建Dockerfile

FROM maven:3.8.6-openjdk-11 AS build WORKDIR /app COPY pom.xml . RUN mvn dependency:go-offline COPY src ./src RUN mvn package -DskipTests FROM openjdk:11-jre WORKDIR /app COPY --from=build /app/target/ruoyi-admin.jar . EXPOSE 8080 ENTRYPOINT ["java", "-jar", "ruoyi-admin.jar"]

关键配置调整

  1. 修改application.yml中的Redis连接配置:
redis: host: redis port: 6379
  1. 更新application-druid.yml数据库连接:
url: jdbc:mysql://mysql:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8 username: root password: RuoYiAdmin123

注意:容器间通信使用服务名而非IP地址,这是Docker Compose提供的DNS解析功能

3.2 前端服务容器化

ruoyi-ui目录下创建Dockerfile

FROM node:16 AS builder WORKDIR /app COPY package*.json ./ RUN npm install --registry=https://registry.npmmirror.com COPY . . RUN npm run build FROM nginx:alpine COPY --from=builder /app/dist /usr/share/nginx/html COPY ./nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 80

创建nginx.conf配置文件:

server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; try_files $uri $uri/ /index.html; index index.html index.htm; } location /prod-api/ { proxy_pass http://backend:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }

4. 一键部署与开发调试

4.1 启动完整环境

# 克隆项目代码 git clone https://gitee.com/y_project/RuoYi-Vue.git cd RuoYi-Vue # 初始化SQL脚本 mkdir -p init-sql cp sql/ry_20210908.sql init-sql/1_ry.sql cp sql/quartz.sql init-sql/2_quartz.sql # 构建并启动所有服务 docker compose up -d

服务启动验证

# 查看容器状态 docker compose ps # 检查后端日志 docker compose logs -f backend # 访问前端 curl http://localhost

4.2 开发模式热部署配置

对于日常开发,建议采用以下优化配置:

  1. 后端热加载
# 在docker-compose.yml中修改backend服务 backend: volumes: - ./ruoyi-admin:/app - ~/.m2:/root/.m2 environment: SPRING_DEVTOOLS_RESTART_ENABLED: "true"
  1. 前端热更新
# 修改frontend服务 frontend: ports: - "8081:8080" command: npm run dev

4.3 常见问题排查

数据库连接失败

  • 检查MySQL容器日志:docker compose logs mysql
  • 验证网络连通性:docker compose exec backend ping mysql

前端代理配置错误

  • 检查Nginx访问日志:docker compose logs frontend
  • 验证API端点:curl http://localhost/prod-api/captchaImage

内存不足问题

# 调整Docker资源限制 sudo systemctl edit docker # 添加以下内容 [Service] MemoryLimit=4G

5. 生产环境优化建议

当需要将容器化方案扩展到生产环境时,应考虑以下增强措施:

  1. 安全加固

    • 为MySQL创建专用应用用户而非使用root
    • 配置Redis密码认证
    • 使用HTTPS加密前端流量
  2. 性能优化

    • 为Java应用配置JVM内存参数
    • 启用Redis持久化策略
    • 配置MySQL查询缓存
  3. 高可用方案

    • 使用Swarm或Kubernetes替代单机Compose
    • 实现数据库主从复制
    • 配置Redis哨兵模式
  4. 监控方案

# 示例:添加Prometheus监控 services: prometheus: image: prom/prometheus ports: - "9090:9090" volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml networks: - ruoyi-net

通过本文介绍的Docker Compose方案,开发者可以在几分钟内完成RuoYi-Vue全栈环境的搭建,且能保证团队所有成员的环境完全一致。这种容器化方法不仅适用于本地开发,也为后续的CI/CD流水线奠定了坚实基础。

http://www.jsqmd.com/news/681612/

相关文章:

  • 保姆级教程:在V831开发板上用新版镜像播放MP4视频(含音频)
  • 抖音批量下载工具完整指南:轻松保存视频、合集与直播内容
  • 海康ISAPI接口调优笔记:如何正确设置NET_DVR_STDXMLConfig的超时与缓冲区,避免数据截断和线程卡死
  • 嘉为蓝鲸 DevOps 平台与 AI 的深度融合:助力企业加速数字化转型
  • 解放双手!利用海康VM全局脚本+通讯管理打造自动化视觉控制系统
  • 2.4G无线音箱PCB设计方案
  • 从‘摆烂’到严谨:深入理解AD24设计规则检查(DRC)的‘在线’与‘批量’模式
  • 告别掏钥匙!一文搞懂汽车无钥匙进入(PKE/RKE)背后的工作原理与安全机制
  • 告别编码混乱!PDMS二次开发神器Naki.CI,手把手教你搞定材料编码与GPART创建
  • 抖音批量下载工具终极指南:如何快速保存视频、合集和用户主页
  • VisionMaster多相机定位实战:手把手教你搞定800mm大物料抓取(附完整标定流程)
  • NCJ29D5芯片——从射频前端到基带处理的UWB系统架构剖析
  • 别再乱用usermod了!Linux用户组管理的3个高频场景与避坑指南(附CentOS/Ubuntu差异)
  • FCOS vs YOLOv5:无锚框与有锚框检测器到底怎么选?项目落地避坑指南
  • 2026 年涉外离婚律所官方甄选 客观评测助力理性选择律所 - 速递信息
  • 避坑指南:Microsemi Libero SoC + ModelSim仿真LED项目时,新手最易踩的5个雷
  • PostgreSQL 12.2 源码探秘:手把手带你拆解Heap表文件,看懂数据在磁盘上的真实模样
  • 哪些独立站外链策略最有效? 每天多拿50个询盘的绝招
  • 【开源项目】tinyprintf:为资源受限MCU定制的极简格式化输出库
  • 把MinIO变成Windows系统服务:用WinSW实现开机自启与后台运行
  • TNAHosting测评:AMD Ryzen 5900X/1GB内存/NVMe硬盘/1Gbps带宽芝加哥VPS(Ubuntu 22.04.5 LTS)
  • RK3588驱动编译踩坑记:手把手教你解决‘-Werror’导致的‘all warnings being treated as errors’
  • nmcli 无法配置loopback口地址
  • 2026年全国镀锌钢板水箱厂家优选 从技术参数到工程应用的全面考量 - 深度智识库
  • 除了‘机械音’,开源TTS工具Ekho还能怎么玩?试试给它换个‘声音’
  • WeChatPad:Android应用多设备登录的技术实现与架构解析
  • K210串口通信保姆级教程:从MaixPy配置到与STM32单片机数据互传实战
  • FPGA设计中的AXI4 vs AXI4-Stream:选哪个?用Xilinx Zynq-7000的DMA传输案例说清楚
  • 5分钟快速上手:Nexus Mods App模组管理神器完全指南
  • 别再凭感觉调CAN采样点了!手把手教你用VH6501精准测量(附500Kbps实测波形)