anxin-ruoyi/docker/README.md
2026-01-05 01:46:20 +08:00

929 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 若依框架 Docker 部署文档
本文档提供若依框架项目的完整Docker化部署方案包括前后端分离架构的容器化部署、环境配置管理和故障排除指南。
## 📋 目录
- [项目概述](#项目概述)
- [快速开始](#快速开始)
- [环境要求](#环境要求)
- [目录结构](#目录结构)
- [详细部署步骤](#详细部署步骤)
- [环境配置](#环境配置)
- [服务管理](#服务管理)
- [监控和日志](#监控和日志)
- [故障排除](#故障排除)
- [性能优化](#性能优化)
- [安全配置](#安全配置)
- [常见问题](#常见问题)
## 🚀 项目概述
本部署方案将若依框架项目容器化,实现:
- **前后端分离**Vue3前端 + Spring Boot后端独立部署
- **数据库容器化**MySQL 8.0容器化部署
- **环境隔离**:支持开发、测试、生产环境配置
- **自动化部署**:一键构建、部署和管理脚本
- **服务监控**:健康检查和日志管理
### 架构图
```
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Frontend │ │ Backend │ │ Database │
│ (Vue3+Nginx) │───▶│ (Spring Boot) │───▶│ (MySQL) │
│ Port: 80 │ │ Port: 8080 │ │ Port: 3306 │
└─────────────────┘ └─────────────────┘ └─────────────────┘
```
## ⚡ 快速开始
### 1. 环境准备
确保系统已安装必要的软件:
```bash
# 检查Docker版本
docker --version
docker-compose --version
# 检查系统资源
free -h
df -h
```
### 2. 配置环境
```bash
# 1. 进入Docker目录
cd docker
# 2. 复制环境配置文件
cp environments/.env.example environments/.env.development
# 3. 编辑配置文件(根据需要修改)
vim environments/.env.development
```
### 3. 一键部署
```bash
# 开发环境部署
./build.sh deploy -e development
# 或者分步执行
./build.sh build-all -e development # 构建镜像
./deploy.sh start -e development # 启动服务
```
### 4. 验证部署
```bash
# 检查服务状态
./deploy.sh status -e development
# 执行健康检查
./deploy.sh health -e development --wait
# 访问应用
# 前端: http://localhost:80
# 后端API: http://localhost:8080
```
## 🔧 环境要求
### 系统要求
| 组件 | 最低要求 | 推荐配置 |
|------|----------|----------|
| **操作系统** | Linux/macOS/Windows | Ubuntu 20.04+ / CentOS 8+ |
| **CPU** | 2核心 | 4核心+ |
| **内存** | 4GB | 8GB+ |
| **磁盘空间** | 10GB | 20GB+ |
| **网络** | 100Mbps | 1Gbps+ |
### 软件依赖
| 软件 | 版本要求 | 安装命令 |
|------|----------|----------|
| **Docker** | 20.10+ | `curl -fsSL https://get.docker.com \| sh` |
| **Docker Compose** | 2.0+ | 随Docker Desktop安装 |
| **Git** | 2.0+ | `apt install git` / `yum install git` |
| **Bash** | 4.0+ | 系统自带 |
### 端口要求
确保以下端口未被占用:
| 服务 | 默认端口 | 可配置 | 说明 |
|------|----------|--------|------|
| 前端服务 | 80 | ✅ | HTTP访问端口 |
| 后端服务 | 8080 | ✅ | API服务端口 |
| 数据库 | 3306 | ✅ | MySQL连接端口 |
## 📁 目录结构
```
docker/
├── README.md # 本文档
├── build.sh # 主构建脚本
├── deploy.sh # 部署管理脚本
├── docker-compose.yml # 基础编排文件
├── docker-compose.*.yml # 环境特定编排文件
├── validation-report.md # 验证报告
├── frontend/ # 前端容器配置
│ ├── Dockerfile # 前端镜像构建文件
│ └── nginx.conf.* # Nginx配置文件
├── backend/ # 后端容器配置
│ ├── Dockerfile # 后端镜像构建文件
│ └── startup.sh # 启动脚本
├── database/ # 数据库配置
│ ├── docker-compose.database.yml
│ ├── init/ # 初始化脚本
│ └── README.md
├── environments/ # 环境配置
│ ├── .env.example # 配置模板
│ ├── .env.development # 开发环境
│ ├── .env.staging # 测试环境
│ └── .env.production # 生产环境
├── configs/ # 配置文件模板
│ ├── nginx.conf.* # Nginx配置模板
│ ├── application-docker.yml # Spring Boot配置
│ └── my.cnf.* # MySQL配置
├── scripts/ # 辅助脚本
│ ├── env-config.sh # 环境配置管理
│ ├── validate-*.sh # 配置验证脚本
│ ├── backup.sh # 数据备份脚本
│ └── setup-env.sh # 环境初始化
└── data/ # 数据目录(运行时创建)
├── mysql/ # 数据库数据
├── logs/ # 日志文件
└── uploads/ # 上传文件
```
## 📖 详细部署步骤
### 步骤1环境配置
#### 1.1 创建环境配置文件
```bash
# 复制配置模板
cp environments/.env.example environments/.env.development
# 编辑配置文件
vim environments/.env.development
```
#### 1.2 关键配置项说明
```bash
# 基础环境配置
ENVIRONMENT=development # 环境标识
COMPOSE_PROJECT_NAME=anxin # Docker Compose项目名
# 数据库配置
DB_HOST=anxin-mysql # 数据库主机
DB_PORT=3306 # 数据库端口
DB_NAME=anxin # 数据库名
DB_USER=anxin_user # 数据库用户
DB_PASSWORD=your_secure_password # 数据库密码
# 服务端口配置
FRONTEND_PORT=80 # 前端服务端口
BACKEND_PORT=8080 # 后端服务端口
# 资源限制配置
BACKEND_MEMORY_LIMIT=1024 # 后端内存限制(MB)
DATABASE_MEMORY_LIMIT=512 # 数据库内存限制(MB)
```
### 步骤2构建镜像
#### 2.1 构建所有镜像
```bash
# 构建所有镜像(开发环境)
./build.sh build-all -e development
# 构建特定组件
./build.sh build -c frontend -e development
./build.sh build -c backend -e development
# 强制重新构建(不使用缓存)
./build.sh build-all -e development --no-cache
```
#### 2.2 构建选项说明
| 选项 | 说明 | 示例 |
|------|------|------|
| `-e, --env` | 指定环境 | `-e production` |
| `-c, --component` | 指定组件 | `-c frontend` |
| `--pull` | 构建前拉取代码 | `--pull` |
| `--no-cache` | 不使用构建缓存 | `--no-cache` |
| `--clean` | 清理构建缓存 | `--clean` |
| `--verbose` | 显示详细日志 | `--verbose` |
### 步骤3启动服务
#### 3.1 启动所有服务
```bash
# 启动所有服务
./deploy.sh start -e development
# 启动特定服务
./deploy.sh start mysql -e development
./deploy.sh start backend frontend -e development
```
#### 3.2 服务管理命令
```bash
# 查看服务状态
./deploy.sh status -e development
# 重启服务
./deploy.sh restart -e development
# 停止服务
./deploy.sh stop -e development
# 完全清理(删除容器和网络)
./deploy.sh down -e development
```
### 步骤4验证部署
#### 4.1 健康检查
```bash
# 执行健康检查
./deploy.sh health -e development
# 等待所有服务健康
./deploy.sh health -e development --wait --retry 10
```
#### 4.2 访问测试
```bash
# 测试前端访问
curl -I http://localhost:80
# 测试后端API
curl -I http://localhost:8080/actuator/health
# 测试数据库连接
mysql -h localhost -P 3306 -u anxin_user -p
```
## ⚙️ 环境配置
### 开发环境 (Development)
```bash
# 特点:启用调试模式,详细日志,热重载
ENVIRONMENT=development
LOG_LEVEL=DEBUG
SPRING_PROFILES_ACTIVE=docker,dev
```
### 测试环境 (Staging)
```bash
# 特点:接近生产配置,性能测试
ENVIRONMENT=staging
LOG_LEVEL=INFO
SPRING_PROFILES_ACTIVE=docker,staging
```
### 生产环境 (Production)
```bash
# 特点:优化性能,安全配置,监控
ENVIRONMENT=production
LOG_LEVEL=WARN
SPRING_PROFILES_ACTIVE=docker,prod
```
### 环境切换
```bash
# 切换到生产环境
./build.sh deploy -e production --pull
# 切换到开发环境
./deploy.sh restart -e development
```
## 🔄 服务管理
### 启动服务
```bash
# 启动所有服务
./deploy.sh start
# 启动特定服务
./deploy.sh start mysql
./deploy.sh start backend frontend
# 强制重新创建容器
./deploy.sh start --force
```
### 停止服务
```bash
# 停止所有服务
./deploy.sh stop
# 停止特定服务
./deploy.sh stop backend
# 设置停止超时时间
./deploy.sh stop -t 60
```
### 重启服务
```bash
# 重启所有服务
./deploy.sh restart
# 重启特定服务
./deploy.sh restart backend
```
### 服务状态
```bash
# 查看详细状态
./deploy.sh status
# 查看容器列表
./deploy.sh ps
# 查看网络和卷信息
docker network ls | grep anxin
docker volume ls | grep anxin
```
## 📊 监控和日志
### 日志查看
```bash
# 查看所有服务日志
./deploy.sh logs
# 查看特定服务日志
./deploy.sh logs backend
# 实时跟踪日志
./deploy.sh logs -f
# 查看最近100行日志
./deploy.sh logs --tail 100
# 查看最近1小时日志
./deploy.sh logs --since 1h
```
### 健康监控
```bash
# 执行健康检查
./deploy.sh health
# 持续监控(等待所有服务健康)
./deploy.sh health --wait --retry 20 --interval 30
# 查看服务详细信息
docker inspect anxin-backend-development
```
### 性能监控
```bash
# 查看容器资源使用
docker stats
# 查看特定容器资源使用
docker stats anxin-backend-development
# 查看系统资源
free -h
df -h
```
## 🔧 故障排除
### 常见问题诊断
#### 1. 服务启动失败
**症状**:容器无法启动或立即退出
**诊断步骤**
```bash
# 1. 查看容器状态
./deploy.sh status
# 2. 查看容器日志
./deploy.sh logs [service_name]
# 3. 检查配置文件
cat environments/.env.development
# 4. 验证端口占用
netstat -tlnp | grep :80
netstat -tlnp | grep :8080
netstat -tlnp | grep :3306
```
**常见原因及解决方案**
| 问题 | 原因 | 解决方案 |
|------|------|----------|
| 端口被占用 | 其他服务占用端口 | `sudo lsof -i :80` 查找并停止占用进程 |
| 内存不足 | 系统内存不够 | 增加系统内存或调整容器内存限制 |
| 配置错误 | 环境变量配置错误 | 检查并修正 `.env` 文件 |
| 镜像构建失败 | 依赖下载失败 | 检查网络连接,使用 `--no-cache` 重新构建 |
#### 2. 数据库连接失败
**症状**:后端无法连接数据库
**诊断步骤**
```bash
# 1. 检查数据库容器状态
docker ps | grep mysql
# 2. 检查数据库日志
./deploy.sh logs mysql
# 3. 测试数据库连接
docker exec -it anxin-mysql-development mysql -u root -p
# 4. 检查网络连接
docker network inspect anxin-development_default
```
**解决方案**
```bash
# 重启数据库服务
./deploy.sh restart mysql
# 检查数据库初始化
docker exec anxin-mysql-development mysql -u root -p -e "SHOW DATABASES;"
# 重新初始化数据库
./deploy.sh down
rm -rf data/development/mysql
./deploy.sh start
```
#### 3. 前端无法访问后端API
**症状**前端页面加载但API调用失败
**诊断步骤**
```bash
# 1. 检查后端服务状态
curl -I http://localhost:8080/actuator/health
# 2. 检查Nginx配置
docker exec anxin-frontend-development cat /etc/nginx/nginx.conf
# 3. 查看Nginx日志
./deploy.sh logs frontend
# 4. 检查网络连通性
docker exec anxin-frontend-development ping anxin-backend
```
**解决方案**
```bash
# 重启前端服务
./deploy.sh restart frontend
# 检查API代理配置
# 编辑 configs/nginx.conf.development
# 确保 proxy_pass 指向正确的后端服务
```
#### 4. 镜像构建失败
**症状**Docker镜像构建过程中出错
**诊断步骤**
```bash
# 1. 查看构建日志
./build.sh build-all --verbose
# 2. 检查Dockerfile语法
docker run --rm -i hadolint/hadolint < frontend/Dockerfile
# 3. 手动构建测试
cd frontend
docker build -t test-frontend .
```
**解决方案**
```bash
# 清理构建缓存
./build.sh clean
# 强制重新构建
./build.sh build-all --no-cache
# 检查网络连接
ping registry-1.docker.io
```
#### 5. 性能问题
**症状**:服务响应缓慢或资源使用过高
**诊断步骤**
```bash
# 1. 查看资源使用情况
docker stats
# 2. 检查系统负载
top
htop
iostat -x 1
# 3. 分析日志
./deploy.sh logs --since 1h | grep -i error
./deploy.sh logs --since 1h | grep -i slow
```
**解决方案**
```bash
# 调整资源限制
# 编辑 environments/.env.development
BACKEND_MEMORY_LIMIT=2048
DATABASE_MEMORY_LIMIT=1024
# 重启服务应用新配置
./deploy.sh restart
```
### 日志分析
#### 关键日志位置
```bash
# 容器日志
docker logs anxin-backend-development
# 应用日志(挂载到宿主机)
tail -f data/development/backend-logs/application.log
tail -f data/development/mysql-logs/error.log
tail -f data/development/nginx-logs/access.log
```
#### 日志级别说明
| 级别 | 说明 | 使用场景 |
|------|------|----------|
| ERROR | 错误信息 | 生产环境问题排查 |
| WARN | 警告信息 | 潜在问题识别 |
| INFO | 一般信息 | 正常运行监控 |
| DEBUG | 调试信息 | 开发环境调试 |
### 数据备份与恢复
#### 数据备份
```bash
# 使用内置备份脚本
./scripts/backup.sh -e development
# 手动备份数据库
docker exec anxin-mysql-development mysqldump -u root -p anxin > backup.sql
# 备份数据卷
docker run --rm -v anxin-development_mysql-data:/data -v $(pwd):/backup alpine tar czf /backup/mysql-data-backup.tar.gz /data
```
#### 数据恢复
```bash
# 恢复数据库
docker exec -i anxin-mysql-development mysql -u root -p anxin < backup.sql
# 恢复数据卷
docker run --rm -v anxin-development_mysql-data:/data -v $(pwd):/backup alpine tar xzf /backup/mysql-data-backup.tar.gz -C /
```
### 网络问题排查
#### 检查网络配置
```bash
# 查看Docker网络
docker network ls
docker network inspect anxin-development_default
# 检查容器网络连接
docker exec anxin-frontend-development ping anxin-backend
docker exec anxin-backend-development ping anxin-mysql
# 检查端口映射
docker port anxin-frontend-development
docker port anxin-backend-development
```
#### 解决网络问题
```bash
# 重新创建网络
./deploy.sh down
./deploy.sh start
# 检查防火墙设置
sudo ufw status
sudo iptables -L
```
## 🚀 性能优化
### 容器资源优化
#### 内存优化
```bash
# 调整JVM内存设置
JAVA_OPTS=-Xms512m -Xmx1024m -XX:+UseG1GC
# 调整MySQL内存设置
# 编辑 configs/my.cnf.production
innodb_buffer_pool_size = 256M
key_buffer_size = 64M
```
#### CPU优化
```bash
# 设置CPU限制
# 在 docker-compose.yml 中
deploy:
resources:
limits:
cpus: '1.0'
memory: 1024M
```
### 镜像优化
#### 减小镜像大小
```bash
# 使用多阶段构建
# 使用Alpine Linux基础镜像
# 清理不必要的文件和缓存
# 查看镜像大小
docker images | grep anxin
```
#### 构建缓存优化
```bash
# 合理安排Dockerfile层级
# 将变化频率低的操作放在前面
# 使用.dockerignore排除不必要文件
```
### 数据库优化
#### MySQL配置优化
```bash
# 编辑 configs/my.cnf.production
[mysqld]
innodb_buffer_pool_size = 512M
innodb_log_file_size = 128M
max_connections = 200
query_cache_size = 64M
```
#### 索引优化
```sql
-- 分析慢查询
SHOW PROCESSLIST;
SHOW FULL PROCESSLIST;
-- 查看索引使用情况
EXPLAIN SELECT * FROM your_table WHERE condition;
```
## 🔒 安全配置
### 容器安全
#### 用户权限
```bash
# 使用非root用户运行容器
# 在Dockerfile中添加
RUN addgroup -g 1001 appuser && adduser -u 1001 -G appuser -s /bin/sh -D appuser
USER appuser
```
#### 网络安全
```bash
# 限制容器网络访问
# 使用自定义网络
# 关闭不必要的端口映射
```
### 数据安全
#### 密码管理
```bash
# 使用强密码
# 定期更换密码
# 使用Docker secrets管理敏感信息
# 创建密码文件
echo "your_secure_password" | docker secret create db_password -
```
#### 数据加密
```bash
# 启用MySQL SSL
# 配置应用程序使用SSL连接
# 加密敏感数据字段
```
### 访问控制
#### 防火墙配置
```bash
# 配置iptables规则
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 3306 -s 172.20.0.0/16 -j ACCEPT
```
#### 反向代理
```bash
# 使用Nginx作为反向代理
# 配置SSL终止
# 实现负载均衡
```
## ❓ 常见问题
### Q1: 如何更新应用版本?
**A**:
```bash
# 1. 拉取最新代码
./build.sh pull
# 2. 重新构建镜像
./build.sh build-all --no-cache
# 3. 重启服务
./deploy.sh restart
```
### Q2: 如何扩展服务实例?
**A**:
```bash
# 编辑 docker-compose.yml
services:
anxin-backend:
deploy:
replicas: 3
# 重新部署
./deploy.sh restart
```
### Q3: 如何迁移到其他服务器?
**A**:
```bash
# 1. 备份数据
./scripts/backup.sh
# 2. 复制项目文件和备份到新服务器
rsync -av . user@newserver:/path/to/project
# 3. 在新服务器上恢复
./deploy.sh start
# 恢复数据库备份
```
### Q4: 如何配置SSL证书
**A**:
```bash
# 1. 获取SSL证书
# 2. 修改Nginx配置
# 3. 更新docker-compose.yml端口映射
# 4. 重启前端服务
```
### Q5: 如何监控服务健康状态?
**A**:
```bash
# 使用内置健康检查
./deploy.sh health --wait
# 集成外部监控工具
# - Prometheus + Grafana
# - ELK Stack
# - Zabbix
```
### Q6: 如何处理数据库迁移?
**A**:
```bash
# 1. 备份当前数据
./scripts/backup.sh
# 2. 停止服务
./deploy.sh stop
# 3. 更新数据库脚本
# 4. 重启服务(自动执行迁移)
./deploy.sh start
```
---
## 📞 技术支持
如果遇到问题,请按以下步骤获取帮助:
1. **查看日志**`./deploy.sh logs -f`
2. **检查状态**`./deploy.sh health`
3. **查阅文档**:参考本文档故障排除部分
4. **收集信息**:准备错误日志、配置文件、系统信息
5. **寻求帮助**:联系技术支持团队
### 信息收集脚本
```bash
#!/bin/bash
# 收集诊断信息
echo "=== 系统信息 ===" > diagnostic.log
uname -a >> diagnostic.log
docker --version >> diagnostic.log
docker-compose --version >> diagnostic.log
echo "=== 服务状态 ===" >> diagnostic.log
./deploy.sh status >> diagnostic.log
echo "=== 最近日志 ===" >> diagnostic.log
./deploy.sh logs --tail 100 >> diagnostic.log
echo "诊断信息已保存到 diagnostic.log"
```
---
**文档版本**: 1.0.0
**最后更新**: $(date '+%Y-%m-%d')
**维护团队**: 若依框架开发团队