使用dockerfile构建推流服务器

2020-07-31 13:57:43 浏览数 (1)

介绍

推流服务器上需要安装多个服务和依赖包,以及许多个依赖库,例如: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

0 人点赞