使用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
- 虾说区块链-55-《精通比特币》笔记十
- SignalR QuickStart
- Node.js入门学习笔记-IDE选择/配置之WebStorm(windows)
- Captcha插件后门分析和修复
- log4net.SignalR - 日志即时发送客户端页面
- 科学家担心的智能爆炸,真会有这一天吗?
- RSA 2018:从大会议题看2018年网络安全趋势
- Silverlight:Mouse Avoiding 躲避鼠标效果
- CTreeCtrl 控件使用总结
- 在ASP.NET MVC 4中使用Kendo UI Grid
- 每周四更面试题:True+True=?
- iis7 发布mvc 遇到的HTTP错误 403.14-Forbidden Web 服务器被配置为不列出此目录的内容
- NET中验证控件表达式汇总
- 动态执行超过4000个字符的SQL
- 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 数组属性和方法
- OnClick 的另一种书写
- JVM系列之:JIT中的Virtual Call
- 速读原著-UnixLinux基础(五)
- Celery在Django中的简单应用
- 基于数据库Binlog 的业务系统操作日志实现方案(阿里中间件Canal)
- 速读原著-UnixLinux基础(三)
- 手撸实现UDP和TCP通信
- 3分钟短文 | PHP获取函数参数名,和类定义的常量,都要反射!
- 3分钟短文 | Laravel模型获取最后一条插入记录的ID编号
- 3分钟短文 | Laravel 模型的get find first方法你分清咋用了吗?
- 3分钟短文 ! Laravel拼装SQL子查询的最佳实现
- 对java中的泛型的理解
- 解决elasticsearch集群Unassigned Shards无法reroute的问题
- 一次系统扩容引起的elasticsearch故障及恢复
- WPF SharpDx 性能优化方法