# Docker 部署指南

本文档介绍如何使用Docker在AMD64平台上部署RTSP视频流管理系统。

## 📋 前置要求

- Docker Engine 20.10+
- Docker Compose 1.29+ (可选)
- AMD64架构的Linux主机

## 🚀 快速开始

### 方法1: 使用Docker Compose（推荐）

```bash
# 1. 构建并启动服务
docker-compose up -d

# 2. 查看日志
docker-compose logs -f

# 3. 停止服务
docker-compose down

# 4. 停止并删除数据卷
docker-compose down -v
```

### 方法2: 使用Docker命令

```bash
# 1. 构建镜像
docker build --platform linux/amd64 -t jtjai_media:latest .

# 2. 运行容器
docker run -d \
  --name jtjai_media \
  --platform linux/amd64 \
  -p 8080:8080 \
  -v $(pwd)/output:/app/output \
  -v $(pwd)/config.json:/app/config.json:ro \
  jtjai_media:latest

# 3. 查看日志
docker logs -f jtjai_media

# 4. 停止容器
docker stop jtjai_media

# 5. 删除容器
docker rm jtjai_media
```

## 📦 镜像说明

### 多阶段构建

Dockerfile使用多阶段构建来优化镜像大小：

1. **构建阶段（builder）**
   - 基于 Ubuntu 22.04
   - 安装完整的构建工具链
   - 编译C++项目
   - 生成可执行文件

2. **运行阶段**
   - 基于 Ubuntu 22.04
   - 仅安装运行时依赖
   - 复制可执行文件
   - 最终镜像大小约 300-400MB

### 平台支持

镜像明确指定为 **linux/amd64** 平台，确保在AMD64架构上运行。

## 🔧 配置管理

### 修改配置文件

有两种方式修改配置：

#### 方式1: 挂载配置文件（推荐）

```bash
# 1. 修改宿主机的config.json
vim config.json

# 2. 重启容器使配置生效
docker-compose restart
# 或
docker restart jtjai_media
```

#### 方式2: 进入容器修改

```bash
# 1. 进入容器
docker exec -it jtjai_media bash

# 2. 修改配置
vi /app/config.json

# 3. 退出容器并重启
exit
docker restart jtjai_media
```

### 配置示例

```json
{
  "global_config": {
    "total_poll_duration_seconds": 60,
    "max_concurrent_streams": 2,
    "output_directory": "./output",
    "poll_cycles": 3
  },
  "streams": [
    {
      "rtsp_url": "rtsp://your-rtsp-url",
      "duration_seconds": 15,
      "weight": 1.0,
      "output_filename": "stream1.mp4"
    }
  ]
}
```

## 💾 数据持久化

### 输出目录挂载

视频文件默认保存在容器的 `/app/output` 目录，建议挂载到宿主机：

```yaml
volumes:
  - ./output:/app/output
```

这样即使容器删除，视频文件也会保留在宿主机的 `./output` 目录中。

### 目录结构

```
output/
├── 20251011_082130/
│   ├── test_stream1.mp4
│   ├── test_stream2.mp4
│   ├── rtsp_report.json
│   ├── report.txt
│   └── streams.csv
├── 20251011_082230/
│   └── ...
└── ...
```

## 🌐 访问服务

容器启动后，可以通过以下地址访问：

- **Web管理界面**: http://localhost:8080/manager
- **主页**: http://localhost:8080/
- **API文档**: http://localhost:8080/api

### 端口映射

默认映射 `8080:8080`，如需修改宿主机端口：

```yaml
ports:
  - "9090:8080"  # 宿主机9090端口映射到容器8080
```

## 🔍 调试与监控

### 查看实时日志

```bash
# Docker Compose
docker-compose logs -f

# Docker
docker logs -f jtjai_media

# 只看最近100行
docker logs --tail 100 jtjai_media
```

### 进入容器调试

```bash
# 进入bash
docker exec -it jtjai_media bash

# 查看进程
docker exec jtjai_media ps aux

# 查看输出文件
docker exec jtjai_media ls -lh /app/output
```

### 健康检查

容器配置了健康检查，可以查看状态：

```bash
# 查看健康状态
docker inspect --format='{{.State.Health.Status}}' jtjai_media

# 查看健康检查日志
docker inspect --format='{{range .State.Health.Log}}{{.Output}}{{end}}' jtjai_media
```

