0. 前言
  前面介绍的都是一些标准的第三方中间件,基本都是有现成的Dockerfile或者Image,不需要我过多的关心,这一篇要介绍一些自己构建的Docker Image了。刚开始学,Dockerfile写得比较挫,请见谅哈!!!

1. 构建Nginx-RTMP镜像
  由于基于Nginx的RTMP插件的镜像,好像没有找到。同时为了以后可以自己自定义功能,因此需要自己构建镜像。关于Nginx构建,可以参考官方的文档https://github.com/nginxinc/docker-nginx/ 关于RTMP插件的编译,可以参考我之前的博客 https://www.cnblogs.com/wunaozai/p/9427730.html
  我看Nginx官方标准的Dockerfile写得很复杂,现在还不懂得一些命令有什么用,我按照自己的理解,写了一份Dockerfile

 FROM alpine:latest
RUN apk add --no-cache --virtual .build-deps \
gcc \
libc-dev \
make \
openssl-dev \
pcre-dev \
curl RUN wget https://nginx.org/download/nginx-1.14.1.tar.gz && \
tar -zxvf nginx-1.14.1.tar.gz && \
wget https://github.com/arut/nginx-rtmp-module/archive/v1.2.1.tar.gz && \
mv v1.2.1.tar.gz nginx-rtmp-module.tar.gz && \
tar -zxvf nginx-rtmp-module.tar.gz WORKDIR /nginx-1.14.1 RUN ./configure --prefix=/opt --with-stream --add-module=../nginx-rtmp-module-1.2.1 && \
make -j$(getconf _NPROCESSORS_ONLN) && \
make install WORKDIR / RUN strip /opt/sbin/nginx && \
rm -rf /nginx-* EXPOSE 80 1935 COPY nginx.conf /opt/conf/nginx.conf
COPY env.sh / RUN chmod +x env.sh ENTRYPOINT ["/env.sh"]

  这里简单说一下,第一步安装必要的依赖,然后下载nginx源码及nginx-rtmp-module源码,第三步,编译,最后删除临时安装包。完成。

  最主要功能的实现,是在nginx.conf和env.sh 这两个文件。先看nginx.conf配置文件

 worker_processes  1;

 daemon off;

 events {
worker_connections 1024;
} http {
include mime.types;
default_type application/octet-stream;
access_log /opt/logs/access.log;
sendfile on;
keepalive_timeout 65; server {
listen 80;
server_name localhost; location / {
root /opt/html;
index index.html index.htm;
} error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
} rtmp {
server {
listen 1935;
access_log /opt/logs/rtmp_access.log;
application rtmp{
live on;
notify_method get;
on_play http://127.0.0.1/on_play;
on_publish http://127.0.0.1/on_publish;
on_update http://127.0.0.1/on_update;
notify_update_timeout 120s;
}
}
}

  这一份配置应该也不难理解,我之前的博客已经讲解到了。开启RTMP默认端口1935,对RTMP的推流端和拉流端进行验证,验证逻辑在on_play/on_publish/on_update 这几个URL里面。具体的逻辑,就可以通过HTTP服务器实现,默认是不验证的。

  另外一份配置是env.sh 目前还不清楚Docker配置环境变量有什么好的方法,我用的比较笨的方法。

 #!/bin/sh

 echo "ok" > /opt/html/healthcheck
echo "ok" > /opt/html/on_play
echo "ok" > /opt/html/on_publish
echo "ok" > /opt/html/on_update if [ "$NGINX_RTMP_URL_PLAY" = "" ]; then
echo "on_play"
else
sed -i "s#127.0.0.1/on_play#$NGINX_RTMP_URL_PLAY#g" /opt/conf/nginx.conf
fi
if [ "$NGINX_RTMP_URL_PUBLISH" = "" ]; then
echo "on_publish"
else
sed -i "s#127.0.0.1/on_publish#$NGINX_RTMP_URL_PUBLISH#g" /opt/conf/nginx.conf
fi
if [ "$NGINX_RTMP_URL_UPDATE" = "" ]; then
echo "on_update"
else
sed -i "s#127.0.0.1/on_update#$NGINX_RTMP_URL_UPDATE#g" /opt/conf/nginx.conf
fi /opt/sbin/nginx

  哈哈!就是通过环境变量来改变nginx.conf 配置,相比于官方的通过templates模版方式确实LOW很多啊。

 version: '3'
services:
demo:
image: nginx-rtmp
ports:
- 1935:1935

  构建、运行

 docker build -t nginx-rtmp .
docker-compose up -d

  启动后,可以进行推流和拉流了,测试工具,推流可以使用微信小程序里的 腾讯视频云 进行推流。拉流可以用下面构建的RTMP-Player工具进行拉流。

2. 构建RTMP-Player镜像

  这里我使用 GrindPlayer 工具,使用的是Flash。我打包成已经镜像,并上传至阿里云,有需要的可以通过链接进行pull下载,需要GrindPlayer工具源码的博文最后也给出下载地址,播放器Flash的在github.com上也有介绍。
  Dockerfile

 FROM nginx:1.14-alpine
COPY GrindPlayer /usr/share/nginx/html
EXPOSE 80
STOPSIGNAL SIGTERM
CMD ["nginx", "-g", "daemon off;"]

  构建、上传阿里云Docker仓库

 docker build -t rtmp-player .
docker tag rtmp-player:latest registry.cn-shenzhen.aliyuncs.com/wunaozai/rtmp-player:0.0.1
docker push registry.cn-shenzhen.aliyuncs.com/wunaozai/rtmp-player:0.0.1

3. 实际演示

  利用docker-compose启动

 version: '3'
services:
nginx-rtmp:
image: registry.cn-shenzhen.aliyuncs.com/wunaozai/nginx-rtmp
ports:
- 1935:1935
environment:
- NGINX_RTMP_URL_PLAY=127.0.0.1:80/on_play
- NGINX_RTMP_URL_PUBLISH=127.0.0.1:80/on_publish
- NGINX_RTMP_URL_UPDATE=127.0.0.1:80/on_update rtmp-player:
image: registry.cn-shenzhen.aliyuncs.com/wunaozai/rtmp-player
ports:
- 8080:80

  启动后,我利用微信小程序RTMP推流,然后用这个RTMP-Player拉流,可以正常使用。完美!

4. 多说两句

  这种视频类的应用,主要还是带宽问题。阿里云带宽收费又比较贵,哎~~。这个不说了。上面利用nginx-rtmp就架起了一个简单的基于HTTP认证的RTMP流媒体服务器。如果有多台电脑,就在多台电脑上,部署该nginx-rtmp应用,然后配置环境变量NGINX_RTMP_URL_*,这里的URL地址指向统一认证地址即可。假设客户端A,登录获取RTMP授权,得到rtmp://127.0.0.1/rtmp/room?token=123播放地址,然后在服务器L上进行推流,通过MQTT推送给客户端B,客户端B利用该URL地址进行拉流。如果需要多个客户端拉流,只需通过MQTT推送给多个客户端即可。

附件下载:
  https://files.cnblogs.com/files/wunaozai/GrindPlayer.zip

参考资料:

  https://github.com/nginxinc/docker-nginx/
  https://www.cnblogs.com/wunaozai/p/9427730.html

本文地址: https://www.cnblogs.com/wunaozai/p/9969246.html

物联网架构成长之路(26)-Docker构建项目用到的镜像2的更多相关文章

  1. 物联网架构成长之路(25)-Docker构建项目用到的镜像1

    0. 前言 现在项目处于初级阶段,按照规划,先构建几个以后可能会用到的Image,并上传到阿里云的Docker仓库.以后博客中用到的Image,大部分都会用到这几个基础的Image,构建一个简单的物联 ...

  2. 物联网架构成长之路(22)-Docker练习之Etcd服务搭建

    0. 前言 时隔多日,前段时间忙完一个可有可无的项目后,又进入摸鱼时间,没有办法,非互联网公司,就是闲得蛋疼.又开始了自学之路.以前入门过Docker,然后又很久没有看了,最近重新看了一下,推荐一下这 ...

  3. 物联网架构成长之路(27)-Docker练习之Zookeeper安装

    0. 前言 准备了解一下消息队列MQ,对比了一些开源的中间件,最后选择Kafka作为以后用到的消息队列,消息队列的应用场景及Kafka与其他消息队列的优缺点这里就不细说了,具体的可以参考其他博客说明. ...

  4. 物联网架构成长之路(24)-Docker练习之Compose容器编排

    0.前言 一开始学的之后,是想一步到位直接上Kubernetes(K8s)的,后面没想到,好像有点复杂,有些概念不是很懂.因此学习东西还是要循序渐进,慢慢来.先了解单机编排技术Docker Compo ...

  5. 物联网架构成长之路(28)-Docker练习之MQ中间件(Kafka)

    0. 前言 消息队列MQ,这个在一般的系统上都是会用到的一个中间件,我选择Kafka作为练手的一个中间件,Kafka依赖Zookeeper.Zookeeper安装上一篇博客已经介绍过了. 1. Kaf ...

  6. 物联网架构成长之路(23)-Docker练习之Elasticsearch服务搭建

    0. 前言 最近基本都是学一些环境配置,和一些中间件的安装与配置.没有实际编写代码.可能看起来有点水,我对自己的学习方式是,先要了解各个中间件的安装配置以及简单使用,理论应用场景,然后我在小项目中,逐 ...

  7. 物联网架构成长之路(44)-Docker私有仓库Harbor

    0. 前言 安装docker.docker-compose,这些在我以前的博客讲过,这里就不继续说明了,有需要的可以参考我之前的博客. https://www.cnblogs.com/wunaozai ...

  8. 物联网架构成长之路(31)-EMQ基于HTTP权限验证

    看过之前的文章就知道,我之前是通过搞插件,或者通过里面的MongoDB来进行EMQ的鉴权登录和权限验证.但是前段时间发现,还是通过HTTP WebHook 方式来调用鉴权接口比较适合实际使用.还是实现 ...

  9. 物联网架构成长之路(29)-Jenkins环境搭建

    0. 说明 哈哈,前面中间插入了一篇Eclipse增加Git插件,在此之前真的没有用过GIT. 1. 运行Jenkins 这里为了方便,还是用Docker方式安装,由于这个是标准的war报,不对Doc ...

随机推荐

  1. 表达式语言引擎:Apache Commons JEXL 2.1 发布

    http://www.linuxde.net/2011/12/4348.html Commons JEXL 2.1 发布了,该版本和 2.0.1 是二进制兼容的,但源码不兼容,因为新增了两个接口: o ...

  2. pyV8不支持dom操作,关于PyV8的支持DOM的疑问

    https://www.cnblogs.com/zdz8207/p/python_learn_note_123.html

  3. jsoup 解析html

    http://www.cnblogs.com/jycboy/p/jsoupdoc.html http://www.cnblogs.com/mokafamily/p/3558620.html

  4. 【ACM】 1231 最大连续子序列

    [1231 最大连续子序列 ** Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...

  5. [PA2014]Żarówki

    [PA2014]Żarówki 题目大意: 有\(n(n\le5\times10^5)\)个房间和\(n\)盏灯,你需要在每个房间里放入一盏灯.每盏灯都有一定功率\(p_i\),每间房间都需要功率不小 ...

  6. Shooting Contest 射击比赛 [POJ1719] [CEOI1997] [一题多解]

    Description(下有中文题意) Welcome to the Annual Byteland Shooting Contest. Each competitor will shoot to a ...

  7. linux使用Anaconda管理多个版本的Python环境

    1.下载(直接到清华镜像下载) 下载链接,选择合适的版本,我试了几个,选择了一个下载最快的,原谅我的渣渣网速, 官网在国外,必须找镜像,不然很慢很慢,,,,,, 此步骤真的很慢,重新选择下载网址,这个 ...

  8. 初识hibernate——环境搭建

    一  配置过程 1. 创建一个项目 2. 导包    required里的包 optional里的c3p0连接池的三个包 数据库驱动包 Junit 3.创建Hibernate的配置文件(hiberna ...

  9. PAT Basic 1005

    1005 继续(3n+1)猜想 (25 分) 卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程 ...

  10. C_狐狸和兔子的故事

    题目描述 围绕着山顶有10个洞,一只狐狸和一只兔子各住一个洞.狐狸总想吃掉兔子.一天兔子对狐狸说:“你想吃我有一个条件,先把洞从1-10编上号,你从10号洞出发,先到1号洞找我:第二次隔1个洞找我,第 ...