DOCKER_README.md 7.7 KB

Docker 部署指南

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

📋 前置要求

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

🚀 快速开始

方法1: 使用Docker Compose(推荐)

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

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

# 3. 停止服务
docker-compose down

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

方法2: 使用Docker命令

# 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: 挂载配置文件(推荐)

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

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

方式2: 进入容器修改

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

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

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

配置示例

{
  "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 目录,建议挂载到宿主机:

volumes:
  - ./output:/app/output

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

目录结构

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

🌐 访问服务

容器启动后,可以通过以下地址访问:

端口映射

默认映射 8080:8080,如需修改宿主机端口:

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

🔍 调试与监控

查看实时日志

# Docker Compose
docker-compose logs -f

# Docker
docker logs -f jtjai_media

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

进入容器调试

# 进入bash
docker exec -it jtjai_media bash

# 查看进程
docker exec jtjai_media ps aux

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

健康检查

容器配置了健康检查,可以查看状态:

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

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

🎯 高级用法

自定义资源限制

docker-compose.yml 中调整:

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

使用环境变量

environment:
  - TZ=Asia/Shanghai           # 时区
  - LOG_LEVEL=DEBUG            # 日志级别(需要代码支持)

网络配置

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

多实例部署

运行多个实例(不同端口):

# 实例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

🛠️ 故障排查

容器无法启动

# 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

视频无法保存

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

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

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

无法访问Web界面

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

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

# 3. 检查防火墙
sudo ufw status

📊 性能优化

构建优化

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

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

运行优化

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

🔐 安全建议

  1. 只读挂载配置文件

    volumes:
     - ./config.json:/app/config.json:ro
    
  2. 限制容器权限

    security_opt:
     - no-new-privileges:true
    read_only: true
    tmpfs:
     - /tmp
    
  3. 使用非root用户(需要修改Dockerfile)

    RUN useradd -m -u 1000 appuser
    USER appuser
    

📝 完整示例

生产环境部署

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

🎓 常用命令速查

# 构建
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