尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

离线环境Docker部署ZLMediaKit流媒体服务实战指南

离线环境Docker部署ZLMediaKit流媒体服务实战指南 简介ZLMediaKitzlmDocker 离线安装资源面向内网或无外网环境下的运维及流媒体开发人员解决无法拉取 Docker 镜像时快速部署 zlm 服务的问题。资源包共 2 个文件由 1 个镜像归档 tar 包与 1 个初始化安装脚本组成整体约 208.73MB采用 gz 格式压缩。tar 包内置完整可运行的 zlmediakit Docker 镜像sh 脚本负责离线导入与容器启动支持常见参数预配置可自定义端口映射与持久化目录避免手工调试。压缩包结构清晰、职责明确脚本具备幂等执行与基础排错提示整个流程绕开 Docker Hub 网络限制仅依赖本地文件即可完成环境复现对内网批量交付尤为顺手。同时资源也可作为理解 zlm 容器化封装的参考模板便于后续维护与二次开发。目前已有 373 人学习/下载适合需要内网快速搭建流媒体平台的初中级运维、Docker 使用者及集成开发工程师。1. 为什么要在离线环境里折腾 ZLM Docker做流媒体的大概都绕不开一个名字ZLMediaKit。它是一套用 C 写的流媒体服务框架RTSP、RTMP、HLS、HTTP-FLV、GB28181 这些常见的拉流/推流协议基本都能接。很多做视频监控、直播平台、应急指挥、园区安防的团队最终都会把它部署到内网环境里。有人搜“zlm流媒体服务器价位多少”我希望先把这个说清楚ZLM 本身是开源项目没有软件授权费真实成本主要落在服务器、带宽和维护人头上这个认知会影响后面该不该用 Docker 离线安装这步棋。内网环境的麻烦在于很多目标服务器没有外网权限又不能随便把源码拉到机器上编译。ZLMediaKit 编译要带一堆依赖比如 openssl、zlib、ffmpeg 相关库手工处理非常容易翻车。离线装 Docker 的意义就在于把运行时和 ZLM 镜像提前在一台能联网的机器上打包好用 U 盘或内网传输工具拷进目标机器直接 load 进去就能跑。依赖被打包进镜像后基本不需要在目标机上现场解决编译问题。这篇文章我按自己的实际操作流程来写覆盖三个核心内容Docker 离线包怎么准备、ZLM 镜像怎么搬运、容器起来后怎么验证和排查。适合那些手里只有一台“干干净净”的内网服务器但又要快速跑起流媒体服务的场景。2. 从零准备离线 Docker 运行时装包2.1 在线环境里制作 Docker 二进制包很多人以为离线装 Docker 很难其实关键就是提前准备一个二进制安装包。我推荐下载 Docker 官方发布的静态二进制压缩包而不是到处找别人打包好的 rpm因为没有依赖的问题不确定性更少。在可以联网的机器上执行curl -fSL https://download.docker.com/linux/static/stable/x86_64/docker-20.10.17.tgz -o docker.tgz注意架构要提前确认。目标机如果是 ARM 架构比如飞腾、鲲鹏这类国产芯片uname -m会显示aarch64这时要下载aarch64目录下的包不能照抄 x86_64 的链接。压缩包里已经把 docker、dockerd、containerd、runc、docker-proxy 这些二进制全部打好了不需要额外愁容器运行时的问题。下载完成后把 tgz 文件和后面要用的 ZLM 镜像包放在同一个目录方便一起拷。2.2 目标机安装 Docker 并注册成服务把docker.tgz拷贝到目标机器后解开并拷入系统目录tar xzf docker.tgz cp docker/* /usr/bin/然后写一个 systemd 服务文件让 Docker 开机自启。很多人直接把dockerd扔到后台跑一旦机器重启就不知道服务哪去了这是不推荐的。cat /etc/systemd/system/docker.service EOF [Unit] DescriptionDocker Application Container Engine Afternetwork-online.target [Service] Typenotify ExecStart/usr/bin/dockerd ExecReload/bin/kill -s HUP $MAINPID TimeoutSec0 RestartSec2 Restartalways LimitNOFILEinfinity LimitNPROCinfinity LimitCOREinfinity Delegateyes KillModeprocess [Install] WantedBymulti-user.target EOF启动并验证systemctl daemon-reload systemctl start docker systemctl enable docker docker version看到 Client 和 Server 都正常输出版本号这一步就过关了。如果提示权限不足把当前账号加入 docker 组再重新登录或者直接使用 root 执行。3. 准备 ZLM 镜像拉取、保存、加载3.1 在有网机器上拉镜像并打包Docker 运行时装好了接下来准备 ZLM 镜像。你可以用官方镜像仓库里的zlmediakit/zlmediakit我用得比较多的是带master标签的版本docker pull zlmediakit/zlmediakit:master如果拉取速度很慢先确认是不是 Docker Hub 网络问题可以考虑给 Docker 配置 registry-mirror 后再拉。镜像下载完成后千万不要用docker export那种方式打包那会把镜像的历史信息和启动配置丢掉。正确做法是docker save zlmediakit/zlmediakit:master | gzip zlm-docker.tar.gzdocker save会把镜像的全部层信息保留下来后面docker load就能完整还原。文件可能比较大这也是正常现象镜像本身就包含一个完整的运行环境。3.2 拷贝到内网并还原镜像把zlm-docker.tar.gz通过 U 盘、共享目录或者内网 HTTP 服务传到目标机器然后执行docker load -i zlm-docker.tar.gz docker images | grep zlmediakit看到镜像列表里出现zlmediakit/zlmediakit说明还原成功。这一步如果出来的镜像名是none大概率是制作端把镜像 tag 弄丢了可以用docker save前先docker tag固定一个明确的版本名避免管理混乱。4. 把 ZLM 容器跑起来4.1 先确认镜像里的默认配置启动前不要急着乱映射端口先搞清楚这套镜像默认监听哪些端口。ZLMediaKit 的配置很多都写在config.ini里不同镜像打包路径有差异常见位置有/opt/media/bin/config.ini也可能在/opt/media/conf/config.ini。稳妥的办法是先跑一下看docker run --rm --entrypoint sh zlmediakit/zlmediakit:master -c find / -name config.ini 2/dev/null拿到路径后直接把配置内容打印出来重点看[rtsp]、[rtmp]、[http]、[rtc]几个小节里的端口号。默认端口一般会包含 RTSP 554、RTMP 1935、HTTP 80但这些值在不同版本里可能被改过所以一定要以实际配置为准。4.2 用 host 网络模式还是 bridge 模式如果目标机器是内网专用没有同时跑一堆占用端口的服务我推荐直接用 host 网络模式启动省去端口映射的麻烦docker run -d --name zlm --restartalways --network host zlmediakit/zlmediakit:master容器没起来时先看日志docker logs -f zlm看到类似“启动完成”“http server started”这类输出说明服务已经跑起来了。host 模式会让容器直接使用宿主机网络配置里写的 554、1935 端口直接就监听在宿主机上排查问题更直观。如果你必须用 bridge 模式或者宿主机 80 端口已经被占用那就映射到别的宿主端口比如 HTTP 用 8080docker run -d --name zlm --restartalways \ -p 1935:1935 \ -p 554:554 \ -p 8080:80 \ zlmediakit/zlmediakit:master这里的8080:80表示把容器内部 80 端口映射到宿主机的 8080访问的时候要写http://宿主机IP:8080不是 80。4.3 最简单的推流验证容器起来后可以用本机已有的视频文件做一次推流验证。如果没有现成摄像头直接用 ffmpeg 推一个 mp4 到 ZLMffmpeg -re -stream_loop -1 -i /data/test.mp4 -c copy -f flv rtmp://127.0.0.1:1935/live/test然后在另一台机器上拉流播放ffplay rtmp://127.0.0.1:1935/live/test ffplay rtsp://127.0.0.1:554/live/test能出画面说明 ZLM 的接收和分发链路是通的。离线环境里需要先确认目标机上有没有 ffmpeg/ffplay没有的话可以只在有网的调试机上来验证内网机器负责跑服务本身。5. 配置持久化与目录挂载5.1 把 config.ini 拷出来改运行中的容器一旦被删除里面的配置修改就会丢。正确做法是把配置放到宿主机上启动时通过-v挂载进容器。先拷出来docker cp zlm:/opt/media/bin/config.ini ./config.ini修改前复制一份备份然后用你习惯的编辑器改动。比如你的实际公网或内网 IP 固定了可以在rtc相关配置里写死externIP如果默认 HTTP 端口和现有业务冲突也可以在这里换成别的端口。把配置文件放到宿主机目录后重新创建容器docker rm -f zlm docker run -d --name zlm --restartalways --network host \ -v $PWD/config.ini:/opt/media/bin/config.ini \ zlmediakit/zlmediakit:master路径需要按第 4 节里find出来的实际位置调整。挂载时如果容器一直重启先去掉-v用镜像自带配置启动排除配置文件格式或者路径写错的问题。5.2 录像和快照目录也挂出来如果你要用 ZLM 做录像或抓图最好把对应的 web 根目录、录像目录也挂到宿主机。不同版本的配置字段不一样一般是[general]里的snapRoot、recordRoot或者配置里指定的媒体文件保存路径。先在宿主机建目录mkdir -p /data/zlm/media chmod 777 /data/zlm/media然后在启动命令里增加挂载参数-v /data/zlm/media:/opt/media/bin/www目录权限不到位容器里写不进去经常表现为录像文件没生成或者抓图失败。排查时不要只盯着容器日志先确认宿主机目录的属主和权限。6. 离线部署常见问题和排查速查现象大概率原因解决思路docker load后镜像列表为空或名称丢失制作镜像时用了docker export统一使用docker save打包并固定 tag启动容器报exec format error镜像架构和目标机不一致执行uname -m确认 x86_64 / aarch64 后拉对应架构镜像容器端口无法访问宿主机防火墙或端口被占检查ss -lntp放行 554/1935/80 等端口容器启动后秒退或一直重启挂载的 config.ini 路径不对或格式错误去掉-v用默认配置启动再逐步叠加参数日志里出现 GLIBC 相关报错Docker 二进制和目标系统 libc 不匹配使用同一系统大版本下制作的 Docker 离线包或改用官方静态包内网设备推流不上来网络不通或防火墙拦截先在同一台机器用 ffplay 验证再排查跨主机网络和防火墙策略Docker daemon 没起来二进制权限或 systemd 服务配置有问题直接执行dockerd看输出确认没有依赖缺失后再注册服务离线部署这种事失败大多不是因为你不会跑容器而是忽略了一些前置细节架构对不对、配置文件路径是不是真实、端口冲突有没有提前查。我在实际中会把“Docker 二进制、ZLM 镜像 tar 包、改好的 config.ini”这 3 样东西放在同一个目录里每次去现场就只带这一个目录恢复速度快很多。后面如果再遇到离线环境要部署其他服务这套“在线打包 离线 load 配置挂载”的思路一样能复用。本文还有配套的精品资源点击获取
返回列表