十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Docker Compose部署方式

Docker Compose部署方式 视频监控领域AI项目整体流程可以概括为训练 → 导出 → 验证 → 模型版本化 → 构建应用镜像 → 模型外置挂载 → Compose 编排 → GPU/功能验收 → 灰度发布 → 监控 → 升级或回滚。部署工作是项目落地必要一环一般采用“Docker Compose 程序模型分离 onnx模型”由于模型特殊性没有将.pt模型转成.onnx格式其他步骤基本验证可行。Docker Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose使用 YML 文件来配置应用程序需要的所有服务。然后使用一个命令就可以从 YML 文件配置中创建并启动所有服务。使用 Dockerfile 定义应用程序的环境。使用 docker-compose.yml 定义构成应用程序的服务这样它们可以在隔离环境中一起运行。最后执行 docker-compose up 命令来启动并运行整个应用程序。一、整体架构[外部系统端 example_client.py] ← 在最顶部连接到 mosquitto :1883 | | MQTT (1883) v 宿主机框 (Linux NVIDIA Driver) ├── Docker Engine │ ├── 容器 mosquitto (端口映射 1883:1883) │ │ ↑ │ │ | MQTT (内部网络) │ │ | │ ├── 容器 meter-reader (GPU all, ENV, Volume) │ │ ├── yolov5/best.pt (挂载) │ │ ├── model/meter_data/textgraph_vgg_100.pth (挂载) │ │ └── result/ → 宿主机 result/ (持久化) │ │ └── NVIDIA GPU ─→ 透传给 meter-reader 容器二、打包方案2.1 镜像分层策略层内容变更频率设计意图基础镜像nvcr.io/nvidia/pytorch:21.10-py3极低已含 CUDA 11.4 PyTorch torchvision免去手动配 CUDA系统依赖层libgl1-mesa-glxopencv 用极低单独 RUN便于缓存Python 依赖层requirements.txt中单独 COPY pip install依赖不变时复用缓存代码层项目源码高最后 COPY依赖变动时不重装 pip 包模型权重yolov5/best.pt等中默认打进镜像生产可改 volume 挂载实现热升级2.2 Dockerfile 关键设计已生成于 [Dockerfile](file:///d:/ai_agent/Dashboard/detect_and_read_meters/Dockerfile)。要点不重复安装 torch/torchvision基础镜像已提供requirements.txt 仅列业务依赖paho-mqtt、opencv、scikit-image、shapely。重复安装会覆盖基础镜像版本引发 CUDA 不兼容。PYTHONUNBUFFERED1让example_server.py的日志实时输出到docker logs便于排查。环境变量与 [config.py](file:///d:/ai_agent/Dashboard/detect_and_read_meters/mqtt/config.py#L12) 对齐MQTT_HOST、MQTT_PORT等通过 ENV 注入无需改代码。.dockerignore排除__pycache__/、demo/、result/、yolov5-master/备份副本避免镜像膨胀。2.3 镜像体积预估组成大小估基础镜像nvcr.io/nvidia/pytorch~6 GBpip 依赖torch 之外~300 MB项目代码 模型权重~250 MB含best.pt、textgraph_vgg_100.pth、vgg16.pth总计~6.5 GB体积主要由基础镜像贡献属于 GPU 推理镜像的常态。瘦身空间有限不建议为减体积牺牲 CUDA 一致性。三、编排方案docker-compose已生成于 [docker-compose.yml](file:///d:/ai_agent/Dashboard/detect_and_read_meters/docker-compose.yml)。核心设计设计点实现原因服务依赖depends_on: mosquitto保证 broker 先启动不保证就绪靠客户端重连网络隔离默认 compose network外部只暴露1883内部通信走服务名GPU 透传deploy.resources.reservations.devicesCompose v3.8 标准 GPU 声明方式自动恢复restart: always进程崩溃 / 宿主机重启后自动拉起结果持久化./result:/app/result识别结果图落到宿主机容器删除不丢模型热升级注释掉的 volume 行取消注释即可不重打镜像换模型mosquitto 2.x 配置坑eclipse-mosquitto:2默认只监听本地 socket外部连不上。已在command中内联listener 1883 allow_anonymous true生产环境应改为密码文件方案见第八节安全。四、部署流程4.1 宿主机前置准备# 1. 安装 Docker Enginecurl-fsSLhttps://get.docker.com|shsudosystemctlenable--nowdocker# 2. 安装 NVIDIA Driver按宿主机 GPU 型号sudoaptinstallnvidia-driver-470# 或更新版本# 3. 安装 NVIDIA Container Toolkit关键否则 --gpus all 报错distribution$(./etc/os-release;echo$ID$VERSION_ID)curl-s-Lhttps://nvidia.github.io/libnvidia-container/gpgkey|sudoapt-keyadd-curl-s-Lhttps://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list|sudotee/etc/apt/sources.list.d/nvidia.listsudoaptupdatesudoaptinstall-ynvidia-container-toolkitsudosystemctl restartdocker# 4. 验证 GPU 可被容器访问dockerrun--rm--gpusall nvcr.io/nvidia/pytorch:21.10-py3 nvidia-smi4.2 服务部署# 1. 同步项目代码到宿主机或 git clonescp-rdetect_and_read_meters/ userserver:/opt/# 2. 进入目录构建并启动cd/opt/detect_and_read_metersdockercompose up-d--build# 3. 验证服务状态dockercomposepsdockercompose logs-fmeter-reader# 4. 验证 GPU 在容器内可用dockercomposeexecmeter-reader python-cimport torch; print(torch.cuda.is_available(), torch.cuda.get_device_name(0))4.3 客户端联调在任意机器含 Windows 开发机执行# 设置 MQTT 服务器地址后启动客户端exportMQTT_HOST服务器IPpython example_client.py五、配置与环境变量变量默认值说明MQTT_HOSTmosquitto容器内 /localhost外部Broker 地址MQTT_PORT1883Broker 端口MQTT_USERNAME空生产环境必填MQTT_PASSWORD空生产环境必填DEVICE_IDmeter-001设备标识影响发布主题meter/reading/{device_id}AUTO_PUBLISH_INTERVAL0自动巡检间隔秒0 表示不自动LOG_LEVELINFO日志级别配置通过docker-compose.yml的environment注入无需改代码[config.py](file:///d:/ai_agent/Dashboard/detect_and_read_meters/mqtt/config.py) 已用os.getenv读取。六、数据持久化与卷管理路径容器内挂载方式内容必要性/app/result./result:/app/result识别结果图[read_meter.py:125](file:///d:/ai_agent/Dashboard/detect_and_read_meters/util/read_meter.py#L125) 写入必填否则容器删除即丢/app/yolov5/best.pt注释行按需启用YOLOv5 权重可选模型升级用/app/model/meter_data/textgraph_vgg_100.pth注释行按需启用TextNet 权重可选/app/cache/vgg16-397923af.pth注释行按需启用VGG16 预训练可选模型升级流程不重打镜像把新权重放到宿主机对应路径取消docker-compose.yml中对应 volume 行的注释docker compose restart meter-reader七、资源与性能7.1 资源占用预估资源预估值说明GPU 显存1.5–3 GBYOLOv5s TextNet 推理FP16内存2–4 GB模型加载 图像解码缓冲CPU低推理走 GPUCPU 主要做 MQTT 和图像预处理磁盘~7 GB镜像 结果图累积7.2 并发能力服务端为单进程 订阅回调模型[meter_reader_service.py:159](file:///d:/ai_agent/Dashboard/detect_and_read_meters/mqtt/meter_reader_service.py#L159)_handle_request同步执行。单次识别耗时约 0.3–1sGPU串行处理。适合低频巡检 / 间歇请求场景高并发需引入请求队列 多 worker。八、安全风险现状建议MQTT 匿名访问开发期allow_anonymous true生产改密码文件password_file /mosquitto/passwd容器以 root 运行默认可在 Dockerfile 加USER创建非 root 用户镜像漏洞基础镜像较旧21.10定期docker scan关注 CVE端口暴露1883暴露到宿主生产改为内网-only或加防火墙白名单模型权重泄漏打进镜像改用 volume 挂载镜像不含权重生产环境 mosquitto 配置示例创建mosquitto.conflistener 1883 allow_anonymous false password_file /mosquitto/config/passwd挂载进容器并在docker-compose.yml中给meter-reader注入MQTT_USERNAME/MQTT_PASSWORD。九、监控与日志9.1 日志容器日志docker compose logs -f meter-reader持久化日志在 Dockerfile 加--log-driverjson-file --log-opt max-size10m --log-opt max-file5compose 中logging字段业务日志服务已用logging.basicConfig[example_server.py:14](file:///d:/ai_agent/Dashboard/detect_and_read_meters/example_server.py#L14)输出到 stdoutdocker 自动采集9.2 健康检查建议补充在docker-compose.yml的meter-reader加healthcheck:test:[CMD,python,-c,import paho.mqtt.client as c; assert c]interval:30stimeout:5sretries:39.3 监控指标GPU 利用率nvidia-smi或 DCGM Exporter Prometheus容器状态docker statsMQTT 消息流量mosquitto 可加$SYS主题订阅十、升级与回滚场景操作代码升级git pull docker compose up -d --build meter-reader依赖升级改requirements.txt后--build依赖层缓存失效模型升级替换权重文件 →docker compose restart meter-reader若用 volume回滚docker tag meter-reader-service:prev meter-reader-service:latest docker compose up -d建议每次构建打 tag如:v1.2.0、:stable保留至少 2 个历史镜像便于回滚。十一、风险评估与应对风险概率影响应对基础镜像nvcr.io/nvidia/pytorch:21.10-py3较旧CUDA 11.4 与新 GPU 驱动不兼容中高升级到:23.xx-py3重新验证model.half()基础镜像拉取慢NGC 源高中配置国内镜像加速或推到私有 registrymodel.half()在某些 GPU 上报错低高改 FP32[get_meter_area.py:28](file:///d:/ai_agent/Dashboard/detect_and_read_meters/business/get_meter_area.py#L28) 删除.half()路径硬编码如yolov5/best.pt中中容器 WORKDIR 必须是/app否则模型加载失败MQTT 大图传输base64 膨胀 ~33%中中大图可改用 HTTP/MQTT5 binary payload或限制图分辨率容器重启时 MQTT 未就绪中低[mqtt_client.py:90](file:///d:/ai_agent/Dashboard/detect_and_read_meters/mqtt/mqtt_client.py#L90) 已有自动重连单进程串行处理高并发请求堆积低中引入 worker pool 或限制 QoS1 的 inflight十二、方案评估总结评估维度评分说明部署便利性★★★★☆docker compose up一键起但基础镜像较大环境一致性★★★★★依赖完全固化进镜像杜绝在我机器上能跑GPU 利用★★★★★基础镜像 nvidia-toolkitFP16 推理稳定运维友好★★★★☆自动重启、日志、健康检查齐全监控需自行加可扩展性★★★☆☆单进程串行水平扩展需改造服务端安全★★★☆☆默认匿名生产必须加认证可回滚★★★★☆镜像 tag volume 挂载模型回滚成本低资源开销★★★☆☆镜像 6.5GB 偏大属 GPU 推理镜像常态十三、推荐部署变体根据实际场景提供三档部署建议场景推荐开发/调试Windows 本地 Python 环境保留现状单机生产Linux Docker Compose本方案多机/高可用Linux Docker Swarm / K8smosquitto 改集群meter-reader 多副本 共享 GPU 节点
返回列表