容器化GB28181视频平台:Docker Compose全栈部署指南

在视频监控与流媒体领域,GB28181标准已经成为国内安防行业的通用协议。但对于开发者而言,搭建一个完整的测试环境往往需要面对WVP-PRO、ZLMediaKit、Redis、MySQL等多个组件的复杂配置。本文将彻底改变这一现状,通过Docker Compose实现一键式容器化部署,涵盖从信令管理、媒体流转发到录像服务的完整解决方案。

1. 环境规划与准备工作

在开始部署之前,合理的环境规划能够避免后续的网络冲突和资源争用。我们建议采用以下架构设计:

  • 网络拓扑 :创建独立的Docker网络 gb28181_net ,使用172.28.0.0/24网段
  • 存储规划
    • MySQL数据卷: gb28181_mysql_data
    • Redis数据卷: gb28181_redis_data
    • 录像文件存储: gb28181_record_volume
  • 端口映射
    • WVP-PRO管理界面:18080/tcp
    • ZLM HTTP API:88/tcp
    • ZLM RTMP:1935/tcp
    • ZLM RTSP:554/tcp

硬件配置建议:

最低配置:2核CPU/4GB内存/50GB存储
推荐配置:4核CPU/8GB内存/100GB SSD存储

2. Docker Compose全栈配置

创建 docker-compose.yml 文件,这是整个部署的核心。我们将采用多服务编排的方式,确保各组件之间的依赖关系正确建立。

version: '3.8'

services:
  mysql:
    image: mysql:8.0
    container_name: gb28181_mysql
    environment:
      MYSQL_ROOT_PASSWORD: securepassword
      MYSQL_DATABASE: wvp
    volumes:
      - gb28181_mysql_data:/var/lib/mysql
    networks:
      - gb28181_net
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 5s
      timeout: 10s
      retries: 3

  redis:
    image: redis:6.2
    container_name: gb28181_redis
    command: redis-server --requirepass redispwd
    volumes:
      - gb28181_redis_data:/data
    networks:
      - gb28181_net
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 5s
      timeout: 10s
      retries: 3

  zlm:
    image: zlmediakit/zlmediakit:master
    container_name: gb28181_zlm
    ports:
      - "1935:1935"
      - "88:80"
      - "554:554"
      - "30000-35000:30000-35000/udp"
    volumes:
      - gb28181_record_volume:/opt/media/bin/www/record
    environment:
      TZ: Asia/Shanghai
    networks:
      - gb28181_net
    depends_on:
      - redis

  wvp-pro:
    image: panjjo/wvp-pro
    container_name: gb28181_wvp
    ports:
      - "18080:18080"
      - "15060:15060/udp"
    volumes:
      - ./config/application.yml:/config/application.yml
      - gb28181_record_volume:/record
    environment:
      TZ: Asia/Shanghai
    networks:
      - gb28181_net
    depends_on:
      - mysql
      - redis
      - zlm

  wvp-assist:
    image: panjjo/wvp-assist
    container_name: gb28181_assist
    ports:
      - "18081:18081"
    volumes:
      - ./config/assist.yml:/config/application.yml
      - gb28181_record_volume:/record
    networks:
      - gb28181_net
    depends_on:
      - redis
      - zlm

volumes:
  gb28181_mysql_data:
  gb28181_redis_data:
  gb28181_record_volume:

networks:
  gb28181_net:
    driver: bridge
    ipam:
      config:
        - subnet: 172.28.0.0/24

关键配置说明:

  1. 服务依赖 :通过 depends_on 确保服务启动顺序
  2. 健康检查 :MySQL和Redis配置了健康检查机制
  3. 端口范围 :ZLM的RTP端口范围30000-35000/udp必须开放
  4. 时区设置 :所有容器统一使用Asia/Shanghai时区

3. 配置文件深度定制

在项目根目录创建 config 文件夹,存放各服务的配置文件。这是整个系统正常工作的关键。

3.1 WVP-PRO核心配置

创建 config/application.yml 文件:

spring:
  redis:
    host: redis
    port: 6379
    password: redispwd
    database: 0
  datasource:
    url: jdbc:mysql://mysql:3306/wvp?useSSL=false&characterEncoding=UTF-8
    username: root
    password: securepassword

sip:
  ip: 0.0.0.0
  port: 15060
  domain: 4101050000
  id: 41010500002000000001

media:
  id: ZLM001
  ip: zlm
  http-port: 80
  secret: LluEd5evhoTswSZ1qDnafNEFTCFnnWCe
  rtp:
    enable: true
    port-range: 30000,35000

server:
  port: 18080

record-assist-port: 18081

3.2 录像服务配置

创建 config/assist.yml 文件:

spring:
  redis:
    host: redis
    port: 6379
    password: redispwd
    database: 1

record:
  /record

