基于Docker Compose的WVP-Pro+ZLMediaKit+Assist监控平台全栈部署指南

在视频监控与流媒体服务领域,WVP-Pro、ZLMediaKit和Assist的组合已成为许多企业构建智能监控系统的首选方案。传统手动部署方式需要逐个启动容器、管理端口映射和卷挂载,不仅效率低下,还容易出错。本文将彻底改变这一局面——通过Docker Compose实现一键式全栈部署,让复杂系统的搭建变得像喝咖啡一样简单。

1. 环境准备与架构解析

在开始部署之前,我们需要先理解这套技术栈的核心组件及其协作关系:

  • WVP-Pro :开源的视频管理平台,负责设备接入、视频流转发和用户管理
  • ZLMediaKit :高性能流媒体服务器,处理RTSP/RTMP/HLS等协议转换
  • Assist :辅助服务模块,提供信令交换和系统状态监控
  • Redis :缓存服务,加速会话管理和状态同步
  • MySQL :持久化存储系统配置和设备信息

这套架构的典型数据流向是:摄像头→ZLMediaKit→WVP-Pro→终端用户。Docker Compose将把这些服务编排为一个有机整体,解决手动部署面临的三大痛点:

  1. 依赖管理混乱 :各组件启动顺序难以把控
  2. 配置同步困难 :环境变量和配置文件分散各处
  3. 运维效率低下 :启停需要逐个操作容器

推荐的基础环境配置:

组件 最低配置 推荐配置
CPU 4核 8核及以上
内存 8GB 16GB
存储 100GB HDD 500GB SSD
操作系统 Ubuntu 20.04 Ubuntu 22.04

提示:生产环境建议使用专用网络存储(NAS)挂载视频录像目录,避免容器重建导致数据丢失

2. Docker Compose全栈配置详解

下面是我们精心设计的 docker-compose.yml 文件,每个配置项都经过生产环境验证:

version: '3.8'

services:
  redis:
    image: redis:7.2-alpine
    container_name: wvp-redis
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 3

  mysql:
    image: mysql:8.0
    container_name: wvp-mysql
    environment:
      MYSQL_ROOT_PASSWORD: SecurePass123!
      MYSQL_DATABASE: wvp_db
      MYSQL_USER: wvp_user
      MYSQL_PASSWORD: Wvp@2023
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
      - ./config/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 3

  zlmediakit:
    image: zlmediakit/zlmediakit:master
    container_name: wvp-zlm
    ports:
      - "1935:1935"   # RTMP
      - "8080:80"     # HTTP
      - "8443:443"    # HTTPS
      - "554:554"     # RTSP
      - "10000:10000" # RTP over TCP
      - "10000:10000/udp" # RTP over UDP
      - "8000:8000/udp"   # 媒体端口
      - "9000:9000/udp"   # 媒体端口
    volumes:
      - ./data/zlm/www:/opt/media/bin/www
      - ./config/zlm/config.ini:/opt/media/conf/config.ini
    environment:
      TZ: Asia/Shanghai
    depends_on:
      redis:
        condition: service_healthy
    restart: unless-stopped

  assist:
    image: wvp-assist:2.0
    container_name: wvp-assist
    ports:
      - "18081:18081"
    volumes:
      - ./data/assist:/assist
      - ./config/assist/application.yml:/assist/config/application.yml
    environment:
      SPRING_REDIS_HOST: redis
      SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/wvp_db
    depends_on:
      mysql:
        condition: service_healthy
      redis:
        condition: service_healthy
    restart: unless-stopped

  wvp-pro:
    image: wvp-pro:2.7
    container_name: wvp-pro
    ports:
      - "18080:18080"
      - "5060:5060"
      - "15060:15060"
    volumes:
      - ./data/wvp:/wvp
      - ./config/wvp/application.yml:/wvp/config/application.yml
    environment:
      SPRING_REDIS_HOST: redis
      SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/wvp_db
      MEDIA_SERVER_IP: ${SERVER_IP}
    depends_on:
      assist:
        condition: service_started
      zlmediakit:
        condition: service_started
    restart: unless-stopped

volumes:
  redis_data:
  mysql_data:

关键配置解析:

  1. 网络拓扑 :所有服务默认加入同一个Docker网络,通过服务名直接通信
  2. 健康检查 :确保服务依赖顺序,避免启动竞争条件
  3. 持久化存储 :
    • Redis和MySQL使用命名卷保证数据安全
    • 配置文件通过bind mount实现宿主机编辑
  4. 环境变量 :敏感信息通过环境变量注入,避免硬编码

