基于Docker Compose的GB28181视频平台全栈部署指南

在视频监控与物联网应用快速发展的今天,GB28181标准作为国内安防领域的通用协议,其重要性日益凸显。本文将带您从零开始,通过Docker Compose编排技术,构建一个包含WVP-PRO、ZLMEDIAKIT、录像服务、MySQL和Redis的完整视频平台解决方案。这种容器化部署方式不仅简化了传统手动安装的复杂流程,更为团队协作和后期维护提供了标准化基础。

1. 环境准备与架构设计

1.1 系统需求分析

在开始部署前,我们需要明确平台的技术选型和硬件要求。整套系统建议运行在Linux服务器上(推荐Ubuntu 20.04 LTS或CentOS 7+),配置至少4核CPU、8GB内存和100GB存储空间。网络方面需要开放以下端口:

  • HTTP/HTTPS :80/443(Nginx反代)
  • SIP信令 :5060(GB28181标准端口)
  • 媒体流 :30000-35000(RTP传输范围)
  • 管理端口 :18080(WVP-PRO)、18081(录像服务)

1.2 Docker环境配置

确保主机已安装Docker引擎(≥20.10.7)和Docker Compose(≥1.29.2)。执行以下命令进行验证:

# 检查Docker版本
docker --version

# 检查Compose版本
docker-compose --version

若未安装,可通过官方脚本快速部署:

# Docker安装
curl -fsSL https://get.docker.com | sh

# Compose安装
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

2. Docker Compose编排实现

2.1 服务架构设计

我们采用微服务架构,各组件职责如下:

服务名称 功能描述 依赖关系
wvp-pro GB28181信令与设备管理 MySQL, Redis, ZLM
zlmediakit 流媒体处理与转发
wvp-assist 录像管理与文件处理 Redis, ZLM
mysql 数据存储
redis 缓存与消息队列
nginx 反向代理与SSL卸载 所有Web服务

2.2 Compose文件详解

创建 docker-compose.yml 文件,内容如下:

version: '3.8'

services:
  mysql:
    image: mysql:5.7
    container_name: gb28181-mysql
    environment:
      MYSQL_ROOT_PASSWORD: StrongPassword123
      MYSQL_DATABASE: wvp
    volumes:
      - mysql_data:/var/lib/mysql
    restart: unless-stopped

  redis:
    image: redis:6-alpine
    container_name: gb28181-redis
    command: redis-server --requirepass RedisPass123
    volumes:
      - redis_data:/data
    restart: unless-stopped

  zlm:
    image: zlmediakit/zlmediakit:master
    container_name: gb28181-zlm
    ports:
      - "1935:1935"   # RTMP
      - "80:80"       # HTTP
      - "443:443"     # HTTPS
      - "554:554"     # RTSP
      - "30000-35000:30000-35000/udp" # RTP
    volumes:
      - ./zlm/config.ini:/opt/media/config/config.ini
      - ./record:/opt/media/bin/www/record
    restart: unless-stopped

  wvp-pro:
    image: 648540858/wvp-pro
    container_name: gb28181-wvp
    ports:
      - "18080:18080"
      - "5060:5060/udp"
    volumes:
      - ./wvp/application.yml:/config/application.yml
    depends_on:
      - mysql
      - redis
      - zlm
    restart: unless-stopped

  wvp-assist:
    image: panjjo/wvp-assist
    container_name: gb28181-assist
    ports:
      - "18081:18081"
    volumes:
      - ./assist/application.yml:/config/application.yml
      - ./record:/record
    depends_on:
      - redis
      - zlm
    restart: unless-stopped

  nginx:
    image: nginx:alpine
    container_name: gb28181-nginx
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./nginx/ssl:/etc/nginx/ssl
    depends_on:
      - wvp-pro
      - wvp-assist
    restart: unless-stopped

volumes:
  mysql_data:
  redis_data:

3. 关键服务配置解析

3.1 WVP-PRO核心配置

./wvp/application.yml 中配置WVP-PRO的核心参数:

spring:
  datasource:
    url: jdbc:mysql://mysql:3306/wvp?useSSL=false&characterEncoding=UTF8
    username: root
    password: StrongPassword123
  redis:
    host: redis
    password: RedisPass123

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

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

3.2 ZLMediaKit优化配置

./zlm/config.ini 需要特别关注以下参数:

[api]
secret=LluEd5evhoTswSZ1qDnafNEFTCFnnWCe

[hook]
enable=1
on_play=http://wvp-pro:18080/index/hook/on_play
on_publish=http://wvp-pro:18080/index/hook/on_publish

[rtp_proxy]
port_range=30000-35000