## 🎯 高级用法

### 自定义资源限制

在 `docker-compose.yml` 中调整：

```yaml
deploy:
  resources:
    limits:
      cpus: '4.0'      # 最多使用4个CPU核心
      memory: 4G       # 最多使用4GB内存
    reservations:
      cpus: '2.0'      # 预留2个CPU核心
      memory: 1G       # 预留1GB内存
```

### 使用环境变量

```yaml
environment:
  - TZ=Asia/Shanghai           # 时区
  - LOG_LEVEL=DEBUG            # 日志级别（需要代码支持）
```

### 网络配置

```yaml
networks:
  rtsp_network:
    driver: bridge
    ipam:
      config:
        - subnet: 172.20.0.0/16
```

### 多实例部署

运行多个实例（不同端口）：

```bash
# 实例1
docker run -d --name jtjai_media_1 -p 8081:8080 jtjai_media:latest

# 实例2
docker run -d --name jtjai_media_2 -p 8082:8080 jtjai_media:latest
```

## 🛠️ 故障排查

### 容器无法启动

```bash
# 1. 查看详细日志
docker logs jtjai_media

# 2. 检查配置文件
docker run --rm -v $(pwd)/config.json:/config.json ubuntu:22.04 cat /config.json

# 3. 检查端口占用
netstat -tuln | grep 8080
```

### 视频无法保存

```bash
# 1. 检查目录权限
ls -la output/

# 2. 进入容器检查
docker exec -it jtjai_media bash
cd /app/output
ls -la

# 3. 检查磁盘空间
df -h
```

### 无法访问Web界面

```bash
# 1. 确认容器运行
docker ps | grep jtjai_media

# 2. 测试端口
curl http://localhost:8080/

# 3. 检查防火墙
sudo ufw status
```

## 📊 性能优化

### 构建优化

```bash
# 使用构建缓存
docker build --cache-from jtjai_media:latest -t jtjai_media:latest .

# 并行构建
docker build --build-arg MAKEFLAGS="-j$(nproc)" .
```

### 运行优化

```yaml
# 在docker-compose.yml中
services:
  jtjai_media:
    # 使用主机网络模式（更好的性能，但失去网络隔离）
    network_mode: "host"
    
    # 共享内存大小
    shm_size: '2gb'
```

## 🔐 安全建议

1. **只读挂载配置文件**
   ```yaml
   volumes:
     - ./config.json:/app/config.json:ro
   ```

2. **限制容器权限**
   ```yaml
   security_opt:
     - no-new-privileges:true
   read_only: true
   tmpfs:
     - /tmp
   ```

3. **使用非root用户**（需要修改Dockerfile）
   ```dockerfile
   RUN useradd -m -u 1000 appuser
   USER appuser
   ```

## 📝 完整示例

### 生产环境部署

```yaml
version: '3.8'

services:
  jtjai_media:
    build:
      context: .
      dockerfile: Dockerfile
      platforms:
        - linux/amd64
    image: jtjai_media:latest
    container_name: jtjai_media_prod
    restart: always
    ports:
      - "8080:8080"
    volumes:
      - ./config.json:/app/config.json:ro
      - ./output:/app/output
      - /etc/localtime:/etc/localtime:ro
    environment:
      - TZ=Asia/Shanghai
    deploy:
      resources:
        limits:
          cpus: '4.0'
          memory: 4G
        reservations:
          cpus: '2.0'
          memory: 1G
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
    networks:
      - rtsp_network

networks:
  rtsp_network:
    driver: bridge
```

## 🎓 常用命令速查

```bash
# 构建
docker-compose build
docker-compose build --no-cache  # 不使用缓存

# 启动
docker-compose up -d
docker-compose up -d --force-recreate  # 强制重建容器

# 停止
docker-compose stop
docker-compose down

# 日志
docker-compose logs -f
docker-compose logs -f --tail=100

# 重启
docker-compose restart

# 清理
docker-compose down -v  # 删除容器和卷
docker system prune -a  # 清理所有未使用的Docker对象
```

## 📞 获取帮助

如遇到问题，请检查：
1. Docker版本是否满足要求
2. 配置文件格式是否正确
3. 网络连接是否正常
4. RTSP流地址是否可访问

---

**最后更新**: 2025-10-11
**Docker版本**: 20.10+
**平台**: linux/amd64
