1. 环境准备与基础概念
在开始部署之前,我们需要先理解几个关键组件的作用。wvp-GB28181-pro是一个开源的视频监控平台,支持国标GB/T28181协议,能够对接各类网络摄像头和NVR设备。而ZLMediaKit则是轻量级的流媒体服务器,负责处理视频流的转发、转码和录制。用Docker来部署这两个组件,最大的好处就是避免了繁琐的环境配置,真正做到开箱即用。
我建议准备一台至少4核CPU、8GB内存的Linux服务器(Ubuntu 20.04/22.04或CentOS 7+),并确保已经安装好Docker和docker-compose。这里有个小技巧:如果你用的是云服务器,记得在安全组里提前放行后续要用到的端口(比如554、1935、18080等),免得部署完发现外网访问不了。
说到网络配置,有个容易踩坑的地方:GB28181设备注册时需要双向通信。这意味着不仅服务器要能访问设备,设备也要能访问服务器的SIP端口(默认8116)。如果是内网测试环境,直接用192.168.x.x这样的内网IP就行;如果是公网部署,就需要配置端口映射或者使用云厂商的负载均衡服务。
2. ZLMediaKit容器化部署
2.1 快速拉起基础服务
我们先从ZLMediaKit开始,这是整个系统的流媒体处理核心。官方已经提供了现成的Docker镜像,直接运行以下命令就能拉起服务:
docker pull zlmediakit/zlmediakit:master docker run -d --name zlmediakit-tmp zlmediakit/zlmediakit:master这里有个实用技巧:先启动临时容器获取默认配置。因为直接修改容器内的配置不方便维护,我们应该把配置文件挂载到宿主机。执行以下命令提取配置:
mkdir -p /docker_container_data/zlmediakit/conf docker cp zlmediakit-tmp:/opt/media/conf/config.ini /docker_container_data/zlmediakit/conf/ docker rm -f zlmediakit-tmp2.2 关键配置项详解
打开提取的config.ini文件,这几个参数必须重点关注:
[api] secret = your_custom_secret # 这个密钥要和wvp的配置一致 [general] mediaServerId = your_server_id # 服务器唯一标识 [rtp_proxy] port_range = 30000-30500 # RTP端口范围实测中发现,如果RTP端口范围设置过小,在多路视频并发时会出现端口耗尽的问题。建议生产环境至少预留1000个端口(比如30000-31000)。另外记得把时区设为Asia/Shanghai,否则录像文件的时间戳会不对。
2.3 用docker-compose编排服务
推荐使用docker-compose管理服务,这里是我的配置模板:
version: '3.8' services: zlmediakit: image: zlmediakit/zlmediakit:master container_name: zlmediakit restart: always environment: TZ: Asia/Shanghai ports: - "1935:1935" # RTMP - "8080:80" # HTTP-FLV/HLS - "554:554" # RTSP - "30000-30500:30000-30500/tcp" # RTP over TCP - "30000-30500:30000-30500/udp" # RTP over UDP volumes: - /docker_container_data/zlmediakit/conf/config.ini:/opt/media/conf/config.ini - /etc/localtime:/etc/localtime:ro启动后可以用docker logs -f zlmediakit查看实时日志,正常会看到"HTTP API启动成功"的提示。这时候访问http://服务器IP:8080/index/api/getServerConfig?secret=your_secret应该能返回JSON格式的配置信息。
3. wvp-GB28181-pro部署实战
3.1 源码编译与打包
wvp项目需要自己编译打包,先克隆源码:
git clone https://gitee.com/pan648540858/wvp-GB28181-pro.git前端编译可能会遇到node-sass报错的问题,实测用以下命令最稳定:
cd wvp-GB28181-pro/web_src/ npm --registry=https://registry.npmmirror.com install --force npm run build后端打包直接用Maven:
cd wvp-GB28181-pro mvn package编译完成后会在target目录生成wvp-pro-*.jar文件。这里有个小技巧:如果编译失败,可以尝试先执行mvn clean清除缓存。
3.2 配置文件精讲
application.yml是wvp的核心配置,有几个关键部分需要注意:
spring: redis: host: redis # 如果redis单独部署要改这里 password: your_redis_password datasource: url: jdbc:mysql://mysql:3306/wvp?useSSL=false username: root password: your_db_password sip: ip: 0.0.0.0 # 监听所有网卡 port: 8116 # SIP服务端口 media: id: zlmediakit # 必须和ZLMediaKit的mediaServerId一致 ip: 192.168.1.100 # ZLM服务器内网IP http-port: 8080 # ZLM的HTTP端口 secret: your_shared_secret # 两边要相同特别提醒:如果wvp和ZLMediaKit不在同一台服务器,media.hook-ip必须设置为wvp服务器的可访问IP,否则ZLM无法回调通知事件。
3.3 Docker镜像构建
我优化过的Dockerfile包含时区设置和启动脚本:
FROM openjdk:8-jre RUN mkdir -p /home/wvp WORKDIR /home/wvp ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone COPY start.sh /home/wvp/ RUN chmod +x /home/wvp/start.sh COPY target/wvp-pro-*.jar /home/wvp/ EXPOSE 18080 8116 ENTRYPOINT ["./start.sh"]配套的start.sh脚本内容如下:
#!/bin/sh JAR_FILE=$(ls -t /home/wvp/wvp-pro-*.jar | head -n 1) exec java -jar "$JAR_FILE"构建命令示例:
docker build -t wvp-pro:2.0 -f Dockerfile .3.4 容器化部署
完整的docker-compose.yml应该包含MySQL、Redis和wvp服务:
version: '3.8' services: mysql: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: your_db_password MYSQL_DATABASE: wvp volumes: - /docker_container_data/mysql:/var/lib/mysql redis: image: redis:6 command: redis-server --requirepass your_redis_password volumes: - /docker_container_data/redis:/data wvp: image: wvp-pro:2.0 depends_on: - mysql - redis ports: - "18080:18080" - "8116:8116/tcp" - "8116:8116/udp" volumes: - /docker_container_data/wvp/record:/home/wvp/record启动后用docker-compose logs -f wvp查看日志,正常会看到"SIP服务启动成功"的提示。访问http://服务器IP:18080应该能看到登录页面,默认账号admin,密码admin。
4. 常见问题排查指南
4.1 设备注册失败分析
如果摄像头无法注册到wvp,建议按这个顺序检查:
- 确认wvp的SIP配置中
ip不是127.0.0.1 - 检查设备配置的SIP服务器地址和端口是否正确
- 用
tcpdump -i any port 8116抓包看是否有SIP报文到达 - 查看wvp日志中的REGISTER相关日志
我遇到过一种特殊情况:某些设备要求SIP ID必须完全匹配domain配置。比如domain设为4101050000时,设备SIP ID必须是41010500001320000001这样的格式。
4.2 视频播放异常处理
当网页能显示设备列表但无法播放时:
- 先确认ZLMediaKit的secret配置和wvp一致
- 检查端口映射是否正确,特别是RTP端口范围
- 在ZLM管理界面查看流是否已经生成
- 尝试用VLC直接播放RTSP流测试
有个典型错误是"端口被占用",这通常是因为之前容器异常退出没有释放端口。解决方法是用netstat -tunlp | grep 端口号找到占用进程并kill掉。
4.3 性能优化建议
在高并发场景下,建议:
- 为Docker分配至少4GB内存
- 调整ZLMediaKit的
thread_num参数(建议CPU核数×2) - 启用Redis缓存设备状态
- 对录像存储目录使用SSD磁盘
对于大规模部署,可以考虑将ZLMediaKit和wvp部署在不同服务器,并通过内网专线通信。我曾经在32路1080P并发的场景下,将ZLM单独部署在4核8G的服务器上,CPU利用率能控制在60%以下。