在港口码头的闸口、堆场、岸桥、仓库及危险品区等高危作业场景中,反光衣识别任务是保障安全生产的重要防线。由于港口环境复杂、视频通道数量多且网络环境各异,在私有化部署时使用 Docker 架构是保证服务快速交付与环境隔离的标准做法。
本文作为一名部署工程师的实战笔记,整理了一套针对港口码头场景的 Docker部署AI视频分析平台 全流程指南,涵盖部署前的准备清单、部署中的验证手段以及部署后的排查方法。
适用场景
本指南适用于港口码头的私有化边缘分析与中心化部署场景,具体防区包括:
-
闸口/出入口:进出集卡司机与作业人员穿戴合规检测。
-
堆场/仓库:高空吊装与堆垛区域人员违规闯入及反光衣检测。
-
岸桥/危险品区:高风险作业区全天候人员安全防护监测。
关联核心算法任务:反光衣穿戴检测算法(YOLOv8/TensorRT)。
准备清单
部署前请按下表逐一核对硬件与软件环境配置,避免因环境不兼容导致部署中断:
| 检查项 | 参数要求 / 建议基线 | 本地确认 |
|---|---|---|
| 操作系统 | Ubuntu 22.04 LTS / CentOS 7.9 (Linux x86_64) | |
| CPU/算力 | Intel Xeon 16核 3.2GHz 及以上 | |
| GPU / NPU | NVIDIA RTX 4090 (24GB) / NVIDIA A2000 x 2 | |
| GPU 驱动/CUDA | NVIDIA Driver |
|
| Docker 环境 | Docker Engine |
|
| GPU 容器运行时 | NVIDIA Container Toolkit (nvidia-docker2) 已安装 |
|
| 内存/磁盘 | 内存 |
|
| 网络与并发 | 局域网带宽 |
|
| 摄像头数量 | 单节点接入 16 路 1080P@15fps H.264 摄像头 |
关键参数表
以下为平台核心服务、端口映射、卷挂载路径及核心配置项说明:
| 服务名称 | 内部/外部端口 | 镜像路径/环境变量 | 宿主机挂载目录 | 核心作用 |
|---|---|---|---|---|
| zlm-media | 554:554 (RTSP) 8080:8080 (HTTP) |
harbor.internal/aip/zlm:v3.2 |
/opt/aip/media/logs:/var/log/zlm |
流媒体转发与拉流服务 |
| algo-infer | 9000:9000 (gRPC) |
harbor.internal/aip/algo-vest:v2.4 |
/opt/aip/models:/app/models /dev/shm:/dev/shm |
基于 NVDEC/TensorRT 的算法推理引擎 |
| platform-service | 8000:8000 (Web API) |
harbor.internal/aip/platform:v1.8 |
/opt/aip/platform/logs:/app/logs /opt/aip/data/snaps:/app/snaps |
业务逻辑、通道管理与告警中心 |
| redis-cache | 6379:6379 |
redis:7.0-alpine |
/opt/aip/redis/data:/data |
任务状态去重与高频告警缓存 |
操作流程
整体部署分为六个阶段,请严格按顺序执行:
Plaintext
[1. 准备环境] ➔ [2. 拉取/导入镜像] ➔ [3. 配置文件修改] ➔ [4. 启动容器集群] ➔ [5. 功能与流水验证] ➔ [6. 正式上线监控]
1. 准备(环境初始化)
创建宿主机持久化目录结构,并配置 NVIDIA Docker 运行时:
Bash
# 创建统一数据与日志目录
mkdir -p /opt/aip/{media,models,platform,redis,data/snaps} /opt/aip/platform/logs
# 验证 GPU 驱动与容器运行时支持
nvidia-smi
docker info | grep -i runtime
2. 安装(镜像导入与网络创建)
创建独立的 Docker Bridge 网络,导入离线镜像包:
Bash
# 创建私有容器网络
docker network create --subnet=172.20.0.0/16 aip-network
# 导入离线镜像包(适用于港口无外网环境)
docker load -i aip-platform-v1.8.tar.gz
docker load -i aip-algo-vest-v2.4.tar.gz
docker load -i aip-zlm-v3.2.tar.gz
3. 配置(编写 Docker Compose 与业务参数)
在 /opt/aip 目录下创建 docker-compose.yml 文件:
YAML
version: '3.8'
networks:
aip-network:
external: true
services:
redis:
image: redis:7.0-alpine
container_name: aip-redis
restart: always
networks:
- aip-network
volumes:
- /opt/aip/redis/data:/data
zlm-media:
image: harbor.internal/aip/zlm:v3.2
container_name: aip-zlm
restart: always
ports:
- "554:554"
- "8080:8080"
networks:
- aip-network
volumes:
- /opt/aip/media/logs:/var/log/zlm
algo-infer:
image: harbor.internal/aip/algo-vest:v2.4
container_name: aip-algo
restart: always
shm_size: '4gb'
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu, video]
environment:
- CUDA_VISIBLE_DEVICES=0
- CONCURRENT_TASKS=16
networks:
- aip-network
volumes:
- /opt/aip/models:/app/models
- /opt/aip/data/snaps:/app/snaps
platform:
image: harbor.internal/aip/platform:v1.8
container_name: aip-platform
restart: always
ports:
- "8000:8000"
environment:
- REDIS_HOST=aip-redis
- MEDIA_HOST=aip-zlm
- ALGO_HOST=aip-algo
- CALLBACK_AUTH_TOKEN=Bearer_port_token_2026
networks:
- aip-network
volumes:
- /opt/aip/platform/logs:/app/logs
- /opt/aip/data/snaps:/app/snaps
depends_on:
- redis
- zlm-media
- algo-infer
4. 启动(容器集群拉起)
构建并后台拉起所有服务:
Bash
cd /opt/aip
docker compose up -d
# 查看容器运行状态
docker compose ps
5. 验证(五维集成测试)
完成部署后,必须通过以下 5 个指标验证服务正常:
-
Web UI :浏览器访问
http://<宿主机IP>:8000,登录界面正常加载。 -
视频预览 :添加岸桥 RTSP 流
rtsp://admin:pass@192.168.10.20:554/h264/ch1/main,显示画面秒开且无花屏。 -
算法告警:人员未穿反光衣进入堆场,页面在 2 秒内弹出高亮告警框与抓拍图。
-
日志健康 :查看日志无
CUDA OOM、Connection Refused或Decode Error。 -
回调验证:港口 TOC 系统正确接收到 webhook JSON 告警推送。
6. 上线(守护与自启)
设置 Docker 服务开机自启,并配置 Logrotate 防止日志爆满磁盘。
日志排查
遇到异常时,请按下面给出的排查路径快速定位根因:
排查步骤
-
查看平台控制日志:
docker logs -f --tail 100 aip-platform -
查看算法推理日志:
docker logs -f --tail 100 aip-algo -
查看流媒体拉流日志:
tail -f /opt/aip/media/logs/zlm.log
常见报错与排查方案
1. 服务无法拉起或状态为 Exited
-
现象 :
docker compose ps显示aip-algo状态为Exited (1)。 -
原因:Docker 未配置 NVIDIA Runtime,或模型路径不存在。
-
排查命令 :
docker logs aip-algo,寻找Nvidia driver not found提示。 -
解决方法 :安装
nvidia-container-toolkit并重启 Docker 服务。
2. GPU 不可见或 NVDEC 解码异常
-
现象 :日志提示
CUDA driver version is insufficient或NVDEC decode error -22。 -
排查命令:
Bash
docker exec -it aip-algo nvidia-smi -
解决方法:升级宿主机 NVIDIA 显卡驱动;检查摄像机编码,确认已关闭 H.265 B帧与 Smart264/265 编码。
3. RTSP 拉流失败 / 黑屏
-
现象 :ZLM 日志报错
RTSP connection timeout (554)。 -
排查命令:进入容器内部测试网络连通性:
Bash
docker exec -it aip-zlm nc -zv 192.168.10.20 554 -
解决方法:检查港口闸口交换机 VLAN 隔离策略,确保容器网段与 IPC 网段互通。
4. 告警不触发 / 丢帧
-
现象 :人员穿未穿反光衣均无告警,日志打印
Frame dropped due to slow inference。 -
排查命令 :
nvidia-smi查看 GPU 内存占用是否达到 100%。 -
解决方法 :降低单路视频流采样率(将 25fps 降至 15fps),或调大 docker
shm_size: '4gb'。
5. 延迟高(>10s)
-
现象:现场人员已通过闸口,Web 页面很久后才出告警。
-
原因:流媒体使用了 UDP 拉流导致严重重传包堆积,或算法使用了 CPU 解码。
-
解决方法 :在平台通道设置中将协议改为
rtsp_tcp;确认硬解码开启。
6. CPU 占用率接近 100%
-
现象 :
top命令显示ffmpeg或python进程吃满 CPU。 -
原因:软解码(CPU 解码)未成功切换为 NVDEC 硬件解码。
-
解决方法 :检查镜像中 FFmpeg 是否编译了
nvdec模块,在算法启动环境变量中强制添加USE_NVDEC=1。
性能优化
针对港口复杂环境下的 16 路以上高并发分析,建议实施以下优化措施:
-
共享内存调整 :Docker 默认
/dev/shm仅为 64MB,高并发硬解码极易崩溃,务必在docker-compose.yml中配置shm_size: '4gb'。 -
抓图与码率控制:摄像机统一调整为 1080P@15fps,码率配置为 CBR 2048Kbps,关闭 Smart 编码。
-
日志自动轮转:避免抓拍图片与容器日志塞满 SSD 磁盘,配置 logrotate 规则:
Plaintext
/opt/aip/platform/logs/*.log { daily rotate 7 missingok notifempty compress maxsize 100M }
回滚建议
如果在升级或部署过程中出现不可恢复的故障,请按以下步骤执行回滚:
-
停止当前容器集群:
Bash
cd /opt/aip && docker compose down -
切回上一版本镜像标签 :修改
docker-compose.yml中的镜像版本(例如将v1.8改回v1.7)。 -
恢复配置与数据库文件:
Bash
cp /opt/aip/backup/config.env.v1.7 /opt/aip/config.env -
重新拉起服务 :
docker compose up -d并验证 API 存活状态。
发布标签
Docker AI视频分析 私有化部署 港口安防 TensorRT 反光衣识别
延伸阅读/平台能力补充
在港口码头等大型高危作业区,私有化部署往往需要面对复杂的异构网络与庞大的摄像机接入量。如果您需要进一步评估软硬件配置或扩展更多安全算法:
-
可以了解支持海量并发与低延迟处理的视频分析能力,掌握如何快速接入港口多厂牌 NVR 与 IPC。
-
针对港口危险品区及闸口等高安全等级场景,查看标准的部署方案,实现全量数据本地化闭环管理。
-
探索涵盖反光衣穿戴、安全帽佩戴、区域闯入及烟火检测的算法清单,按需开箱即用。
技术评估与支持:我们提供私有化部署全套架构设计与现场交付支持。如果您正在规划港口码头安防智能化改造,欢迎联系技术团队预约演示环境并评估接入条件。