介绍
推流服务器上需要安装多个服务和依赖包,以及许多个依赖库,例如:python3,pip3,nginx,ffmpeg,vlc,以及一些依赖:yasm库,libwebp库,libOpenJpeg库等
因为特殊需求,这里需要将这些服务均构建到一个镜像里,具体实现方法如下。
构建
首先随便创建一个目录,用来存放Dockerfile及构建过程中所需要的一些安装包等
代码语言:javascript复制# 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和所需依赖包的镜像
代码语言:javascript复制# 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镜像
代码语言:javascript复制# 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等镜像
代码语言:javascript复制# 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 .
最后操作
代码语言:javascript复制# 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 .
启动容器
代码语言:javascript复制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