基于docker的GB28181国标视频平台smarteye
如果你正在接触 国标 GB28181 视频监控,一定听说过 开源项目。它能把不同厂家的摄像头、NVR 统一接入,并提供统一的 Web 管理界面和 API。
但很多人在部署这一步就卡住了——环境依赖多,配置复杂,更别说要进行二次开发了。
今天,我们用 Docker 来彻底简化这件事。
最终效果:
-
后端代码在宿主机修改,容器内自动热加载 -
前端独立运行,保存即刷新 -
数据库、缓存、流媒体服务全部容器化,一键启停
适合人群:想基于 WVP 做二次开发的 Java/前端开发者,或者想快速体验国标平台的运维人员。
整体架构(一看就懂)
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
简单说:只有后端代码跑在容器里,但源码放在外面,改了马上生效。这是二次开发最舒服的模式。
准备工作
确保你的 Linux 服务器拥有以下环境
# 安装 Docker 和 Docker Compose(如果还没装)
curl -fsSL https://get.docker.com | bash
sudo apt install docker-compose-plugin # Ubuntu/Debian
克隆项目源码
git clone https://gitee.com/pan648540858/wvp-GB28181-pro.git
cd wvp-GB28181-pro
安装前端工具(在宿主机)
# 安装 Node.js 16+ 和 npm
curl -fsSL https://deb.nodesource.com/setup_16.x | sudo bash -
sudo apt install -y nodejs
# 安装前端依赖
cd web_src
npm install --registry=https://registry.npmmirror.com
编写 docker-compose-dev.yml(核心)
在项目根目录创建一个文件 docker-compose-dev.yml,内容如下(可以直接复制,只需改两处IP):
version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: wvp-mysql-dev
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: wvp
MYSQL_USER: wvp_user
MYSQL_PASSWORD: wvp123
ports:
- "3306:3306"
volumes:
- mysql-data:/var/lib/mysql
- ./database:/docker-entrypoint-initdb.d # 自动导入初始化脚本
command: --character-set-server=utf8mb4
networks:
- wvp-network
redis:
image: redis:7-alpine
container_name: wvp-redis-dev
restart: unless-stopped
ports:
- "6379:6379"
command: redis-server --requirepass redis123
networks:
- wvp-network
zlmediakit:
image: pan648540858/zlmediakit:latest # 推荐使用作者镜像
container_name: wvp-zlm-dev
restart: unless-stopped
ports:
- "5060:5060/udp"
- "10000-10100:10000-10100/udp" # 媒体传输端口范围
- "1935:1935"
- "8082:80"
volumes:
- ./media/conf:/opt/media/conf # 挂载ZLMediaKit配置
networks:
- wvp-network
wvp:
image: maven:3.8-openjdk-11-slim
container_name: wvp-backend-dev
working_dir: /app
volumes:
- .:/app # 整个项目挂进去
- maven-repo:/root/.m2 # 缓存依赖,加速启动
command: >
sh -c "
mvn clean compile &&
mvn spring-boot:run -Dspring-boot.run.profiles=dev
"
ports:
- "18080:18080"
depends_on:
- mysql
- redis
- zlmediakit
networks:
- wvp-network
volumes:
mysql-data:
maven-repo:
networks:
wvp-network:
driver: bridge只需要修改两个地方(后面配置文件里会改):
- sip.ip
填写你服务器的公网IP(设备要能访问到这个IP) -
其他如密码、端口范围可以先不动,跑起来再说。
修改配置文件(让所有组件互相认识)
后端配置 application-dev.yml
编辑 src/main/resources/application-dev.yml,找到对应位置修改:
spring:
datasource:
url: jdbc:mysql://mysql:3306/wvp?useUnicode=true&serverTimezone=Asia/Shanghai
username: wvp_user
password: wvp123
redis:
host: redis
port: 6379
password: redis123
sip:
ip: 你的服务器公网IP # 重要!设备注册用这个IP
port: 5060
domain: 3402000000
id: 34020000002000000001
password: 12345678 # 设备接入时使用的密码
media:
id: zlm_dev_001 # 必须和ZLMediaKit配置一致
ip: zlmediakit # 容器内部服务名
hook-ip: wvp # 回调地址,使用容器名
http-port: 8082
secret: 035c73f7-bb6b-4889-a715-d9eb2d1925cc
rtp:
port-range: 10000,10100 # 必须和下面ZLMediaKit配置一致
流媒体配置 media/conf/config.ini
创建目录 media/conf,在里面新建 config.ini:
[general]
mediaServerId=zlm_dev_001
[api]
secret=035c73f7-bb6b-4889-a715-d9eb2d1925cc
[hook]
enable=1
add_ffmpeg_source=http://wvp:18080/index/hook/on_ffmpeg_source
[rtp]
port_range=10000,10100
[http]
port=8082
初始化数据库
数据库容器启动时会自动执行 database/ 下的脚本。如果没自动执行,可以手动:
docker exec -i wvp-mysql-dev mysql -uroot -proot123 wvp < database/数据库脚本.sql
启动!一键运行所有服务
# 在项目根目录执行
docker compose -f docker-compose-dev.yml up -d
第一次启动会下载镜像并编译后端,大概需要 5-10 分钟(取决于网速)。后续启动会很快,因为 Maven 依赖已经缓存。
查看日志确认是否成功:
docker compose -f docker-compose-dev.yml logs -f wvp
看到类似 Started WvpApplication in xx seconds 就表示后端启动成功了。
打开浏览器访问 http://你的服务器IP:18080,默认用户名 admin / 密码 admin。
前端开发模式(热更新)
在宿主机上进入 web_src 目录,启动 Vite 开发服务器:
cd web_src
npm run dev
访问 http://你的服务器IP:5173(默认端口),所有前端修改保存后页面自动刷新,无需重启任何容器。如果你想让前端直接连到后端容器,vite.config.js 里已经配置了代理到 http://localhost:18080,直接可用。
常见问题排雷
容器启动后立即退出
执行 docker compose -f docker-compose-dev.yml logs wvp 看报错,常见原因:
-
数据库连接失败 → 检查 MySQL 容器是否正常运行 -
端口被占用 → 修改 docker-compose 里的映射端口
摄像头注册不上
检查服务器防火墙是否开放 UDP 5060 端口
确认 sip.ip 填写的是设备能访问到的公网IP
摄像头里填写的 SIP 密码要和 application-dev.yml 里的 sip.password 一致
能注册,但点播放没画面
90% 是端口没放全!请确保以下端口已开放(TCP+UDP):
- 10000-10100
(媒体传输端口范围) - 5060
(SIP信令) - 18080
(Web访问)
另外检查 rtp.port-range 和 ZLM 配置里的 port_range 是否一致。
修改后端代码后怎么生效?
因为在 command 里先执行了 mvn clean compile 再启动 Spring Boot,所以修改代码后需要重启容器:
docker compose -f docker-compose-dev.yml restart wvp
如果你觉得每次重启太慢,可以在宿主机直接用 IDEA 远程调试,或者改用 spring-boot-devtools 实现热加载。需要的话评论区告诉我,我再写一篇进阶技巧。
最终目录结构
wvp-GB28181-pro/
├── docker-compose-dev.yml # 我们写的开发配置
├── database/ # 数据库初始化脚本
├── media/conf/ # ZLMediaKit 配置目录
├── src/main/resources/ # 后端配置文件
├── web_src/ # 前端源码(独立热更新)
└── ...
这种 Docker 开发模式的好处
-
环境一致 —— 不再担心“我电脑上能跑,服务器上不行” -
代码挂载 —— 改代码无需重建镜像 -
依赖独立 —— 数据库、Redis、流媒体一键启停 -
前端热更新 —— 页面保存即生效,开发体验接近纯前端项目
你已经拥有了一个可二次开发的国标视频平台底座。接下来就可以愉快地修改 SIP 逻辑、添加自己的业务接口,或者定制前端界面了。
