Skip to content

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-tracker

2. 配置环境变量

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.com

3. 启动服务

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 -f

4. 初始化数据库

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

🔄 代码更新流程

📋 更新前准备

  1. 备份重要数据

    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/
  2. 检查当前服务状态

    bash
    docker-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 postgres

2. 功能测试

  • [ ] 主应用可以正常访问
  • [ ] 用户登录功能正常
  • [ ] 数据库操作正常
  • [ ] 文件上传功能正常
  • [ ] 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/tcp

SSL 证书配置

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 df

2. 数据库连接失败

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 ping

4. 应用无法访问

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
  • [ ] 测试核心功能
  • [ ] 验证移动端访问

Released under the MIT License.