# 🐳 Docker部署完整指南 本项目提供了多种Docker部署方案,适应不同的使用场景和需求。 ## 📦 Dockerfile文件说明 ### 主要Dockerfile文件 | 文件 | 用途 | 特点 | |------|------|------| | `Dockerfile` | 单容器部署 | 前端+后端在一个容器中,简化部署 | | `Dockerfile.optimized` | 优化单容器 | 多阶段构建,镜像更小,性能更好 | | `client/Dockerfile` | 前端容器 | React应用 + Nginx,支持多容器架构 | | `server/Dockerfile` | 后端容器 | Node.js应用,支持多容器架构 | ### Docker Compose配置 | 文件 | 用途 | 特点 | |------|------|------| | `docker-compose.yml` | 生产环境 | 多容器,包含健康检查和依赖管理 | | `docker-compose.dev.yml` | 开发环境 | 支持热重载,便于开发调试 | | `docker-compose.single.yml` | 单容器部署 | 简化的单容器 + MongoDB | ## 🚀 部署方案选择 ### 方案1: 多容器部署(推荐生产环境) **优点:** - 服务分离,便于扩展 - 独立更新前端或后端 - 更好的资源管理 - 符合微服务架构 **部署命令:** ```bash # 自动部署 ./deploy.sh # 手动部署 docker-compose up --build -d # 使用Makefile make start ``` ### 方案2: 单容器部署(推荐小型部署) **优点:** - 部署简单 - 资源占用少 - 管理方便 - 适合小型应用 **部署命令:** ```bash # 使用标准版本 docker-compose -f docker-compose.single.yml up -d # 使用优化版本 docker build -t chatapp:optimized -f Dockerfile.optimized . docker run -d -p 80:80 --name chatapp chatapp:optimized # 使用Makefile make single ``` ### 方案3: 开发环境 **特点:** - 支持热重载 - 实时代码同步 - 便于调试 - 快速迭代 **部署命令:** ```bash ./start-dev.sh # 或 make dev ``` ## 🔨 构建Docker镜像 ### 交互式构建 ```bash # 使用构建脚本(推荐) ./build-docker.sh # 选择构建类型: # 1) 多容器构建 # 2) 单容器构建 # 3) 仅构建前端 # 4) 仅构建后端 ``` ### 手动构建 ```bash # 构建所有镜像 make build # 构建单个镜像 docker build -t chatapp-frontend ./client docker build -t chatapp-backend ./server docker build -t chatapp . # 构建优化版本 docker build -t chatapp:optimized -f Dockerfile.optimized . ``` ### 镜像比较 ```bash # 比较不同版本的镜像大小和性能 ./docker-compare.sh ``` ## 📊 镜像优化特性 ### 多阶段构建 - 分离构建环境和运行环境 - 减少最终镜像大小 - 提高安全性 ### 安全特性 - 非root用户运行 - 最小权限原则 - 安全的基础镜像 - 定期安全更新 ### 性能优化 - Alpine Linux基础镜像 - 优化的nginx配置 - Gzip压缩 - 静态资源缓存 - 健康检查 ## 🔧 配置说明 ### 环境变量 **后端环境变量:** ```env NODE_ENV=production MONGODB_URI=mongodb://mongo:27017/chatapp JWT_SECRET=your-secret-key PORT=5000 CLIENT_URL=http://localhost:3000 ``` **前端环境变量:** ```env VITE_API_URL=http://localhost:5000 ``` ### 端口映射 | 服务 | 容器端口 | 主机端口 | 说明 | |------|----------|----------|------| | 前端 | 80 | 3000 | React应用 | | 后端 | 5000 | 5000 | API服务 | | MongoDB | 27017 | 27017 | 数据库 | ### 数据卷 | 卷名 | 挂载点 | 用途 | |------|--------|------| | `mongo_data` | `/data/db` | MongoDB数据持久化 | | `./server` | `/app` | 开发环境代码同步 | | `./client` | `/app` | 开发环境代码同步 | ## 🧪 测试和验证 ### 功能测试 ```bash # 运行完整测试套件 ./test.sh # 使用Makefile make test ``` ### 健康检查 ```bash # 检查服务状态 make health # 查看容器状态 docker-compose ps # 查看健康检查日志 docker inspect | jq '.[0].State.Health' ``` ### 性能测试 ```bash # 监控资源使用 docker stats # 查看镜像大小 docker images | grep chatapp # 网络性能测试 curl -w "@curl-format.txt" -o /dev/null -s http://localhost:3000 ``` ## 🔍 故障排除 ### 常见问题 **1. 容器启动失败** ```bash # 查看日志 docker-compose logs -f # 检查容器状态 docker-compose ps # 进入容器调试 docker exec -it sh ``` **2. 端口冲突** ```bash # 检查端口占用 netstat -tulpn | grep :3000 netstat -tulpn | grep :5000 # 修改端口映射 # 编辑 docker-compose.yml 中的 ports 配置 ``` **3. 镜像构建失败** ```bash # 清理构建缓存 docker builder prune -f # 重新构建 docker-compose build --no-cache # 查看构建日志 docker build --progress=plain . ``` **4. 数据持久化问题** ```bash # 检查数据卷 docker volume ls # 备份数据 make backup # 恢复数据 make restore FILE=backup.gz ``` ## 🚀 生产环境最佳实践 ### 1. 使用优化镜像 ```bash # 使用多阶段构建的优化版本 docker build -t chatapp:optimized -f Dockerfile.optimized . ``` ### 2. 配置资源限制 ```yaml # 在docker-compose.yml中添加 services: server: deploy: resources: limits: cpus: '0.5' memory: 512M reservations: cpus: '0.25' memory: 256M ``` ### 3. 设置重启策略 ```yaml services: server: restart: unless-stopped ``` ### 4. 配置日志管理 ```yaml services: server: logging: driver: "json-file" options: max-size: "10m" max-file: "3" ``` ### 5. 使用健康检查 ```yaml services: server: healthcheck: test: ["CMD", "wget", "--spider", "http://localhost:5000/api/health"] interval: 30s timeout: 10s retries: 3 ``` ## 📈 监控和维护 ### 日志管理 ```bash # 查看日志 make logs # 实时日志 docker-compose logs -f # 特定服务日志 docker-compose logs -f server ``` ### 备份策略 ```bash # 自动备份脚本 make backup # 定时备份(crontab) 0 2 * * * /path/to/chatapp/make backup ``` ### 更新部署 ```bash # 更新应用 make update # 滚动更新 docker-compose up -d --no-deps server ``` 这个Docker部署指南提供了完整的容器化解决方案,适合各种部署场景和需求。