基于docker的GB28181国标视频平台smarteye

发布时间: 2026-06-05 10:09:18

如果你正在接触 国标 GB28181 视频监控,一定听说过 开源项目。它能把不同厂家的摄像头、NVR 统一接入,并提供统一的 Web 管理界面和 API。

但很多人在部署这一步就卡住了——环境依赖多,配置复杂,更别说要进行二次开发了。

今天,我们用 Docker 来彻底简化这件事。
最终效果:

  • 后端代码在宿主机修改,容器内自动热加载
  • 前端独立运行,保存即刷新
  • 数据库、缓存、流媒体服务全部容器化,一键启停

适合人群:想基于 WVP 做二次开发的 Java/前端开发者,或者想快速体验国标平台的运维人员。

 整体架构(一看就懂)

角色
运行方式
作用
WVP 后端
源码挂载 + Docker 内运行
处理 SIP 信令、设备管理、提供 API
WVP 前端
宿主机 npm run dev
管理界面,支持热更新
ZLMediaKit
官方 Docker 镜像
流媒体服务器,负责推拉流
MySQL / Redis
Docker 镜像
数据存储与缓存

简单说:只有后端代码跑在容器里,但源码放在外面,改了马上生效。这是二次开发最舒服的模式。

 准备工作

 确保你的 Linux 服务器拥有以下环境

   bash
# 安装 Docker 和 Docker Compose(如果还没装)
curl -fsSL https://get.docker.com | bash
sudo apt install docker-compose-plugin   # Ubuntu/Debian

 克隆项目源码

   bash
git clone https://gitee.com/pan648540858/wvp-GB28181-pro.git
cd wvp-GB28181-pro

 安装前端工具(在宿主机)

   bash
# 安装 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):

   yaml
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,找到对应位置修改:

   yaml
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:

   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/ 下的脚本。如果没自动执行,可以手动:

   bash
docker exec -i wvp-mysql-dev mysql -uroot -proot123 wvp < database/数据库脚本.sql

 启动!一键运行所有服务

   bash
# 在项目根目录执行
docker compose -f docker-compose-dev.yml up -d

第一次启动会下载镜像并编译后端,大概需要 5-10 分钟(取决于网速)。后续启动会很快,因为 Maven 依赖已经缓存。

查看日志确认是否成功:

   bash
docker compose -f docker-compose-dev.yml logs -f wvp

看到类似 Started WvpApplication in xx seconds 就表示后端启动成功了。

打开浏览器访问 http://你的服务器IP:18080,默认用户名 admin / 密码 admin。

 前端开发模式(热更新)

在宿主机上进入 web_src 目录,启动 Vite 开发服务器:

   bash
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,所以修改代码后需要重启容器:

   bash
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 逻辑、添加自己的业务接口,或者定制前端界面了。