基于Docker Compose的RuoYi-Cloud微服务全家桶容器化部署指南
在微服务架构日益普及的今天,如何高效、快速地部署一套完整的微服务系统成为开发者面临的重要挑战。传统的手动部署方式不仅步骤繁琐,而且容易因环境差异导致各种问题。本文将介绍如何利用Docker Compose技术,实现RuoYi-Cloud微服务系统的一键式容器化部署,涵盖Nacos、Redis、MySQL等核心组件的集成配置。
1. 环境准备与项目架构解析
RuoYi-Cloud是一个基于Spring Cloud Alibaba的企业级微服务快速开发平台,采用前后端分离架构,包含网关、认证中心、业务模块等多个组件。传统部署方式需要手动安装配置各种中间件,而容器化部署则能显著提升效率和一致性。
系统核心组件:
- Nacos:服务注册与配置中心(默认端口8848)
- Redis:缓存服务(默认端口6379)
- MySQL:关系型数据库(默认端口3306)
- Gateway:API网关服务(端口8080)
- Auth:认证中心(端口9200)
- System:系统模块(端口9201)
提示:确保本地已安装Docker(版本20.10.0+)和Docker Compose(版本1.29.0+),可通过
docker --version和docker-compose --version命令验证。
# 检查Docker环境 docker info # 检查Compose版本 docker-compose version2. Docker化改造与镜像构建
2.1 项目结构调整
从Gitee克隆项目后,需为每个微服务模块添加Dockerfile:
RuoYi-Cloud/ ├── docker-compose.yml ├── ruoyi-gateway/ │ ├── Dockerfile │ └── ... ├── ruoyi-auth/ │ ├── Dockerfile │ └── ... └── ...2.2 典型Dockerfile示例
以网关模块为例,Dockerfile内容如下:
# 基础镜像 FROM openjdk:8-jdk-alpine # 维护者信息 LABEL maintainer="ruoyi@example.com" # 设置时区 RUN apk add --no-cache tzdata && \ cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ echo "Asia/Shanghai" > /etc/timezone # 添加应用jar包 ARG JAR_FILE=target/ruoyi-gateway.jar COPY ${JAR_FILE} app.jar # 暴露端口 EXPOSE 8080 # 启动命令 ENTRYPOINT ["java","-jar","/app.jar"]2.3 多阶段构建优化
对于生产环境,推荐使用多阶段构建减少镜像体积:
# 构建阶段 FROM maven:3.8.4-openjdk-8 AS builder WORKDIR /build COPY pom.xml . RUN mvn dependency:go-offline COPY src ./src RUN mvn package -DskipTests # 运行阶段 FROM openjdk:8-jdk-alpine COPY --from=builder /build/target/ruoyi-gateway.jar /app.jar EXPOSE 8080 ENTRYPOINT ["java","-jar","/app.jar"]3. Docker Compose编排配置
3.1 完整compose文件
创建docker-compose.yml文件,集成所有服务:
version: '3.8' services: nacos: image: nacos/nacos-server:2.0.3 container_name: nacos environment: - MODE=standalone - SPRING_DATASOURCE_PLATFORM=mysql - MYSQL_SERVICE_HOST=mysql - MYSQL_SERVICE_DB_NAME=ry-config - MYSQL_SERVICE_USER=root - MYSQL_SERVICE_PASSWORD=123456 ports: - "8848:8848" depends_on: - mysql networks: - ruoyi-net redis: image: redis:6.2.6-alpine container_name: redis command: redis-server --requirepass 123456 ports: - "6379:6379" volumes: - redis-data:/data networks: - ruoyi-net mysql: image: mysql:5.7 container_name: mysql environment: MYSQL_ROOT_PASSWORD: 123456 MYSQL_DATABASE: ry-cloud ports: - "3306:3306" volumes: - mysql-data:/var/lib/mysql - ./sql/ry-cloud.sql:/docker-entrypoint-initdb.d/ry-cloud.sql - ./sql/ry-config.sql:/docker-entrypoint-initdb.d/ry-config.sql networks: - ruoyi-net gateway: build: context: ./ruoyi-gateway container_name: gateway ports: - "8080:8080" environment: - SPRING_PROFILES_ACTIVE=prod - SPRING_CLOUD_NACOS_SERVER_ADDR=nacos:8848 depends_on: - nacos - redis networks: - ruoyi-net auth: build: context: ./ruoyi-auth container_name: auth ports: - "9200:9200" environment: - SPRING_PROFILES_ACTIVE=prod - SPRING_CLOUD_NACOS_SERVER_ADDR=nacos:8848 depends_on: - nacos - redis networks: - ruoyi-net networks: ruoyi-net: driver: bridge volumes: mysql-data: redis-data:3.2 关键配置说明
网络配置:
- 创建专用网络
ruoyi-net,确保各容器间可通过服务名通信 - 避免使用默认的bridge网络,防止端口冲突
数据持久化:
- MySQL数据:挂载到
mysql-data卷 - Redis数据:挂载到
redis-data卷 - Nacos配置:存储在MySQL的
ry-config库中
依赖关系:
- 服务启动顺序:MySQL → Nacos → Redis → 微服务
- 使用
depends_on控制启动依赖
4. 数据库初始化与配置
4.1 数据库脚本准备
在sql目录下准备三个SQL文件:
ry-config.sql:Nacos所需的配置表结构ry-cloud.sql:业务系统表结构ry-seata.sql:分布式事务表结构
注意:SQL文件需使用UTF-8编码,避免中文乱码问题。将SQL文件放在项目根目录的
sql文件夹下,compose文件已配置为容器启动时自动执行。
4.2 Nacos配置导入
通过Nacos API批量导入配置:
# 导出原有配置 curl -X GET "http://localhost:8848/nacos/v1/cs/configs?export=true&group=DEFAULT_GROUP&tenant=&dataId=&search=accurate" -H "Authorization: Bearer $token" # 导入配置(示例) curl -X POST "http://localhost:8848/nacos/v1/cs/configs?import=true&namespace=" -H "Authorization: Bearer $token" -F "file=@config.zip"或使用Nacos控制台手动配置各微服务的application.yml和bootstrap.yml。
5. 系统启动与验证
5.1 一键启动命令
# 构建镜像并启动所有服务 docker-compose up -d --build # 查看运行状态 docker-compose ps # 查看实时日志 docker-compose logs -f gateway5.2 服务健康检查
| 服务 | 检查URL | 预期状态 |
|---|---|---|
| Nacos | http://localhost:8848/nacos | 200 OK |
| Gateway | http://localhost:8080 | 404 |
| Redis | redis-cli ping | PONG |
| MySQL | mysql -uroot -p | 连接成功 |
5.3 常见问题排查
服务注册失败:
- 检查Nacos控制台是否有服务注册
- 验证网络连通性:
docker exec -it gateway ping nacos - 查看应用日志:
docker-compose logs auth
数据库连接问题:
# 进入MySQL容器 docker exec -it mysql mysql -uroot -p123456 # 验证数据库和表是否存在 SHOW DATABASES; USE ry-cloud; SHOW TABLES;6. 生产环境优化建议
6.1 性能调优参数
MySQL容器优化:
mysql: environment: - innodb_buffer_pool_size=1G - innodb_log_file_size=256M - max_connections=500 ulimits: nofile: soft: 65536 hard: 65536JVM参数调整:
# 在Dockerfile的ENTRYPOINT中添加 ENTRYPOINT ["java","-Xms512m","-Xmx1024m","-XX:+UseG1GC","-jar","/app.jar"]6.2 监控与日志方案
Prometheus监控配置:
monitor: image: prom/prometheus ports: - "9090:9090" volumes: - ./prometheus.yml:/etc/prometheus/prometheus.ymlELK日志收集:
logstash: image: docker.elastic.co/logstash/logstash:7.14.0 volumes: - ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf6.3 高可用部署架构
对于生产环境,建议采用以下架构:
- Nacos集群:3节点部署
- Redis哨兵:1主2从3哨兵
- MySQL主从:读写分离
- 微服务多实例:通过Nacos实现负载均衡
nacos1: image: nacos/nacos-server:2.0.3 environment: - MODE=cluster - NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848 nacos2: image: nacos/nacos-server:2.0.3 environment: - MODE=cluster - NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848 nacos3: image: nacos/nacos-server:2.0.3 environment: - MODE=cluster - NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:88487. 开发调试技巧
7.1 远程调试配置
在docker-compose.yml中添加JVM调试参数:
gateway: environment: - JAVA_TOOL_OPTIONS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 ports: - "5005:5005"然后在IDE中创建Remote JVM Debug配置,连接到localhost:5005。
7.2 热部署方案
利用Spring Boot DevTools实现代码热更新:
# 开发环境Dockerfile FROM maven:3.8.4-openjdk-8 as dev WORKDIR /app COPY . . RUN mvn package -DskipTests CMD ["mvn", "spring-boot:run"]7.3 配置管理最佳实践
- 多环境配置:通过Nacos的Namespace隔离不同环境
- 敏感信息加密:使用Nacos的Config Filter机制
- 配置版本控制:定期导出Nacos配置到Git仓库
# 定期备份Nacos配置 docker exec nacos bash -c "tar -czvf /home/nacos/conf-backup.tar.gz /home/nacos/conf" docker cp nacos:/home/nacos/conf-backup.tar.gz .