Docker 快速搭建直播流媒体服务器

准备工作

1. Docker环境:确保你的主机上已经安装并配置好Docker环境。

2. 基础镜像: 选择一个包含Nginx和RTMP模块的Docker镜像,例如:tiangolo/nginx-rtmp。

3. 推流工具: FFmpeg是一个常用的推流工具,可以用它来模拟直播源。也可以使用OBS

本文演示环境为Ubuntu 20,使用Putty进行远程SSH连接。

购买云服务器搭建流媒体服务器

在我们的官网选择适合您的配置,一键购买。
国庆特惠

云服务器 - 基础型

¥ 35/月
立省28% (原价¥49)
两年
立即订购
  • 配置: 2核4GB, 独立IP
  • 存储: 60GB SSD系统盘
  • 带宽: 100Mbps 不限流
  • 赠送: 每4周一次自动备份
  • 系统: Win10/11/Linux

云服务器 - 基础型Plus

¥ 59/月
两年
立即订购
  • 配置: 3核6GB, 独立IP
  • 存储: 100GB SSD系统盘
  • 带宽: 100Mbps 不限流
  • 赠送: 每4周一次自动备份
  • 系统: Win10/11/Linux
国庆特惠

云服务器 - 进阶型

¥ 69/月
立省30% (原价¥99)
两年
立即订购
  • 配置: 4核8GB, 独立IP
  • 存储: 140GB SSD系统盘
  • 带宽: 200Mbps 不限流
  • 赠送: 每4周一次自动备份
  • 系统: Win10/11/Linux

云服务器 - 进阶型Plus

¥ 99/月
两年
立即订购
  • 配置: 6核12GB, 独立IP
  • 存储: 180GB SSD系统盘
  • 带宽: 200Mbps 不限流
  • 赠送: 每4周一次自动备份
  • 系统: Win10/11/Linux

安装 Docker 和 Docker Compose

如果您尚未安装 Docker,如果请先完成 Docker 的安装步骤。如果已安装 Docker,可跳过以下内容。

1. 更新系统软件包

首先,确保你的系统软件包是最新的。执行以下命令来更新系统:

sudo apt update 
sudo apt upgrade

2. 安装 Docker 和 Docker Compose

使用以下命令安装 Docker 和 Docker Compose:

sudo apt install docker docker-compose

3. 将用户添加到 Docker 组

默认情况下,只有 root 用户和 sudo 组的用户可以运行 Docker 命令。Ubuntu 操作系统默认 Administrator 用户,如果你希望不使用 sudo 也能运行 Docker 命令,可以将你的用户添加到 docker 组:

sudo usermod -aG docker $(whoami)

4. 切换到新的 Docker 组

要立即生效,可以使用以下命令:

newgrp docker

5. 检查 Docker 服务状态

确保 Docker 服务正在运行:

sudo systemctl status docker

如果 Docker 服务没有启动,可以使用以下命令启动它:

sudo systemctl start docker

6. 检查 Docker 套接字权限

确保 Docker 套接字的权限正确:

ls -l /var/run/docker.sock

输出应类似如下:

srw-rw---- 1 root docker 0 Aug 30 08:28 /var/run/docker.sock

这表示 Docker 套接字文件的权限设置为允许 root 和 docker 组的成员访问。

拉取镜像

拉取nginx-rtmp镜像。docker的nginx-rtmp是封装了nginx-rtmp-module和ffmpeg的镜像。

1. 拉取 nginx-rtmp 镜像

从Docker Hub上拉取一个名为alfg/nginx-rtmp的镜像。

docker pull alfg/nginx-rtmp

2. 映射端口

基于这个镜像创建一个新的容器,并启动它。将容器内部的1935端口和80端口分别映射到宿主机的1935端口和80端口,以便我们从外部访问。容器退出后自动删除。

docker run -it -p 1935:1935 -p 8080:80 --rm alfg/nginx-rtmp

创建和编写 docker-compose.yml、nginx.conf

首先,创建一个目录来存放你的 Docker Compose 文件和相关配置文件:

mkdir nginx-rtmp
cd nginx-rtmp

1. 创建和编写 docker-compose.yml

在该目录中,创建一个名为 docker-compose.yml 的文件:

sudo nano docker-compose.yml

将以下内容粘贴到文件中:

version: '3.1'
services:
nginx-rtmp-test:
restart: always
image: alfg/nginx-rtmp
container_name: nginx-rtmp-test
ports:
- 1935:1935
- 8080:80
volumes:
- ./conf/nginx.conf:/etc/nginx/nginx.conf
- ./html:/usr/share/nginx/html
- ./log:/var/log/nginx

保存并退出(在 nano 中,按 Ctrl + O 保存,按 Enter 确认,然后按 Ctrl + X 退出)。

2. 创建和编写 nginx.conf

在同一目录中,创建一个名为 nginx.conf 的文件,并添加以下配置内容。这将配置 nginx 以支持 RTMP 流媒体:

sudo nano nginx.conf

将以下内容粘贴到文件中:

# user 指定运行 nginx 的用户和组(第一个参数为用户第二个为组,这里只有用户)
user root;
# 指定工作进程数(一般设置为CPU核数)
worker_processes 1;
# nginx 连接配置模块
events {
# 指定每个工作进程最大连接数为 1024
worker_connections 1024;
}
# RTMP 服务(重点)
rtmp {
server {
# 指定服务端口
listen 1935; # RTMP协议使用的默认端口
chunk_size 4000; # RTMP分块大小
# 指定 HLS 流应用
application hls { # hls为流应用的名称,可以随便填
live on;
# 打开直播流
hls on; # 打开 HLS
hls_path /tmp/hls; # HLS 文件存放路径
}
}
}
# http 配置模块
http {
# 通过 include 加载 mime.types 文件,里面的 types {} 模块将文件扩展名映射到响应的 MIME 类型
include mime.types;
# 定义响应的默认 MIME 类型
default_type application/octet-stream;
# 启用或者禁用 sendfile()
sendfile on;
# 65 s 超时
keepalive_timeout 65;
# etag
etag on;
# 过期时间
expires 7d;
# 虚拟主机配置模块
server {
# 监听 8080 端口
listen 8080;
# 监听域名为 localhost
server_name localhost;
location /hls {
# Serve HLS fragments
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /tmp;
add_header Cache-Control no-cache;
}
}
}

启动Nginx流媒体服务器

在项目目录下执行以下命令启动服务:

sudo docker-compose up -d

验证容器是否正在运行:

sudo docker ps

你应该能看到类似如下输出,显示 nginx-rtmp-test 容器正在运行:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
xxxxxxxxxxxx alfg/nginx-rtmp '/docker-entrypoint.…'

RTMP 流媒体服务可以通过 rtmp:///live 进行访问。
通过浏览器访问 http://:8080/hls 查看 HLS 流。