物聯網架構成長之路(26)-Docker構建項目用到的鏡像2

0. 前言
  前面介紹的都是一些標準的第三方中間件,基本都是有現成的Dockerfile或者Image,不須要我過多的關心,這一篇要介紹一些本身構建的Docker Image了。剛開始學,Dockerfile寫得比較挫,請見諒哈!!!html

 

1. 構建Nginx-RTMP鏡像
  因爲基於Nginx的RTMP插件的鏡像,好像沒有找到。同時爲了之後能夠本身自定義功能,所以須要本身構建鏡像。關於Nginx構建,能夠參考官方的文檔https://github.com/nginxinc/docker-nginx/ 關於RTMP插件的編譯,能夠參考我以前的博客 https://www.cnblogs.com/wunaozai/p/9427730.html
  我看Nginx官方標準的Dockerfile寫得很複雜,如今還不懂得一些命令有什麼用,我按照本身的理解,寫了一份Dockerfilenginx

 1 FROM alpine:latest
 2 RUN apk add --no-cache --virtual .build-deps \
 3     gcc \
 4     libc-dev \
 5     make \
 6     openssl-dev \
 7     pcre-dev \
 8     curl
 9 
10 RUN wget https://nginx.org/download/nginx-1.14.1.tar.gz && \
11     tar -zxvf nginx-1.14.1.tar.gz && \
12     wget https://github.com/arut/nginx-rtmp-module/archive/v1.2.1.tar.gz && \
13     mv v1.2.1.tar.gz nginx-rtmp-module.tar.gz && \
14     tar -zxvf nginx-rtmp-module.tar.gz
15 
16 WORKDIR /nginx-1.14.1
17 
18 RUN ./configure --prefix=/opt --with-stream --add-module=../nginx-rtmp-module-1.2.1 && \
19     make -j$(getconf _NPROCESSORS_ONLN) && \
20     make install
21 
22 WORKDIR /
23 
24 RUN strip /opt/sbin/nginx && \
25     rm -rf /nginx-*
26 
27 EXPOSE 80 1935
28 
29 COPY nginx.conf /opt/conf/nginx.conf
30 COPY env.sh /
31 
32 RUN chmod +x env.sh
33 
34 ENTRYPOINT ["/env.sh"]

  這裏簡單說一下,第一步安裝必要的依賴,而後下載nginx源碼及nginx-rtmp-module源碼,第三步,編譯,最後刪除臨時安裝包。完成。git

  最主要功能的實現,是在nginx.conf和env.sh 這兩個文件。先看nginx.conf配置文件github

 1 worker_processes  1;
 2 
 3 daemon off;
 4 
 5 events {
 6     worker_connections  1024;
 7 }
 8 
 9 http {
10     include       mime.types;
11     default_type  application/octet-stream;
12     access_log  /opt/logs/access.log;
13     sendfile        on;
14     keepalive_timeout  65;
15 
16     server {
17         listen       80;
18         server_name  localhost;
19 
20         location / {
21             root   /opt/html;
22             index  index.html index.htm;
23         }
24 
25         error_page   500 502 503 504  /50x.html;
26         location = /50x.html {
27             root   html;
28         }
29     }
30 }
31 
32 rtmp {
33     server {
34         listen 1935;
35         access_log /opt/logs/rtmp_access.log;
36         application rtmp{
37             live on;
38             notify_method get;
39             on_play http://127.0.0.1/on_play;
40             on_publish http://127.0.0.1/on_publish;
41             on_update http://127.0.0.1/on_update;
42             notify_update_timeout 120s;
43         }
44     }
45 }

  這一份配置應該也不難理解,我以前的博客已經講解到了。開啓RTMP默認端口1935,對RTMP的推流端和拉流端進行驗證,驗證邏輯在on_play/on_publish/on_update 這幾個URL裏面。具體的邏輯,就能夠經過HTTP服務器實現,默認是不驗證的。docker

  另一份配置是env.sh 目前還不清楚Docker配置環境變量有什麼好的方法,我用的比較笨的方法。小程序

 1 #!/bin/sh
 2 
 3 echo "ok" > /opt/html/healthcheck
 4 echo "ok" > /opt/html/on_play
 5 echo "ok" > /opt/html/on_publish
 6 echo "ok" > /opt/html/on_update
 7 
 8 if [ 0"$NGINX_RTMP_URL_PLAY" = "0" ]; then
 9     echo "on_play"
10 else
11     sed -i "s#127.0.0.1/on_play#$NGINX_RTMP_URL_PLAY#g" /opt/conf/nginx.conf
12 fi
13 if [ 0"$NGINX_RTMP_URL_PUBLISH" = "0" ]; then
14     echo "on_publish"
15 else
16     sed -i "s#127.0.0.1/on_publish#$NGINX_RTMP_URL_PUBLISH#g" /opt/conf/nginx.conf
17 fi
18 if [ 0"$NGINX_RTMP_URL_UPDATE" = "0" ]; then
19     echo "on_update"
20 else
21     sed -i "s#127.0.0.1/on_update#$NGINX_RTMP_URL_UPDATE#g" /opt/conf/nginx.conf
22 fi
23 
24 /opt/sbin/nginx

  哈哈!就是經過環境變量來改變nginx.conf 配置,相比於官方的經過templates模版方式確實LOW不少啊。微信小程序

1 version: '3'
2 services:
3     demo:
4         image: nginx-rtmp
5         ports:
6             - 1935:1935

  構建、運行服務器

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

  啓動後,能夠進行推流和拉流了,測試工具,推流可使用微信小程序裏的 騰訊視頻雲 進行推流。拉流能夠用下面構建的RTMP-Player工具進行拉流。微信

 

2. 構建RTMP-Player鏡像app

  這裏我使用 GrindPlayer 工具,使用的是Flash。我打包成已經鏡像,並上傳至阿里雲,有須要的能夠經過連接進行pull下載,須要GrindPlayer工具源碼的博文最後也給出下載地址,播放器Flash的在github.com上也有介紹。
  Dockerfile

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

  構建、上傳阿里雲Docker倉庫

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

 

3. 實際演示

  利用docker-compose啓動

 1 version: '3'
 2 services:
 3     nginx-rtmp:
 4         image: registry.cn-shenzhen.aliyuncs.com/wunaozai/nginx-rtmp
 5         ports:
 6             - 1935:1935
 7         environment:
 8             - NGINX_RTMP_URL_PLAY=127.0.0.1:80/on_play
 9             - NGINX_RTMP_URL_PUBLISH=127.0.0.1:80/on_publish
10             - NGINX_RTMP_URL_UPDATE=127.0.0.1:80/on_update
11 
12     rtmp-player:
13         image: registry.cn-shenzhen.aliyuncs.com/wunaozai/rtmp-player
14         ports:
15             - 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/
  http://www.javashuo.com/article/p-byzxxlrk-ct.html

本文地址: http://www.javashuo.com/article/p-ayarpcwt-ht.html

相關文章
相關標籤/搜索