尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
CentOS上用Docker部署ZLMediaKit流媒体服务器完整指南
1. CentOS Docker ZLMediaKit这套组合到底解决什么问题先说一句大实话搞流媒体服务最烦的不是功能实现而是环境折腾。ZLMediaKit作为一款高性能流媒体服务器支持RTSP、RTMP、HTTP-FLV、HLS、GB28181等一堆主流协议但你要在CentOS上从头编译、装依赖、配环境、管理进程光是一套依赖库就能耗掉半天遇到GCC版本不兼容、openssl开发包缺失、cmake版本太老心态直接炸裂。Docker部署ZLMediaKit就是把“环境搭建”这个痛点连根拔起。镜像里已经把编译好的二进制、运行库、默认配置全部打包好了你只需要在CentOS上装好Docker然后一条docker run命令就能把服务跑起来。整个部署过程从小时级压缩到分钟级而且升级回滚、迁移服务器都变得极其简单。这套方案适合谁适合在CentOS服务器上做视频监控平台、直播服务、安防GB28181接入、或者只是想快速搭一套流媒体服务来做二次开发的工程师。下面我把整个部署过程、参数含义、坑点排查全部拆开讲你在自己的机器上照着敲一遍就能起来。2. 部署前的准备CentOS环境检查与Docker安装2.1 先确认你的CentOS版本和内核动手之前先花两分钟检查一下系统基础信息。ZLMediaKit对系统没有特别苛刻的要求但Docker对内核版本有门槛CentOS 6基本没戏老老实实用CentOS 7.x或者更新的版本。# 查看系统版本 cat /etc/redhat-release # 查看内核版本 uname -r我实测用的环境是CentOS 7.9内核版本3.10.0-1160跑Docker和ZLMediaKit完全没问题。如果你的内核低于3.10建议先升级系统再继续否则后续容器启动可能出现奇奇怪怪的兼容性问题。顺手检查一下CPU架构# 查看架构一般是x86_64 arch这里有个细节ZLMediaKit官方镜像对x86_64和ARM64都有支持如果你买的是ARM版云服务器或者跑在树莓派上拉镜像时选对标签就行后面会说到具体标签。2.2 Docker安装yum源还是官方脚本CentOS装Docker有两种常见方式我推荐用yum源安装这样后续升级维护都方便。备份并配置阿里云的Docker yum源国内服务器实测速度快很多# 安装必要的依赖包 yum install -y yum-utils device-mapper-persistent-data lvm2 # 添加Docker稳定版仓库使用阿里云镜像 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 更新源 yum makecache fast # 安装Docker CE yum install -y docker-ce docker-ce-cli containerd.io如果你在海外服务器直接把上面的阿里云地址换成官方地址https://download.docker.com/linux/centos/docker-ce.repo就行。安装完成后启动Docker并设置开机自启systemctl start docker systemctl enable docker验证是否装好docker version docker infodocker info里能看到Docker的版本号、存储驱动、镜像数量这些信息跑一遍确保输出正常再继续。2.3 镜像加速配置没这个国内拉镜像能急死人Docker装好了先别急着拉ZLMediaKit镜像。国内服务器默认从Docker Hub拉镜像速度经常只有几十KB每秒一个几百兆的镜像能拉半天。这一步就是配置镜像加速器。编辑/etc/docker/daemon.json没有就新建vim /etc/docker/daemon.json写入以下内容{ registry-mirrors: [ https://docker.m.daocloud.io, https://hub-mirror.c.163.com, https://mirror.baidubce.com ] }保存后重启Docker使配置生效systemctl restart docker这里说明一下原理daemon.json是Docker守护进程的配置文件registry-mirrors指定了镜像仓库的加速地址。Docker拉镜像时会优先从这些镜像源获取数据速度提升非常明显。注意不同的加速地址可用性会变化如果某个地址失效换一个就行。配置三个的目的是做好冗余一个挂了还有备用的。2.4 防火墙放行与SELinux处理很多人在Docker部署ZLMediaKit后遇到“推流成功但拉流失败”“外部设备无法访问”的问题十有八九是防火墙或者SELinux在捣乱。CentOS 7默认防火墙是firewalldZLMediaKit默认用的几个端口先放行# 常用端口RTSP 554、RTMP 1935、HTTP 80/8080、RTP端口段 firewall-cmd --permanent --add-port554/tcp firewall-cmd --permanent --add-port1935/tcp firewall-cmd --permanent --add-port80/tcp firewall-cmd --permanent --add-port8080/tcp firewall-cmd --permanent --add-port10000-10010/tcp firewall-cmd --permanent --add-port10000-10010/udp firewall-cmd --reload如果你不想纠结具体端口直接关防火墙跑通流程但不建议生产环境这么干systemctl stop firewalld systemctl disable firewalldSELinux这块Docker容器本身和SELinux的兼容性在CentOS 7上做得还可以但如果后面遇到权限问题可以把SELinux临时调成permissive模式试试setenforce 0生产环境还是建议保持SELinux开启配合正确配置使用。3. ZLMediaKit容器部署实操从拉镜像到服务完全跑起来3.1 选择正确的镜像标签一切准备就绪先拉取镜像。ZLMediaKit官方提供了Docker镜像直接搜一下仓库名docker search zlmediakit官方镜像名是zlmediakit/zlmediakit需要注意Tag选择。直接在Docker Hub上看常见的有latest、master等标签。我的建议是别用latest选一个固定的Tag这样以后更新行为可控。比如# 拉取最新稳定版 docker pull zlmediakit/zlmediakit:latest如果你想用ARM版比如在ARM架构服务器上镜像本身会做多架构支持直接拉同一个TagDocker会自动匹配当前架构的镜像层。这里拉镜像的时候注意观察下载的层数如果是mult-arch的镜像底层会自动拉取对应平台的镜像层。另外提一句ZLMediaKit官方Docker镜像基于Ubuntu基础镜像制作但运行时和宿主机CentOS没任何关系这也是容器化最大的优势——宿主机是什么发行版根本不重要。3.2 启动容器逐条拆解参数含义镜像拉下来之后先写一套最基础的启动命令把服务跑起来再看效果docker run -d \ --name zlmediakit \ --restart always \ -p 1935:1935 \ -p 554:554 \ -p 80:80 \ -p 8080:8080 \ -p 10000:10000 \ -p 10001:10001 \ zlmediakit/zlmediakit:latest这一串参数什么意思拆开来看-d后台运行容器--name zlmediakit给容器起个名字方便后续docker logs zlmediakit查看日志、docker exec -it zlmediakit bash进入容器--restart always容器异常退出时自动重启这个对服务稳定性很重要机器重启后容器也会自动拉起-p 宿主机端口:容器端口端口映射。左边是服务器对外暴露的端口右边是容器内部的端口。ZLMediaKit默认配置在容器内监听这些端口端口用途说明端口协议用途1935TCPRTMP服务端口554TCPRTSP服务端口80TCPHTTP-FLV、HLS等HTTP流服务8080TCPWeb管理界面和RESTful API10000-10001TCP/UDPRTP/RTCP端口GB28181等传输用启动完跑一下docker ps看容器状态如果STATUS是Up说明已经跑起来了。再确认日志有没有报错docker logs zlmediakit正常启动的日志里会看到监听端口初始化的信息类似[MediaServer] start rtsp server on 0.0.0.0:554 success这样的输出看到就说明基本盘稳了。3.3 目录挂载让配置和数据不随容器重建丢失有一个大坑必须提前说容器默认是临时存储容器一旦被删除重建里面所有配置和数据全部丢失。如果你辛辛苦苦配好了视频目录、改了端口、授权了一些播放链接一个docker rm全部清零。解决办法是用目录挂载把配置文件目录和录像文件目录挂到宿主机上docker run -d \ --name zlmediakit \ --restart always \ -p 1935:1935 \ -p 554:554 \ -p 80:80 \ -p 8080:8080 \ -p 10000:10000 \ -p 10001:10001 \ -v /data/zlm/config:/opt/media/conf \ -v /data/zlm/data:/opt/media/bin/data \ zlmediakit/zlmediakit:latest这里/data/zlm/config和/data/zlm/data是宿主机上的目录需要提前创建好mkdir -p /data/zlm/config mkdir -p /data/zlm/data/opt/media/conf和/opt/media/bin/data是ZLMediaKit容器内的配置目录和数据目录。挂载之后容器内读写这两个目录的操作会直接落在宿主机磁盘上。为什么挂载这两个目录因为config.ini配置文件在里面录像文件默认也在data目录下面。挂载后你改配置、传文件都直接在宿主机操作方便很多。注意如果你之前还有其他容器用过的名字或者端口冲突启动的时候可能出现port is already allocated或者name conflict先把冲突的东西处理掉再启动别直接重启容易积累一堆垃圾容器。3.4 Web管理界面验证服务是否真正健康ZLMediaKit自带一个Web管理界面默认端口是8080。在浏览器里访问http://你的服务器IP:8080能看到登录界面默认账号密码是admin/admin。登录进去后你会看到几个核心页面流列表、虚拟主机、服务器信息。在服务器信息页面能看到CPU占用、内存使用、当前连接数、各类协议统计等数据这一屏信息非常有价值你可以直观地看到ZLMediaKit服务运行状态是否健康。如果打不开8080页面先检查容器是否在运行然后确认防火墙端口是否放行最后用以下命令确认容器内端口是否正常监听docker exec zlmediakit netstat -tlnp看到8080端口处于LISTEN状态但外部访问不了基本就是防火墙没放行或者云服务器安全组规则里没加。4. 真正把流推起来RTSP、RTMP、GB28181接入实测4.1 RTSP推流用FFmpeg验证推拉流链路服务起来了接下来要做的是验证链路是否真的通。我习惯先把宿主机上的FFmpeg工具准备好参考yum install -y ffmpeg然后用它推流测试。先用一台电脑或服务器生成测试视频流推到ZLMediaKit的RTMP端口ffmpeg -re -i test.mp4 -c copy -f flv rtmp://你的服务器IP:1935/live/test1/live/test1的live是应用名ZLMediaKit默认支持live这个应用test1是流ID这是你自己定义的标识。推流成功后拉流测试一下RTSPffmpeg -i rtsp://你的服务器IP:554/live/test1 -c copy -f mp4 -y output.mp4如果RTSP能正常拉流说明推流链路和RTSP链路都是通的。然后试试HTTP-FLV流。浏览器或者播放器直接访问http://你的服务器IP:80/live/test1.flv用VLC播放器或者ffplay打开这个地址ffplay http://你的服务器IP:80/live/test1.flv这里有一个直观的感受HTTP-FLV的延迟比RTSP稍高一点点但胜在穿透性好、可以用浏览器直接播放适合做Web直播。ZLMediaKit对这些协议支持得都很完善一条链路推上去多种协议同时服务。4.2 HLS拉流与录像验证HLS是苹果的流媒体协议延迟比较高通常几秒到十几秒但兼容性是王者级别的几乎所有播放器都支持。在推流持续的情况下访问http://你的服务器IP:80/live/test1/hls.m3u8这里注意和HTTP-FLV的URL结构不同HLS是/流ID/hls.m3u8的格式。如果HLS能播放继续测试录像功能。ZLMediaKit默认开启了录像在Web管理界面中能看到录像文件列表。录像文件存储在容器内的/opt/media/bin/data目录下由于我们已经挂载了宿主机/data/zlm/data录像文件会直接出现在宿主机目录里。验证录像是否写入ls -la /data/zlm/data/看到类似下面的目录结构├── video │ └── live │ └── test1 │ ├── 2024-06-01 │ │ ├── 10.mp4 │ │ └── 11.mp4说明录像功能正常录下来的文件可以直接下载归档。这个功能对安防监控场景特别好用录像文件按日期分目录存放做回放系统时直接扫描目录就行。4.3 GB28181国标设备接入安防场景的核心玩法ZLMediaKit另一个高频场景是接入GB28181国标设备比如网络摄像头、NVR。GB28181是安防行业的标准协议很多摄像头原生支持这个协议。在Web管理界面里找到国标接入相关配置ZLMediaKit对于GB28181的支持非常完善大部分做国标平台的同学都是用它做流媒体网关。配置大致的流程是在ZLMediaKit的config.ini里配置服务端国标ID例如34020000002000000001、服务端国标域、监听端口在摄像头的配置页面里设置国标接入信息国标ID是设备自己的编码例如34020000001320000001服务器地址写CentOS宿主机IP端口写ZLMediaKit的国标监听端口摄像头主动注册到ZLMediaKit国标ID与通道ID做关联后在平台上看到设备在线状态点击播放就能拉取实时流这个过程中最容易遇到的问题就是国标ID配置错误导致注册失败注册不成功直接在Web管理界面的国标列表里看不到设备。排查时先确认设备平台的编码格式是否正确再用网络抓包看SIP消息能否到达服务器端口。提示GB28181的SIP消息交互用的是UDP协议如果摄像头注册超时先确认UDP端口放行情况再检查防火墙和云安全组。5. 常见问题排查与性能调优实录5.1 容器启动失败排查三板斧我在多次部署中遇到过各种奇奇怪怪的启动失败总结下来90%的问题用这三步能定位第一步看容器状态docker ps -a | grep zlmediakit看STATUS列是Exited还是Restarting如果一直在重启说明容器内部服务起不来。第二步看启动日志docker logs --tail 200 zlmediakit日志会直接告诉你失败原因。最常见的几个情况端口被占用比如宿主机上已经有别的程序占了1935或554配置文件语法错误你手动改过config.ini的话格式写错会导致启动直接失败目录权限不对挂载的宿主机目录没有写权限容器内进程无法创建数据文件第三步用docker inspect zlmediakit查看容器的详细状态信息重点看Mounts和NetworkSettings部分docker inspect zlmediakit | grep -A 20 Mounts这能看到挂载是否生效端口映射是否正确。如果是权限问题给宿主机目录加权限chmod -R 775 /data/zlm5.2 推流失败排查链路中的每一个节点如果FFmpeg推流时报错别急着怀疑ZLMediaKit先按这个顺序逐层排查第一层确认推流命令里的地址和端口是否写对。很多新手把IP写错、端口写成80而不是1935导致怎么推都推不进去。第二层确认容器端口监听是否正常docker exec zlmediakit ss -lntup | grep 1935第三层在宿主机直接测试端口连通性telnet 你的服务器IP 1935如果telnet能通但推流失败查看ZLMediaKit Web管理界面的日志是否有new connection之类的错误记录。如果是connection refused大概率是服务直接没起来如果是connection reset可能是防火墙干扰了TCP长连接。更隐蔽的一个坑是CentOS上开启了firewalld但只放行了TCP端口RTSP的UDP端口段没有放行。RTSP流传输阶段会用到UDP端口通常是10000或10001如果UDP不通会表现为连接建立了但画面出不来。5.3 性能参数调整几个值得修改的配置项ZLMediaKit默认配置可以直接跑但生产环境建议调整下面几个参数。配置文件是挂载好的/data/zlm/config/config.ini宿主机上直接编辑改完重启容器。视频缓存相关[general] ; 每个源的视频缓存大小MB maxSteamWaitMS1500录像相关[record] ; 是否启用录像 app.record1 ; 录像切片时长秒 recordSpliceMS60000流超时释放相关[stream] ; 无人观看流自动超时时间秒 noReaderDelayMS30000改完配置后重启容器docker restart zlmediakit5.4 日常运维日志、升级与备份日常运维中最有用的查看日志命令# 实时跟踪容器日志 docker logs -f --tail 100 zlmediakitZLMediaKit的日志会打印协议协商、推流断开、录像生成等大量信息排查问题全靠它。升级版本时拉取新镜像、删掉旧容器、重建即可docker pull zlmediakit/zlmediakit:latest docker stop zlmediakit docker rm zlmediakit docker run -d --name zlmediakit --restart always \ -p 1935:1935 -p 554:554 -p 80:80 -p 8080:8080 \ -p 10000:10000 -p 10001:10001 \ -v /data/zlm/config:/opt/media/conf \ -v /data/zlm/data:/opt/media/bin/data \ zlmediakit/zlmediakit:latest因为配置和数据都存在宿主机挂载目录里重建容器完全不影响已有配置和录像文件。这也是坚持使用目录挂载的最大好处。备份也很简单把/data/zlm整个目录打包带走就行tar -czf zlm_backup_$(date %Y%m%d).tar.gz /data/zlm不管是迁移服务器还是灾备恢复解压后重新docker run一遍服务就回来了。6. 一些实际操作中的体会这套方案我在多台CentOS 7.9服务器上反复部署过简单分享一下个人经验。Docker部署ZLMediaKit最大的优势不是快而是简单可复制。同样的镜像在开发环境、测试环境、生产环境跑出来的结果完全一致不会出现我本地跑得好好的上服务器就崩了这种幺蛾子。对于经常要部署多套流媒体服务的场景这个价值比部署速度快得多。如果只是想在本地电脑的虚拟机里先跑通全流程也可以用虚拟机装个CentOS 7.9来练习用NAT网络模式给虚拟机配置好静态IP然后照着本文的命令一步步操作。整个过程大约20分钟就能跑通推拉流全链路。最后分享一个小技巧在实际生产环境中建议把ZLMediaKit容器所在的宿主机单独用来跑流媒体服务不要和数据库、业务系统混布。因为流媒体服务对带宽、CPU、内存的资源消耗非常猛混布容易出现资源竞争导致推拉流卡顿。另外宿主机系统盘和数据目录分开录像文件别放在系统盘上用独立的数据盘专门存储录像这样既能保护系统盘也方便后续容量扩容。
RELATED

