Docker 部署指南
本文档介绍如何使用 Docker 和 Docker Compose 部署学习追踪系统,包括代码更新的操作流程。
📋 系统要求
- 操作系统: Ubuntu 20.04+ / CentOS 8+
- Docker: 20.10.21+
- Docker Compose: 1.25.0+
- 内存: 2GB RAM (推荐4GB+)
- 存储: 10GB+ 可用空间
🚀 环境准备
安装 Docker
bash
# Ubuntu/Debian
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
# CentOS/RHEL
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo systemctl start docker
sudo systemctl enable docker安装 Docker Compose
bash
# 如果使用 Docker Compose 独立版本
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
# 验证安装
docker --version
docker-compose --version📦 应用部署
1. 克隆项目
bash
git clone https://github.com/your-username/study-tracker.git
cd study-tracker2. 配置环境变量
bash
# 复制环境配置模板
cp env.example .env
# 编辑配置文件
nano .env生产环境配置示例:
env
# 生产环境配置
NODE_ENV=production
# 数据库配置
DB_HOST=postgres
DB_PORT=5432
DB_USER=postgres
DB_PASSWORD=your_secure_password
DB_NAME=study_tracker_prod
# Redis 配置
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=your_redis_password
REDIS_DB=0
# JWT 配置
JWT_SECRET=your_production_jwt_secret
JWT_REFRESH_SECRET=your_production_refresh_secret
# 域名配置
DOMAIN=https://yourdomain.com
DOCS_DOMAIN=https://docs.yourdomain.com
# CORS配置
CORS_ORIGIN=https://yourdomain.com
DOCS_CORS_ORIGIN=https://docs.yourdomain.com3. 启动服务
bash
# 启动所有服务
docker-compose -f docker-compose.prod.yml up -d
# 查看服务状态
docker-compose -f docker-compose.prod.yml ps
# 查看服务日志
docker-compose -f docker-compose.prod.yml logs -f4. 初始化数据库
bash
# 运行数据库迁移
docker-compose -f docker-compose.prod.yml exec app npm run db:migrate
# 运行种子数据
docker-compose -f docker-compose.prod.yml exec app npm run db:seed🔄 代码更新流程
📋 更新前准备
备份重要数据
bash# 备份数据库 docker-compose -f docker-compose.prod.yml exec postgres pg_dump -U postgres study_tracker_prod > backup_$(date +%Y%m%d_%H%M%S).sql # 备份上传文件 tar -czf uploads_backup_$(date +%Y%m%d_%H%M%S).tar.gz uploads/检查当前服务状态
bashdocker-compose -f docker-compose.prod.yml ps docker-compose -f docker-compose.prod.yml logs --tail=20 app
🚀 执行代码更新
方法一:一键更新(推荐)
bash
# 一键更新命令
git pull origin main && \
docker-compose -f docker-compose.prod.yml build app && \
docker-compose -f docker-compose.prod.yml up -d app && \
docker system prune -f方法二:分步更新
bash
# 1. 拉取最新代码
git pull origin main
# 2. 重新构建镜像
docker-compose -f docker-compose.prod.yml build app
# 3. 重启服务
docker-compose -f docker-compose.prod.yml up -d app
# 4. 清理旧镜像
docker system prune -f🧹 镜像管理
查看镜像状态
bash
# 查看所有镜像
docker images
# 查看悬空镜像(标签为none)
docker images -f "dangling=true"
# 查看镜像使用情况
docker ps -a --filter "ancestor=镜像ID"清理旧镜像
bash
# 清理悬空镜像
docker images -f "dangling=true" -q | xargs -r docker rmi -f
# 清理未使用的资源
docker system prune -f
# 清理所有未使用的镜像(谨慎使用)
docker system prune -a -f✅ 更新后验证
1. 检查服务状态
bash
# 查看服务状态
docker-compose -f docker-compose.prod.yml ps
# 查看应用日志
docker-compose -f docker-compose.prod.yml logs --tail=20 app
# 查看数据库日志
docker-compose -f docker-compose.prod.yml logs --tail=20 postgres2. 功能测试
- [ ] 主应用可以正常访问
- [ ] 用户登录功能正常
- [ ] 数据库操作正常
- [ ] 文件上传功能正常
- [ ] WebSocket 实时通信正常
- [ ] 移动端访问正常
3. 性能检查
bash
# 检查容器资源使用
docker stats
# 检查数据库连接
docker-compose -f docker-compose.prod.yml exec app node -e "
const { db } = require('./database/db');
db.raw('SELECT 1').then(() => console.log('数据库连接正常')).catch(console.error);
"🐳 Docker 管理命令
服务管理
bash
# 启动服务
docker-compose -f docker-compose.prod.yml up -d
# 停止服务
docker-compose -f docker-compose.prod.yml down
# 重启服务
docker-compose -f docker-compose.prod.yml restart
# 查看服务状态
docker-compose -f docker-compose.prod.yml ps
# 查看服务日志
docker-compose -f docker-compose.prod.yml logs -f app
docker-compose -f docker-compose.prod.yml logs -f postgres
docker-compose -f docker-compose.prod.yml logs -f redis容器管理
bash
# 进入应用容器
docker-compose -f docker-compose.prod.yml exec app bash
# 进入数据库容器
docker-compose -f docker-compose.prod.yml exec postgres psql -U postgres
# 进入Redis容器
docker-compose -f docker-compose.prod.yml exec redis redis-cli
# 查看容器资源使用
docker stats数据管理
bash
# 数据库备份
docker-compose -f docker-compose.prod.yml exec postgres pg_dump -U postgres study_tracker_prod > backup.sql
# 数据库恢复
docker-compose -f docker-compose.prod.yml exec -T postgres psql -U postgres study_tracker_prod < backup.sql
# 查看数据卷
docker volume ls
docker volume inspect postgres_data
docker volume inspect redis_data🔒 安全配置
防火墙设置
bash
# 启用防火墙
sudo ufw enable
# 允许SSH
sudo ufw allow ssh
# 允许HTTP/HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 禁止直接访问应用端口
sudo ufw deny 3001/tcp
sudo ufw deny 5173/tcpSSL 证书配置
bash
# 使用 Let's Encrypt 获取证书
sudo certbot certonly --standalone -d yourdomain.com -d docs.yourdomain.com
# 配置 Nginx Proxy Manager 使用 SSL 证书
# 在 NPM 管理界面中配置域名和证书📊 监控和维护
日志管理
bash
# 查看实时日志
docker-compose -f docker-compose.prod.yml logs -f --tail=100
# 导出日志
docker-compose -f docker-compose.prod.yml logs app > app.log
docker-compose -f docker-compose.prod.yml logs postgres > postgres.log
# 清理日志
docker system prune -f性能监控
bash
# 监控容器资源使用
docker stats --no-stream
# 监控数据库性能
docker-compose -f docker-compose.prod.yml exec postgres psql -U postgres -c "SELECT * FROM pg_stat_activity;"
# 监控Redis性能
docker-compose -f docker-compose.prod.yml exec redis redis-cli info定期维护
bash
# 创建维护脚本
cat > maintenance.sh << 'EOF'
#!/bin/bash
echo "开始系统维护..."
# 清理Docker资源
docker system prune -f
# 备份数据库
docker-compose -f docker-compose.prod.yml exec postgres pg_dump -U postgres study_tracker_prod > backup_$(date +%Y%m%d).sql
# 检查服务状态
docker-compose -f docker-compose.prod.yml ps
echo "系统维护完成!"
EOF
chmod +x maintenance.sh
# 添加到定时任务
echo "0 2 * * * /path/to/study-tracker/maintenance.sh" | crontab -🚨 故障排除
常见问题
1. 容器无法启动
bash
# 查看错误日志
docker-compose -f docker-compose.prod.yml logs app
# 检查端口占用
sudo lsof -i :3001
sudo lsof -i :5432
sudo lsof -i :6379
# 检查磁盘空间
df -h
docker system df2. 数据库连接失败
bash
# 检查数据库容器状态
docker-compose -f docker-compose.prod.yml ps postgres
# 检查数据库日志
docker-compose -f docker-compose.prod.yml logs postgres
# 测试数据库连接
docker-compose -f docker-compose.prod.yml exec postgres psql -U postgres -c "SELECT 1;"3. Redis 连接失败
bash
# 检查Redis容器状态
docker-compose -f docker-compose.prod.yml ps redis
# 检查Redis日志
docker-compose -f docker-compose.prod.yml logs redis
# 测试Redis连接
docker-compose -f docker-compose.prod.yml exec redis redis-cli ping4. 应用无法访问
bash
# 检查应用容器状态
docker-compose -f docker-compose.prod.yml ps app
# 检查应用日志
docker-compose -f docker-compose.prod.yml logs app
# 检查网络配置
docker network ls
docker network inspect study-tracker-network回滚操作
bash
# 如果更新后出现问题,可以回滚到之前的版本
git log --oneline -10 # 查看提交历史
git checkout <commit-hash> # 回滚到指定版本
# 重新构建和启动
docker-compose -f docker-compose.prod.yml build app
docker-compose -f docker-compose.prod.yml up -d app📚 相关资源
✅ 部署检查清单
部署前检查
- [ ] Docker 和 Docker Compose 已安装
- [ ] 服务器资源满足要求
- [ ] 域名和 SSL 证书已准备
- [ ] 环境配置文件已正确设置
部署过程检查
- [ ] 所有容器成功启动
- [ ] 数据库迁移执行成功
- [ ] 种子数据导入成功
- [ ] 应用可以正常访问
- [ ] 数据库连接正常
- [ ] Redis 缓存正常
部署后验证
- [ ] 主应用功能正常
- [ ] 管理后台可以访问
- [ ] 用户注册登录正常
- [ ] 文件上传功能正常
- [ ] WebSocket 通信正常
- [ ] 移动端访问正常
- [ ] SSL 证书配置正确
代码更新检查
- [ ] 拉取最新代码
git pull origin main - [ ] 重新构建镜像
docker-compose -f docker-compose.prod.yml build app - [ ] 重启服务
docker-compose -f docker-compose.prod.yml up -d app - [ ] 清理旧镜像
docker system prune -f - [ ] 验证服务状态
docker-compose -f docker-compose.prod.yml ps - [ ] 检查应用日志
docker-compose -f docker-compose.prod.yml logs --tail=20 app - [ ] 测试核心功能
- [ ] 验证移动端访问