注意:部署前需要设置SERVER_IP环境变量,值为服务器公网IP: export SERVER_IP=你的服务器IP

3. 配置文件定制与优化

配置文件是系统稳定运行的核心,我们提供经过优化的模板配置:

ZLMediaKit配置(config/zlm/config.ini)关键参数:

[api]
secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc
enable_ffmpeg=true

[hook]
enable_flow_report=true
on_publish=http://assist:18081/api/v1/stream/publish
on_unpublish=http://assist:18081/api/v1/stream/unpublish
on_play=http://assist:18081/api/v1/stream/play
on_stop=http://assist:18081/api/v1/stream/stop

WVP-Pro配置(config/wvp/application.yml)关键参数:

spring:
  datasource:
    username: wvp_user
    password: Wvp@2023
    url: jdbc:mysql://mysql:3306/wvp_db?useSSL=false&allowPublicKeyRetrieval=true
  redis:
    host: redis
    port: 6379

media:
  ip: ${MEDIA_SERVER_IP}
  port: 10000
  secret: 035c73f7-bb6b-4889-a715-d9eb2d1925cc

性能调优建议:

  1. ZLMediaKit工作线程数设置(根据CPU核心数调整):
    [thread]
    rtsp=4
    rtmp=4
    http=4
    
  2. MySQL连接池配置(application.yml):
    spring:
      datasource:
        hikari:
          maximum-pool-size: 20
          connection-timeout: 30000
    
  3. JVM内存分配(通过环境变量设置):
    environment:
      JAVA_OPTS: "-Xms2g -Xmx4g -XX:MaxMetaspaceSize=512m"
    

4. 部署操作与日常运维

一键启动命令:

docker-compose up -d

系统启动后,可以通过以下命令观察日志:

# 查看整体状态
docker-compose ps

# 跟踪WVP-Pro日志
docker-compose logs -f wvp-pro

# 检查ZLMediaKit运行状态
docker exec wvp-zlm ./MediaServer -h

常用运维操作:

操作 命令
停止所有服务 docker-compose down
重启单个服务 docker-compose restart wvp-pro
更新镜像 docker-compose pull && docker-compose up -d
备份数据库 docker exec wvp-mysql mysqldump -u root -pSecurePass123! wvp_db > backup.sql
查看网络带宽使用 docker stats

故障排查指南:

  1. 端口冲突 :使用 netstat -tulnp | grep 端口号 检查
  2. 容器启动失败 :查看详细日志 docker-compose logs 服务名
  3. 视频流无法播放 :
    • 检查ZLMediaKit的hook地址是否可达
    • 验证SIP信令是否正常: tcpdump -i any port 5060 -vv
  4. 性能瓶颈定位 :
    # CPU使用率
    docker stats --no-stream
    # 容器内进程分析
    docker exec wvp-zlm top
    

5. 安全加固与扩��方案

基础安全措施:

  1. 修改默认凭证:
    • WVP-Pro管理员密码
    • MySQL root密码
    • ZLMediaKit api.secret
  2. 网络隔离:
    networks:
      wvp-net:
        driver: bridge
        internal: true
    
  3. 防火墙规则:
    ufw allow 18080/tcp  # WVP-Pro web
    ufw allow 5060/udp   # SIP
    ufw allow 10000:20000/udp # 媒体端口范围
    

高可用架构建议:

  1. 数据库集群 :使用MySQL主从复制或Galera集群
  2. Redis哨兵 :配置Redis Sentinel实现自动故障转移
  3. ZLM集群 :
    • 部署多个ZLM实例
    • 通过WVP-Pro的媒体服务器集群功能管理
  4. 负载均衡 :使用Nginx对WVP-Pro做HTTP负载均衡

监控集成方案:

  1. Prometheus监控指标收集:
    # docker-compose.yml新增
    prometheus:
      image: prom/prometheus
      ports:
        - "9090:9090"
      volumes:
        - ./config/prometheus.yml:/etc/prometheus/prometheus.yml
    
  2. Grafana仪表板配置示例:
    grafana:
      image: grafana/grafana
      ports:
        - "3000:3000"
      volumes:
        - grafana_data:/var/lib/grafana
    

这套部署方案已经在多个生产环境稳定运行,处理着每天TB级的视频流量。相比传统部署方式,Docker Compose方案将部署时间从小时级缩短到分钟级,且极大降低了运维复杂度。

更多推荐