相关推荐

创始人如何判断自己是否适合这条赛道:五个自测维度拆解Founder-Market Fit

创始人如何判断自己是否适合这条赛道:五个自测维度拆解Founder-Market Fit

做创始人这些年,我发现一个很有意思的现象:大家聊项目、聊融资、聊商业模式的时候头头是道,但真正聊到“你自己为什么适合做这件事”,很多人反而说不上来。市场机会是真的,技术趋势是真的,但最后能不能跑出…

📅 2026/9/26 4:58:05
Unity内置管线屏幕模糊Shader实战:高斯模糊与性能优化

Unity内置管线屏幕模糊Shader实战:高斯模糊与性能优化

搞过内置管线(Built-in Render Pipeline)的老项目应该都有过这种体验:需求方说“这里弹窗背景要糊一点”,你以为只是调个透明度,结果越调越像马赛克。真正想让背景变成类似 iOS 控制中心那种自然的毛玻璃,靠…

📅 2026/9/26 4:53:05
Linux挂载其他系统盘完整指南:mount命令与fstab实战

Linux挂载其他系统盘完整指南:mount命令与fstab实战

1. 先搞清楚“挂载”到底在干什么:为什么Linux不像Windows那样直接显示所有硬盘分区很多人第一次从Windows转到Linux,或者给老电脑装了双系统之后,都会产生一个相同的困惑:Windows系统盘明明插在机器上,Linux也启动得好…

