使用dockerfile构建推流服务器
时间:2022-07-22
本文章向大家介绍使用dockerfile构建推流服务器,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
介绍
推流服务器上需要安装多个服务和依赖包,以及许多个依赖库,例如:python3,pip3,nginx,ffmpeg,vlc,以及一些依赖:yasm库,libwebp库,libOpenJpeg库等
因为特殊需求,这里需要将这些服务均构建到一个镜像里,具体实现方法如下。
构建
首先随便创建一个目录,用来存放Dockerfile及构建过程中所需要的一些安装包等
# tree
.
├── Dockerfile
├── Dockerfile.depend
├── Dockerfile.ffmpeg
├── Dockerfile.vlc
├── entrypoints.sh
├── fdk-aac-0.1.6.tar.gz
├── ffmpeg.tar.gz
├── get-pip.py
├── lame-3.100.tar.gz
├── libwebp-1.0.2.tar.gz
├── live-server-new.tar
├── openjpeg-2.3.0.tar.gz
├── pip_requirements.txt
├── SDL2-2.0.9.tar.gz
├── sources.list
├── thrid_lib.tar.gz
├── vlc.tar.gz
├── x264-snapshot-20171002-2245-stable.tar.bz2
└── yasm-1.3.0.tar.gz
为了便于排查问题,我们分为几步来做,首先构建一个具有ssh的基础镜像,然后将所有的依赖包打到镜像里,然后安装ffmpeg,再安装vlc,python3,pip3及一些特殊的模块,最后我们映射端口和目录,以及将entrypoint要执行的脚本放到镜像里去执行。这样做增加了扩展性,比如我们需要再映射其他端口时,不需要重新将所有的Dockerfile执行一遍,只需要以之前构建好的镜像作为基础镜像,再次构建一次即可!
下面是具体的实施方法
构建具有ssh和所需依赖包的镜像
# cat Dockerfile.depend
FROM ubuntu:16.04
COPY sources.list /etc/apt/
RUN apt-get -y update
&& apt-get install -y openssh-server vim libtool sudo net-tools make cmake
build-essential automake autopoint pkg-config gettext
&& mkdir /var/run/sshd
&& echo "root:123321" | chpasswd
&& sed -ri 's/^#?PermitRootLogins+.*/PermitRootLogin yes/' /etc/ssh/sshd_config
&& sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config
&& mkdir /root/.ssh
&& apt-get clean
&& rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
&& mkdir -p /data/tmp/
ADD yasm-1.3.0.tar.gz /data/tmp/
ADD SDL2-2.0.9.tar.gz /data/tmp/
ADD openjpeg-2.3.0.tar.gz /data/tmp/
ADD libwebp-1.0.2.tar.gz /data/tmp/
ADD lame-3.100.tar.gz /data/tmp/
ADD fdk-aac-0.1.6.tar.gz /data/tmp/
ADD x264-snapshot-20171002-2245-stable.tar.bz2 /data/tmp/
WORKDIR /data/tmp/yasm-1.3.0/
RUN ./configure && make && make install
WORKDIR /data/tmp/x264-snapshot-20171002-2245-stable/
RUN ./configure --enable-shared --enable-static --enable-yasm
&& make
&& make install
WORKDIR /data/tmp/libwebp-1.0.2
RUN ./configure
--prefix=/usr
--enable-libwebpmux
--enable-libwebpdemux
--enable-libwebpdecoder
--enable-libwebpextras
--enable-swap-16bit-csp
&& make
&& make install
WORKDIR /data/tmp/lame-3.100
RUN ./configure && make && make install
WORKDIR /data/tmp/fdk-aac-0.1.6
RUN ./configure && make && make install
WORKDIR /data/tmp/SDL2-2.0.9
RUN ./configure && make && make install
WORKDIR /data/tmp/openjpeg-2.3.0
RUN cmake -DCMAKE_INSTALL_PREFIX=/usr && make && make install
RUN rm -rf /data/tmp/*
构建方式: docker build -t ffmpeg:depend .
构建ffmpeg镜像
# cat Dockerfile.ffmpeg
FROM ffmpeg:depend #以上一个步骤做好的镜像作为基础镜像
ADD ffmpeg.tar.gz /data/tmp
WORKDIR /data/tmp/ffmpeg
RUN ./configure
--prefix=/usr
--enable-shared
--enable-yasm
--enable-libx264
--enable-avfilter
--enable-gpl
--enable-sdl
--enable-libwebp
--enable-avresample
--enable-libmp3lame
--enable-libfdk-aac
--enable-nonfree
--enable-libopenjpeg
&& make -j2
&& make install
RUN rm -rf /data/tmp/*
&& apt-get clean
&& apt-get autoremove
构建方式: docker build -t ffmpeg:v1 .
构建vlc及python等镜像
# cat Dockerfile.vlc
FROM ffmpeg:v1
ADD vlc.tar.gz /data/tmp/
COPY get-pip.py /data/tmp/
COPY pip_requirements.txt /data/tmp/
RUN apt-get -y update
&& apt-get -y install software-properties-common
&& add-apt-repository ppa:jonathonf/ffmpeg-3
&& apt-get -y update
&& apt-get -y install python3.5-dev htop sysstat rsync nginx-full libavcodec-dev git
&& apt-get -y build-dep vlc
&& apt-get -y install bison flex
&& groupadd www
&& useradd -rm -d /home/www -s /bin/bash -g root -G sudo -u 1000 www
&& echo "www:Tccm@2008" | chpasswd
&& chown -R www.www /data
&& apt-get clean
&& apt-get -y autoremove
WORKDIR /data/tmp/
RUN python3 get-pip.py
&& pip3 install -r pip_requirements.txt
WORKDIR /data/tmp/vlc
RUN ./bootstrap
&& ./configure
--disable-xcb
--disable-chromecast
--prefix=/usr/local/vlc
&& make
&& make install
构建方式: docker build -t ffmpeg:vlc .
最后操作
# cat Dockerfile
FROM ffmpeg:vlc
RUN sed -i 's/Port 22/Port 2222/g' /etc/ssh/sshd_config
&& rm -rf /data/tmp/*
&& apt-get -y autoremove
&& apt-get clean
&& ln -s /usr/local/vlc/bin/* /usr/local/bin/
ENV PATH=/usr/local/vlc/bin:$PATH #设置环境变量,也可以直接使用软连接,保留一个即可
COPY entrypoints.sh /
EXPOSE 2222
VOLUME ['/data/','/etc/nginx/','/var/log/nginx/']
ENTRYPOINT ["/entrypoints.sh"]
构建方式: docker build -t live-server:v1 .
启动容器
docker run -d -it --net host --name live-server -v /data/volume/live-server:/data/ -v /data/volume/logs/nginx:/var/log/nginx -v /data/volume/conf/nginx:/etc/nginx live-server:v1 /bin/bash
下面看下几个常用的镜像导入导出命令
导出镜像
查看镜像ID
docker image ls live-server:v1
导出镜像
docker save da5f3eb5d728 > live-server-new.tar
导入镜像
docker load < live-server-new.tar
设置镜像名及标签
docker tag da5f3eb5d728 v1 live-server
- AngularJS数据源的多种获取方式汇总
- 跨站的艺术-XSS入门与介绍
- 堆排序
- 两个元素定位,要求子元素垂直居中
- 在Spring Boot框架下使用WebSocket实现消息推送
- Linux上安装Zookeeper以及一些注意事项
- Nginx+Tomcat搭建集群,Spring Session+Redis实现Session共享
- Shiro中的授权问题(二)
- Shiro中的授权问题
- Spring Cloud中服务的发现与消费
- 使用Spring Cloud搭建高可用服务注册中心
- 从Netflix的Hystrix框架理解服务熔断和服务降级
- 使用Spring Cloud搭建服务注册中心
- 技术分享 | kafka的使用场景以及生态系统
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- [Go] Go语言实战-基于websocket浏览器通知的实现
- 快10年的老前端了,我还分不清 slice 和 splice,这到底是谁的锅
- 第4章 Jenkins系统用户认证配置管理
- 回答公众号留言的2个关于相关性分析的问题
- css 透明度和百分比对应值
- Qt项目DeskGirl开发
- 三日php之路 -- 第二,三天(php知识要点)
- GitLabRunner和流水线的数据采集与监控
- FPGA开源工具链
- 电脑软件(例如 Adobe、Autodesk)为什么那么容易被破解?
- 额 明天接着修改
- Java中Map,List与Set的区别
- 排序算法
- 将Js数组对象中的某个属性值升序排序,并指定数组中的某个对象移动到数组的最前面
- 想学习Spark?先带你了解一些基础的知识