# 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