基于Docker Compose编排ruoyi-vue-pro全栈项目一键部署实践

发布时间:2026/7/3 23:05:36

基于Docker Compose编排ruoyi-vue-pro全栈项目一键部署实践 1. Docker Compose与传统部署方式对比在开始ruoyi-vue-pro项目的部署之前我们先来了解下Docker Compose编排与传统部署方式的区别。传统部署通常需要手动安装和配置每个服务组件比如MySQL数据库、Redis缓存、Nginx反向代理等这个过程既耗时又容易出错。我曾经在一个项目中采用传统方式部署光是环境搭建就花了整整两天时间期间还遇到了各种依赖冲突和端口占用问题。相比之下Docker Compose的优势就非常明显了。它通过一个YAML文件定义所有服务及其依赖关系实现一键启动整个应用栈。具体来说有以下几点优势环境一致性所有服务都运行在容器中与宿主机环境隔离避免了在我机器上能跑的问题快速部署一条命令就能启动整个应用新成员加入团队时不需要再折腾环境资源隔离每个服务都有独立的环境不会互相干扰版本控制docker-compose.yml文件可以纳入版本管理方便追踪变更这里给出一个简单的对比表格特性传统部署Docker Compose编排部署时间数小时到数天几分钟环境一致性依赖人工保证通过容器自动保证扩展性需要手动操作修改配置即可学习成本需要了解每个组件只需掌握Docker基础适合场景简单单机部署复杂微服务架构2. 环境准备与Docker安装2.1 系统要求在开始之前确保你的系统满足以下要求Linux服务器推荐Ubuntu 20.04或CentOS 7至少4GB内存ruoyi-vue-pro运行需要约2GB20GB可用磁盘空间已安装Docker Engine 20.10已安装Docker Compose 2.0我建议使用云服务器而不是本地开发机进行部署因为云服务器的网络环境更稳定也更容易配置域名和HTTPS。如果你使用阿里云或腾讯云记得在安全组中开放需要用到的端口如80、443、3306、6379等。2.2 Docker安装如果你的系统还没有安装Docker可以按照以下步骤安装# 卸载旧版本 sudo apt-get remove docker docker-engine docker.io containerd runc # 安装依赖 sudo apt-get update sudo apt-get install \ 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 docker-ce docker-ce-cli containerd.io docker-compose-plugin # 验证安装 sudo docker run hello-world安装完成后建议将当前用户加入docker组避免每次都要sudosudo usermod -aG docker $USER newgrp docker2.3 Docker Compose安装对于较新的Docker版本Compose已经作为插件包含在内。如果你需要单独安装可以使用以下命令# 下载最新版Docker Compose sudo curl -L https://github.com/docker/compose/releases/download/v2.12.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose # 添加执行权限 sudo chmod x /usr/local/bin/docker-compose # 验证安装 docker-compose --version3. ruoyi-vue-pro项目准备3.1 获取项目代码ruoyi-vue-pro是一个基于Spring Boot和Vue.js的前后端分离企业级开发平台。我们可以直接从GitHub克隆最新代码git clone https://github.com/YunaiV/ruoyi-vue-pro.git cd ruoyi-vue-pro如果你只需要部署而不做开发也可以直接下载编译好的发布包。不过为了演示完整的Docker Compose编排过程我们这里使用源码方式。3.2 项目结构分析ruoyi-vue-pro的标准目录结构如下ruoyi-vue-pro/ ├── ruoyi-admin # 后台管理前端 ├── ruoyi-app # 移动端H5前端 ├── ruoyi-common # 公共模块 ├── ruoyi-framework # 框架核心 ├── ruoyi-generator # 代码生成 ├── ruoyi-quartz # 定时任务 ├── ruoyi-system # 系统模块 ├── ruoyi-ui # 前端公共组件 └── docker # Docker相关配置我们需要重点关注的是docker目录这里包含了Dockerfile和docker-compose.yml模板。不过为了更全面地理解我们会从头开始创建这些文件。3.3 修改配置文件在部署前有几个关键配置文件需要修改后端配置ruoyi-admin/src/main/resources/application-dev.yml修改数据库连接信息配置Redis连接设置服务器端口前端配置ruoyi-admin/vue.config.js配置API基础路径设置开发服务器代理我建议在本地先测试运行前后端确保所有功能正常后再进行Docker化部署。这样可以提前发现并解决配置问题避免在容器环境中调试的麻烦。4. Docker Compose编排实战4.1 编写Dockerfile首先为后端服务创建Dockerfile# 后端Dockerfile FROM eclipse-temurin:17-jdk as builder WORKDIR /app COPY . . RUN ./mvnw clean package -DskipTests FROM eclipse-temurin:17-jre WORKDIR /app COPY --frombuilder /app/ruoyi-admin/target/ruoyi-admin.jar app.jar EXPOSE 8080 ENTRYPOINT [java, -jar, app.jar]然后是前端Dockerfile# 前端Dockerfile FROM node:16 as builder WORKDIR /app COPY ruoyi-admin . RUN npm install npm run build:prod FROM nginx:alpine COPY --frombuilder /app/dist /usr/share/nginx/html COPY ruoyi-admin/nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 804.2 编写docker-compose.yml这是整个部署的核心文件我们将所有服务定义在这里version: 3.8 services: # MySQL数据库 mysql: image: mysql:8.0 container_name: ruoyi-mysql environment: MYSQL_ROOT_PASSWORD: ruoyi123 MYSQL_DATABASE: ruoyi MYSQL_USER: ruoyi MYSQL_PASSWORD: ruoyi123 volumes: - mysql_data:/var/lib/mysql ports: - 3306:3306 networks: - ruoyi-network healthcheck: test: [CMD, mysqladmin, ping, -h, localhost] interval: 5s timeout: 10s retries: 10 # Redis缓存 redis: image: redis:6.2 container_name: ruoyi-redis ports: - 6379:6379 volumes: - redis_data:/data networks: - ruoyi-network command: redis-server --appendonly yes # 后端服务 backend: build: context: . dockerfile: Dockerfile.backend container_name: ruoyi-backend depends_on: mysql: condition: service_healthy redis: condition: service_started environment: SPRING_PROFILES_ACTIVE: prod SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/ruoyi?useSSLfalse SPRING_DATASOURCE_USERNAME: ruoyi SPRING_DATASOURCE_PASSWORD: ruoyi123 SPRING_REDIS_HOST: redis ports: - 8080:8080 networks: - ruoyi-network restart: unless-stopped # 前端服务 frontend: build: context: . dockerfile: Dockerfile.frontend container_name: ruoyi-frontend depends_on: - backend ports: - 80:80 networks: - ruoyi-network restart: unless-stopped # 定义网络和卷 networks: ruoyi-network: driver: bridge volumes: mysql_data: redis_data:这个配置文件中几个关键点需要注意使用了命名容器(container_name)方便识别定义了健康检查确保服务依赖顺序使用volume持久化数据库数据通过depends_on控制启动顺序使用自定义网络实现服务发现4.3 Nginx配置前端服务使用Nginx作为反向代理我们需要提供一个自定义配置server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; try_files $uri $uri/ /index.html; } location /prod-api/ { proxy_pass http://backend:8080/; proxy_set_header Host $http_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; } }这个配置实现了静态文件服务前端路由支持API请求代理到后端基本的错误处理5. 部署与验证5.1 构建并启动服务一切准备就绪后执行以下命令启动所有服务# 构建镜像并启动容器 docker-compose up -d --build # 查看运行状态 docker-compose ps # 查看日志 docker-compose logs -f第一次运行会花费较长时间因为需要构建镜像和下载基础镜像。后续启动会快很多。5.2 验证服务所有服务启动后可以通过以下方式验证前端浏览器访问http://服务器IP后端API访问http://服务器IP:8080/swagger-ui.html数据库使用MySQL客户端连接服务器IP:3306Redis使用redis-cli连接服务器IP:63795.3 常见问题解决在实际部署中可能会遇到以下问题端口冲突确保宿主机上的80、8080、3306、6379端口没有被占用构建失败检查网络是否能访问Docker Hub和npm registry数据库连接失败确认MySQL容器完全启动后再启动后端服务前端无法访问API检查Nginx配置中的proxy_pass地址是否正确我曾经遇到过一个棘手的问题前端能访问但所有API请求都返回404。后来发现是Nginx配置中proxy_pass的URL末尾少了斜杠导致路径拼接错误。这个小细节花了我两小时才找到所以建议大家仔细检查配置。6. 生产环境优化建议6.1 性能调优对于生产环境建议对Docker Compose配置做以下优化资源限制为每个服务设置CPU和内存限制backend: deploy: resources: limits: cpus: 2 memory: 2G日志配置使用json-file日志驱动并限制大小logging: driver: json-file options: max-size: 10m max-file: 3健康检查为所有服务添加健康检查healthcheck: test: [CMD, curl, -f, http://localhost:8080/actuator/health] interval: 30s timeout: 10s retries: 36.2 安全加固使用非root用户运行容器RUN adduser -D myuser USER myuser定期更新基础镜像docker-compose pull docker-compose up -d启用HTTPS使用Lets Encrypt证书server { listen 443 ssl; ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; # 其他配置... }6.3 监控与维护使用cAdvisor监控容器资源使用情况cadvisor: image: gcr.io/cadvisor/cadvisor ports: - 8088:8080 volumes: - /:/rootfs:ro - /var/run:/var/run:rw - /sys:/sys:ro - /var/lib/docker/:/var/lib/docker:ro设置定期备份# 备份MySQL docker exec ruoyi-mysql sh -c exec mysqldump --all-databases -uroot -p$MYSQL_ROOT_PASSWORD backup.sql # 备份Redis docker exec ruoyi-redis redis-cli save docker cp ruoyi-redis:/data/dump.rdb .日志收集考虑使用ELK或Fluentd集中管理日志7. 扩展与进阶7.1 多环境配置在实际开发中我们通常需要区分开发、测试和生产环境。可以通过多个compose文件实现# 开发环境 docker-compose -f docker-compose.yml -f docker-compose.dev.yml up # 生产环境 docker-compose -f docker-compose.yml -f docker-compose.prod.yml up其中docker-compose.dev.yml可以覆盖开发专用配置如挂载源码目录实现热部署。7.2 水平扩展对于高流量场景可以轻松扩展后端服务实例docker-compose up -d --scale backend3配合Nginx负载均衡upstream backend { server backend1:8080; server backend2:8080; server backend3:8080; } location /api/ { proxy_pass http://backend; }7.3 CI/CD集成可以将Docker Compose部署集成到CI/CD流程中# GitHub Actions示例 jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkoutv2 - run: docker-compose -f docker-compose.prod.yml up -d --build env: SPRING_DATASOURCE_URL: ${{ secrets.DB_URL }}这种基于Docker Compose的部署方式特别适合中小型项目它提供了Kubernetes的大部分便利性但学习成本和维护难度要低得多。我在多个客户项目中采用这种方案都取得了不错的效果。

相关新闻