3.3 录像服务整合

录像服务的 ./assist/application.yml 配置示例:

record:
  path: /record
  day: 7

ffmpeg:
  path: /usr/bin/ffmpeg
  threads: 2

4. Nginx反向代理与安全加固

4.1 SSL证书配置

./nginx/ssl/ 目录下放置您的证书文件(如 gb28181.crt gb28181.key ),然后创建Nginx配置:

server {
    listen 443 ssl;
    server_name yourdomain.com;

    ssl_certificate /etc/nginx/ssl/gb28181.crt;
    ssl_certificate_key /etc/nginx/ssl/gb28181.key;

    location / {
        proxy_pass http://wvp-pro:18080;
        proxy_set_header Host $host;
    }

    location /assist/ {
        proxy_pass http://wvp-assist:18081/;
    }
}

4.2 性能优化建议

在Nginx配置中添加以下参数提升媒体流传输效率:

# 在http块中添加
proxy_buffering off;
proxy_request_buffering off;
proxy_http_version 1.1;
proxy_set_header Connection "";

5. 平台部署与验证

5.1 一键启动命令

完成所有配置后,执行以下命令启动整个平台:

docker-compose up -d

系统启动后,可以通过以下方式验证各服务状态:

# 检查容器运行状态
docker-compose ps

# 查看WVP-PRO日志
docker logs -f gb28181-wvp

# 测试MySQL连接
docker exec -it gb28181-mysql mysql -uroot -pStrongPassword123

5.2 常见问题排查

遇到服务异常时,可参考以下排查步骤:

  1. ZLM与WVP连接失败

    • 检查 media.secret 是否一致
    • 验证网络连通性: docker exec gb28181-wvp ping zlm
  2. 录像文件无法生成

    • 确认挂载目录权限: chmod -R 777 ./record
    • 检查FFmpeg路径是否正确
  3. 国标设备无法注册

    • 验证SIP端口(5060)是否开放
    • 检查 domain id 是否符合规范

6. 生产环境优化建议

6.1 高可用部署方案

对于关键业务场景,建议采用以下高可用架构:

                   +-------------+
                   |   Nginx LB  |
                   +------+------+
                          |
           +--------------+--------------+
           |                             |
+----------+----------+       +----------+----------+
| Docker Host (Node1) |       | Docker Host (Node2) |
|  - WVP-PRO          |       |  - WVP-PRO          |
|  - ZLM              |       |  - ZLM              |
+---------------------+       +---------------------+

6.2 监控与告警配置

推荐使用Prometheus+Grafana监控平台运行状态,关键指标包括:

  • 流媒体服务 :并发流���、CPU使用率、内存占用
  • 数据库 :查询延迟、连接数
  • 网络 :带宽使用、丢包率

示例Prometheus配置:

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

7. 进阶功能扩展

7.1 级联部署实现

在跨区域场景下,可通过GB28181级联功能实现平台互联。在WVP-PRO配置中添加:

sip:
  upstream:
    - id: 41010500002000000002
      domain: 4101050000
      ip: 192.168.1.100
      port: 5060
      password: 123456

7.2 智能分析集成

通过RTSP流接入AI分析服务,实现人脸识别、行为分析等功能。典型工作流:

  1. WVP-PRO获取设备视频流
  2. ZLM将流转发给AI分析服务
  3. 分析结果回传至业务系统
graph LR
    A[IPC] -->|GB28181| B(WVP-PRO)
    B -->|RTSP| C(ZLM)
    C -->|RTMP| D[AI Server]
    D --> E[Result Storage]

注意:实际部署时应根据具体AI服务调整协议和接口

8. 运维管理实践

8.1 日志收集方案

建议采用ELK栈集中管理日志:

  1. 配置Filebeat收集容器日志
  2. 通过Logstash进行日志处理
  3. 在Kibana中可视化分析

示例Filebeat配置:

filebeat.inputs:
- type: container
  paths:
    - '/var/lib/docker/containers/*/*.log'

output.logstash:
  hosts: ["logstash:5044"]

8.2 备份恢复策略

关键数据备份应包括:

  • MySQL数据 :定期mysqldump备份
  • 录像文件 :rsync同步到备份服务器
  • 配置文件 :版本控制(Git)

创建每日备份脚本:

#!/bin/bash
# MySQL备份
docker exec gb28181-mysql mysqldump -uroot -pStrongPassword123 wvp > /backup/wvp-$(date +%Y%m%d).sql

# 配置文件备份
tar czf /backup/config-$(date +%Y%m%d).tar.gz ./wvp ./zlm ./assist

# 清理7天前备份
find /backup -type f -mtime +7 -delete

更多推荐