基于Docker的wvp-GB28181-pro与ZLMediaKit集成部署实战指南

张开发
2026/4/15 21:19:10 15 分钟阅读

分享文章

基于Docker的wvp-GB28181-pro与ZLMediaKit集成部署实战指南
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?secretyour_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 --registryhttps://registry.npmmirror.com install --force npm run build后端打包直接用Mavencd 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?useSSLfalse 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 TZAsia/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%以下。

更多文章