ZLMediaKit Docker部署:一键容器化流媒体服务生产环境配置
前言:为什么选择Docker部署流媒体服务?
在当今云原生时代,传统的手动部署方式已无法满足现代流媒体服务的高可用、弹性伸缩和快速部署需求。你是否还在为以下问题困扰:
- 🚫 环境依赖复杂,编译安装耗时耗力
- 🚫 多节点部署一致性难以保证
- 🚫 版本升级和回滚风险高
- 🚫 资源隔离和性能监控困难
Docker容器化部署正是解决这些痛点的最佳方案!本文将带你深入掌握ZLMediaKit的Docker生产级部署方案。
一、Docker部署方案全景图
二、核心Dockerfile解析
2.1 多阶段构建架构
ZLMediaKit采用先进的多阶段构建模式,确保最终镜像体积最小化:
# 第一阶段:构建阶段
FROM ubuntu:18.04 AS build
RUN apt-get update && \
DEBIAN_FRONTEND="noninteractive" \
apt-get install -y --no-install-recommends \
build-essential cmake git curl vim ca-certificates \
libssl-dev libmysqlclient-dev libx264-dev libfaac-dev libmp4v2-dev
WORKDIR /opt/media
RUN git clone --depth=1 https://gitcode.com/GitHub_Trending/zl/ZLMediaKit && \
cd ZLMediaKit && git submodule update --init --recursive && \
mkdir -p build release/linux/Release/
WORKDIR /opt/media/ZLMediaKit/build
RUN cmake -DCMAKE_BUILD_TYPE=Release .. && make
# 第二阶段:运行阶段
FROM ubuntu:18.04
RUN apt-get update && \
DEBIAN_FRONTEND="noninteractive" \
apt-get install -y --no-install-recommends \
vim ca-certificates tzdata libssl-dev libx264-dev \
libfaac-dev ffmpeg libmp4v2-dev
WORKDIR /opt/media/bin/
COPY --from=build /opt/media/ZLMediaKit/release/linux/Release/MediaServer .
ENV PATH /opt/media/bin:$PATH
CMD ["MediaServer"]
2.2 关键端口映射说明
ZLMediaKit作为全功能流媒体服务器,需要暴露多个端口以支持不同协议:
| 端口 | 协议 | 用途 | 传输方式 |
|---|---|---|---|
| 1935 | RTMP | Adobe RTMP协议 | TCP |
| 554 | RTSP | 实时流传输协议 | TCP |
| 80 | HTTP | Web访问和HTTP-FLV | TCP |
| 443 | HTTPS | 安全Web访问 | TCP |
| 10000 | RTP | 实时传输协议 | TCP/UDP |
| 8000 | WebRTC | Web实时通信 | UDP |
| 9000 | SRT | 安全可靠传输 | UDP |
三、生产环境部署实战
3.1 快速启动命令
# 基础部署(开发测试环境)
docker run -id \
-p 1935:1935 \
-p 8080:80 \
-p 8443:443 \
-p 8554:554 \
-p 10000:10000 \
-p 10000:10000/udp \
-p 8000:8000/udp \
-p 9000:9000/udp \
--name zlmediakit \
zlmediakit/zlmediakit:master
3.2 生产级部署配置
# 生产环境完整部署脚本
docker run -id \
--name zlmediakit-prod \
--restart=unless-stopped \
--network=host \
--cpus=4 \
--memory=4g \
--memory-swap=6g \
--ulimit nofile=65536:65536 \
-v /data/zlmediakit/conf:/opt/media/conf \
-v /data/zlmediakit/logs:/opt/media/logs \
-v /data/zlmediakit/www:/opt/media/www \
-v /etc/localtime:/etc/localtime:ro \
-e TZ=Asia/Shanghai \
zlmediakit/zlmediakit:master
3.3 配置文件定制化
创建自定义配置文件 config.ini:
[general]
mediaServerId=production_server_001
maxStreamWaitMS=10000
flowThreshold=2048
[api]
secret=your_production_secret_here
apiDebug=0
[protocol]
enable_hls=1
enable_mp4=1
enable_rtsp=1
enable_rtmp=1
enable_ts=1
enable_fmp4=1
[rtmp]
port=1935
keepAliveSecond=30
[http]
port=80
sslport=443
keepAliveSecond=30
[rtsp]
port=554
keepAliveSecond=30
[hls]
segDur=6
segNum=5
segRetain=10
四、Kubernetes集群部署
4.1 Deployment配置
apiVersion: apps/v1
kind: Deployment
metadata:
name: zlmediakit
namespace: media
spec:
replicas: 3
selector:
matchLabels:
app: zlmediakit
template:
metadata:
labels:
app: zlmediakit
spec:
containers:
- name: zlmediakit
image: zlmediakit/zlmediakit:master
ports:
- containerPort: 1935
name: rtmp
- containerPort: 80
name: http
- containerPort: 443
name: https
- containerPort: 554
name: rtsp
- containerPort: 10000
name: rtp-tcp
- containerPort: 10000
protocol: UDP
name: rtp-udp
- containerPort: 8000
protocol: UDP
name: webrtc
- containerPort: 9000
protocol: UDP
name: srt
resources:
requests:
memory: "2Gi"
cpu: "2"
limits:
memory: "4Gi"
cpu: "4"
volumeMounts:
- name: config-volume
mountPath: /opt/media/conf
- name: data-volume
mountPath: /opt/media/www
livenessProbe:
httpGet:
path: /index/api/getServerConfig
port: 80
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /index/api/getServerConfig
port: 80
initialDelaySeconds: 5
periodSeconds: 5
volumes:
- name: config-volume
configMap:
name: zlmediakit-config
- name: data-volume
persistentVolumeClaim:
claimName: zlmediakit-data-pvc
4.2 Service配置
apiVersion: v1
kind: Service
metadata:
name: zlmediakit-service
namespace: media
spec:
selector:
app: zlmediakit
ports:
- name: rtmp
port: 1935
targetPort: 1935
- name: http
port: 80
targetPort: 80
- name: https
port: 443
targetPort: 443
- name: rtsp
port: 554
targetPort: 554
- name: rtp-tcp
port: 10000
targetPort: 10000
- name: rtp-udp
port: 10000
protocol: UDP
targetPort: 10000
- name: webrtc
port: 8000
protocol: UDP
targetPort: 8000
- name: srt
port: 9000
protocol: UDP
targetPort: 9000
type: LoadBalancer
五、监控与运维
5.1 健康检查API
ZLMediaKit提供丰富的RESTful API用于监控:
# 服务器状态检查
curl http://localhost:80/index/api/getServerConfig
# 流媒体会话统计
curl http://localhost:80/index/api/getSessionList
# 媒体源状态
curl http://localhost:80/index/api/getMediaList
# 系统资源使用情况
curl http://localhost:80/index/api/getSystemInfo
5.2 日志管理配置
# config.ini 中的日志配置
[ffmpeg]
log=./logs/ffmpeg/ffmpeg.log
[hook]
# 启用web hook日志
enable=1
on_flow_report=http://log-collector:8080/api/logs/flow
on_stream_changed=http://log-collector:8080/api/logs/stream
5.3 Prometheus监控指标
ZLMediaKit支持通过HTTP API暴露监控指标,可与Prometheus集成:
# prometheus.yml 配置
scrape_configs:
- job_name: 'zlmediakit'
static_configs:
- targets: ['zlmediakit-service:80']
metrics_path: '/index/api/getStatistic'
params:
secret: ['your_secret_here']
scrape_interval: 15s
六、性能优化指南
6.1 内核参数调优
# 增加网络缓冲区大小
echo 'net.core.rmem_max=268435456' >> /etc/sysctl.conf
echo 'net.core.wmem_max=268435456' >> /etc/sysctl.conf
echo 'net.core.rmem_default=262144' >> /etc/sysctl.conf
echo 'net.core.wmem_default=262144' >> /etc/sysctl.conf
# 增加文件描述符限制
echo '* soft nofile 65536' >> /etc/security/limits.conf
echo '* hard nofile 65536' >> /etc/security/limits.conf
# 应用配置
sysctl -p
6.2 Docker运行参数优化
docker run -id \
--name zlmediakit-optimized \
--network=host \
--cpuset-cpus="0-3" \
--memory="4g" \
--memory-swap="6g" \
--ulimit nofile=65536:65536 \
--ulimit memlock=-1:-1 \
--cap-add=NET_ADMIN \
--security-opt seccomp=unconfined \
-v /dev/shm:/dev/shm \
zlmediakit/zlmediakit:master
6.3 配置参数调优表
| 参数 | 默认值 | 推荐值 | 说明 |
|---|---|---|---|
mergeWriteMS | 0 | 10 | 合并写缓存时间(毫秒) |
maxStreamWaitMS | 15000 | 5000 | 最大流等待时间 |
udp_recv_socket_buffer | 4194304 | 8388608 | UDP接收缓冲区 |
segDur | 2 | 6 | HLS切片时长(秒) |
segNum | 3 | 5 | HLS保留切片数 |
七、安全加固措施
7.1 网络隔离策略
# 使用Docker网络隔离
docker network create media-network
docker run -id \
--network=media-network \
--publish 1935:1935 \
--publish 80:80 \
# 仅暴露必要端口
zlmediakit/zlmediakit:master
7.2 API安全配置
[api]
secret=complex_password_2024
apiDebug=0
[http]
allow_ip_range=192.168.1.0/24,10.0.0.0/8
forwarded_ip_header=X-Real-IP
[hook]
enable=1
timeoutSec=5
retry=2
7.3 SSL/TLS证书配置
# 自动生成自签名证书(开发环境)
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem \
-days 365 -nodes -subj "/CN=your-domain.com"
# 挂载证书到容器
docker run -id \
-v /path/to/certs:/opt/media/certs \
-e SSL_CERT_FILE=/opt/media/certs/cert.pem \
-e SSL_KEY_FILE=/opt/media/certs/key.pem \
zlmediakit/zlmediakit:master
八、故障排查与调试
8.1 常见问题解决方案
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 端口绑定失败 | 端口被占用或权限不足 | 检查端口占用,使用host网络模式 |
| 流媒体无法播放 | 防火墙限制或配置错误 | 检查防火墙规则,验证配置 |
| 高延迟 | 网络缓冲区设置不当 | 调整内核网络参数 |
| 内存泄漏 | 版本bug或配置问题 | 升级到最新版本,检查配置 |
8.2 调试命令集
# 查看容器日志
docker logs -f zlmediakit
# 进入容器调试
docker exec -it zlmediakit /bin/bash
# 检查端口监听状态
docker exec zlmediakit netstat -tlnp
# 测试流媒体服务
ffmpeg -re -i input.mp4 -c copy -f flv rtmp://localhost:1935/live/stream
ffplay rtmp://localhost:1935/live/stream
九、版本升级与回滚
9.1 蓝绿部署策略
# 部署新版本(绿色环境)
docker run -id \
--name zlmediakit-green \
-p 1936:1935 \
-p 8081:80 \
# 使用临时端口
zlmediakit/zlmediakit:new-version
# 测试新版本
curl http://localhost:8081/index/api/getServerConfig
# 切换流量(蓝绿切换)
docker stop zlmediakit-blue
docker rm zlmediakit-blue
docker rename zlmediakit-green zlmediakit-blue
docker network connect bridge zlmediakit-blue
9.2 版本回滚方案
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