ffmpeg: /usr/bin/ffmpeg
ffprobe: /usr/bin/ffprobe

server:
  port: 18081

3.3 ZLM运行时配置

虽然我们使用了官方镜像,但有时需要调整ZLM的运行时参数。可以通过以下命令进入容器修改:

docker exec -it gb28181_zlm bash
vi /opt/media/config/config.ini

关键参数建议:

[api]
secret=LluEd5evhoTswSZ1qDnafNEFTCFnnWCe

[hook]
enable=0
alive_interval=10

[rtp_proxy]
port_range=30000-35000

4. 系统部署与运维

4.1 一键启动与停止

创建管理脚本 manage.sh

#!/bin/bash

case "$1" in
  start)
    docker-compose up -d
    ;;
  stop)
    docker-compose down
    ;;
  restart)
    docker-compose restart
    ;;
  logs)
    docker-compose logs -f
    ;;
  *)
    echo "Usage: $0 {start|stop|restart|logs}"
    exit 1
esac

赋予执行权限:

chmod +x manage.sh

4.2 服务健康检查

验证各服务状态:

# 检查容器状态
docker ps -a

# 检查WVP-PRO日志
docker logs -f gb28181_wvp

# 测试MySQL连接
docker exec -it gb28181_mysql mysql -uroot -psecurepassword

# 测试Redis连接
docker exec -it gb28181_redis redis-cli -a redispwd

4.3 常见问题排查

  1. ZLM无法推流

    • 检查30000-35000 UDP端口是否开放
    • 验证ZLM和WVP-PRO的secret配置是否一致
  2. 录像文件无法生成

    • 确认 gb28181_record_volume 卷已正确挂载
    • 检查wvp-assist的redis配置是否正确
  3. 设备注册失败

    • 确认SIP配置中的domain和id符合GB28181规范
    • 检查15060 UDP端口是否开放

5. 高级功能实现

5.1 录像管理优化

默认的录像服务可能无法满足生产环境需求,我们可以通过以下方式增强:

  1. 定时清理脚本
docker exec -it gb28181_assist bash -c "find /record -type f -mtime +7 -delete"
  1. 录像文件转码
# 在wvp-assist容器中安装ffmpeg
docker exec -it gb28181_assist apt-get update && apt-get install -y ffmpeg

5.2 性能监控方案

添加Prometheus监控:

# 在docker-compose.yml中添加
monitor:
  image: prom/prometheus
  ports:
    - "9090:9090"
  volumes:
    - ./monitor/prometheus.yml:/etc/prometheus/prometheus.yml
  networks:
    - gb28181_net

对应的prometheus.yml配置:

scrape_configs:
  - job_name: 'wvp'
    static_configs:
      - targets: ['wvp:18080']
  - job_name: 'zlm'
    static_configs:
      - targets: ['zlm:80']

5.3 HTTPS安全加固

为管理界面启用HTTPS:

  1. 准备SSL证书
  2. 修改WVP-PRO配置:
server:
  ssl:
    enabled: true
    key-store: classpath:keystore.jks
    key-store-password: yourpassword

6. 实际应用场景

6.1 设备接入测试

典型的IPC接入流程:

  1. 在IPC网页配置界面设置SIP服务器地址
  2. 填写WVP-PRO的SIP ID和域信息
  3. 配置认证密码(如有)
  4. 保存后等待设备注册

6.2 视频流调用

获取视频流的几种方式:

  1. RTSP流
    rtsp://zlm:554/{streamId}
    
  2. RTMP流
    rtmp://zlm:1935/{streamId}
    
  3. FLV-H5播放
    http://zlm:88/{streamId}.flv
    

6.3 录像检索与回放

通过wvp-assist接口管理录像:

  • 查询录像列表: GET http://wvp-assist:18081/api/record/list
  • 下载录像文件: GET http://wvp-assist:18081/api/record/download/{fileId}
  • 删除录像记录: DELETE http://wvp-assist:18081/api/record/{fileId}

7. 生产环境建议

对于需要长期运行的业务环境,建议考虑以下优化措施:

  1. 数据库备份策略
docker exec gb28181_mysql sh -c 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" wvp' > backup.sql
  1. 日志轮转配置
# 在WVP-PRO的application.yml中添加
logging:
  file:
    name: logs/wvp.log
    max-size: 50MB
    max-history: 30
  1. 资源限制
# 在docker-compose.yml中为每个服务添加
deploy:
  resources:
    limits:
      cpus: '1'
      memory: 2G
    reservations:
      cpus: '0.5'
      memory: 1G
  1. 高可用方案
    • MySQL主从复制
    • Redis哨兵模式
    • ZLM集群部署

这套容器化部署方案已经在多个实际项目中验证,最大的优势在于环境的一致性和可重复性。开发团队可以轻松地在本地复现生产环境,而运维团队则能够通过简单的命令完成整个系统的启停和维护。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