📅 2026/9/26 4:53:05
MORE NEWS

更多资讯

📰

严恭敏捷联惯导MATLAB仿真程序跑通与避坑指南

简介:严恭敏老师《捷联惯导算法与组合导航原理》配套MATLAB仿真程序,面向需要完成惯性导航相关课程设计、毕业设计的学生与导航算法入门者。压缩包共65个文件,以61个.m仿真脚本为主体,涵盖捷联惯导解算、惯性器件误差建模、卡尔曼…

📰

VSCode配置Python解释器:路径定位与环境隔离实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

大模型算力调度建模:显存带宽与通信开销的硬约束求解

1. 这不是一道“纯数学题”,而是一次对AI基础设施真实瓶颈的硬核拆解2026华为杯研究生数学建模竞赛F题——“算力约束下提升大语言模型能力的资源配置建模”,光看标题就带着一股扑面而来的工业现场气息。它不考你能不能推导出一个漂亮闭式解,…

📰

树莓派摄像头视频流实时传输到PC:基于Python与TCP的低延迟方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

AgentScope 2.0 多智能体协作实践:从架构设计到Java企业级落地

如果你最近在调研多智能体开发框架,大概率绕不开 AgentScope 这个名字。我是在一次内部项目里第一次接触它,当时团队要把好几个大模型能力串成一条自动处理链路,试了一圈通用编排工具,最后还是回到 AgentScope。说实话&#xff0c…

📰

基于Mininet与Ryu的SDN实验环境搭建与排错实践

最近在搭建SDN实验环境,把Mininet和Ryu控制器从零理顺了一遍。整个过程踩了不少坑,也把原理层面的事情想明白了一些。Mininet作为轻量级网络仿真工具,能在普通笔记本上模拟出一整张交换网络,配合Ryu这个OpenFlow控制器&#xff0c…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