SONIC-Dockerfile说明

Dockerfile

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。

Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。

Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。有了 Dockerfile,当我们需要定制自己额外的需求时,只需在 Dockerfile 上添加或者修改指令,重新生成 image 即可,省去了敲命令的麻烦。

 

一个完整的Docker有以下几个部分组成:

docker Client客户端

Docker Daemon守护进程

Docker Image镜像

Docker Container容器

 

 

 

每个容器只运行一个进程

一个容器只运行一个进程。容器起到了隔离应用隔离数据的作用,不同的应用运行在不同的容器让集群的纵向扩展以及容器的复用都变的更加简单。需要多个应用交互时请使用 link 命令进行组合或者使用docker-compose。

 

Docker 把应用程序及其依赖,打包在 image 文件里面。只有通过这个文件,才能生成 Docker 容器。image 文件可以看作是容器的模板Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。

 

 

 

   

Dockerfile 分为四部分:

基础镜像信息、

维护者信息、

镜像操作指令、

容器启动执行指令

 

一开始必须要指明所基于的镜像名称,接下来一般会说明维护者信息;后面则是镜像操作指令,例如 RUN 指令。每执行一条RUN 指令,镜像添加新的一层,并提交;最后是 CMD 指令,来指明运行容器时的操作命令。

 

 

 

Docker缓存

    Docker 守护进程会一条一条的执行 Dockerfile 中的指令,而且会在每一步提交并生成一个新镜像,最后会输出最终镜像的ID。生成完成后,Docker 守护进程会自动清理你发送的上下文。

Dockerfile文件中的每条指令会被独立执行,并会创建一个新镜像,RUN cd /tmp等命令不会对下条指令产生影响。

Docker 会重用已生成的中间镜像,以加速docker build的构建速度。

 

$ docker build -t svendowideit/ambassador .

Sending build context to Docker daemon 15.36 kB

Step 1/4 : FROM alpine:3.2

 ---> 31f630c65071

Step 2/4 : MAINTAINER [email protected]

 ---> Using cache

 ---> 2a1c91448f5f

Step 3/4 : RUN apk update &&      apk add socat &&        rm -r /var/cache/

 ---> Using cache

 ---> 21ed6e7fbb73

Step 4/4 : CMD env | grep _TCP= | (sed 's/.*_PORT_\([0-9]*\)_TCP=tcp:\/\/\(.*\):\(.*\)/socat -t 100000000 TCP4-LISTEN:\1,fork,reuseaddr TCP4:\2:\3 \&/' && echo wait) | sh

 ---> Using cache

 ---> 7ea8aef582cc

Successfully built 7ea8aef582cc

   

 

 

 

二.SONIC-DOCKERFILE解析

   

Sonic项目的Dockerfile路径:

sonic-buildimage/sonic-slave$ cat Dockerfile

 

/*基于debian的jessie版本*/

FROM命令可能是最重要的Dockerfile命令。改命令定义了使用哪个基础镜像启动构建流程。基础镜像可以为任意镜 像。如果基础镜像没有被发现,Docker将试图从Docker image index来查找该镜像。FROM命令必须是Dockerfile的首个命令。

 

使用官方仓库中的镜像作为基础镜像,推荐使用 Debian image ,大小保持在100mb上下,且仍是完整的发行版。

FROM debian:Jessie

 

执行过程:

{

jessie: Pulling from library/debian#从镜像库拉取镜像

d660b1f15b9b: Pull complete

Digest: sha256:a64a7d8ff7ff87edb78004ef0b159661546d2ddbd82772128b344c90cf8422ab

Status: Downloaded newer image for debian:jessie

 ---> 79f4bda91989   ----image id

}

 

 

 

 

/*维护者信息*/

用于声明作者,并应该放在FROM的后面

MAINTAINER [email protected]

 

{

---> Running in 886d6a43533eUsing cache,缓存tag

Removing intermediate container 886d6a43533e

}

 

 

设置命令与参数下载MongoDB

 

/*镜像源*/

RUN echo "deb http://mirrors.163.com/debian/ jessie main non-free contrib" >> /etc/apt/sources.list && \

echo "deb http://mirrors.163.com/debian/ jessie-backports main contrib">> /etc/apt/sources.list && \

echo "deb-src http://mirrors.163.com/debian/ jessie  main non-free contrib">> /etc/apt/sources.list && \

echo "deb http://mirrors.163.com/debian-security/ jessie/updates main non-free contrib">> /etc/apt/sources.list && \

echo "deb-src http://mirrors.163.com/debian-security/ jessie/updates main non-free contrib">> /etc/apt/sources.list

 

 

{

---> Running in cf0d90d47782

Removing intermediate container cf0d90d47782

 ---> 81a19e700112

 

 

}

 

 

## Make apt-get non-interactive

 

ENV DEBIAN_FRONTEND=noninteractive

 

执行过程

{

    ---> Running in 8aacb8524557

Removing intermediate container 8aacb8524557

 ---> 140292d40e3e  非交互式,生成一个镜像140292d40e3e 

 (这个镜像id就是属于基于以上的要给缓存镜像,在后面的容器里面可以应用此镜像)

 

 

zcdocker@zodl:~$ docker ps -l

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES

4d4760f239b1        140292d40e3e        "/bin/sh -c 'apt-get…"   9 minutes ago       Up 9 minutes                            elated_babbage

 

 

}

 

 

 

/*RUN  安装软件使用

每条run指令在当前基础镜像执行,并且提交新镜像。当命令比较长时,可以使用“/”换行。*/

RUN apt-get update && apt-get install -y \

        apt-utils \

        axel \

        default-jre-headless \

        openssh-server \

        curl \

        wget \

        unzip \

        git \

        build-essential \

        libtool \

        lintian \

        sudo \

        dh-make \

        dh-exec \

        kmod \

        libtinyxml2-2 \

        libboost-program-options1.55-dev \

        libtinyxml2-dev \

        python \

        python-pip \

        libncurses5-dev \

        texinfo \

        dh-autoreconf \

        python3-pip \

        doxygen \

        devscripts \

        git-buildpackage \

        perl-modules \

        libswitch-perl \

        dh-systemd \

# For quagga build

        libreadline-dev \

        texlive-latex-base \

        texlive-generic-recommended \

        texlive-fonts-recommended \

        libpam0g-dev \

        libpam-dev \

        libcap-dev \

        imagemagick \

        ghostscript \

        groff \

        libpcre3-dev \

"Dockerfile.163" 287L, 7349C                                                                                                                                             24,1          Top

        groff \

        libpcre3-dev \

        gawk \

        chrpath \

# For frr build

        libc-ares-dev \

        hardening-wrapper \

        libsnmp-dev \

        libjson0 \

        libjson0-dev \

        libsystemd-dev \

        python-ipaddr \

# For libnl3 (local) build

        cdbs \

# For SAI meta build

        libxml-simple-perl \

        graphviz \

        aspell \

# For linux build

        bc \

        fakeroot \

        build-essential \

        devscripts \

        quilt \

        stgit \

# For platform-modules build

        module-assistant \

# For thrift build\

        gem2deb \

        libboost-all-dev \

        libevent-dev \

        libglib2.0-dev \

        libqt4-dev \

        python-all-dev \

        python-twisted \

        php5-dev \

        phpunit \

        libbit-vector-perl \

        openjdk-7-jdk \

        javahelper \

        maven-debian-helper \

        ant \

        libmaven-ant-tasks-java \

        libhttpclient-java \

        libslf4j-java \

        libservlet3.1-java \

        qt5-default \

# For mellanox sdk build

        libpcre3 \

        libpcre3-dev \

        byacc \

        flex \

        libglib2.0-dev \

        bison \

        expat \

                                                                                                                                                                         55,9          22%

        bison \

        expat \

        libexpat1-dev \

        dpatch \

        libdb-dev \

        iptables-dev \

        swig \

# For mellanox sai build

        libtool-bin \

        libxml2-dev \

# For build image

        cpio \

        squashfs-tools \

        zip \

# For broadcom sdk build

        linux-compiler-gcc-4.8-x86 \

        linux-kbuild-3.16 \

# teamd build

        libdaemon-dev \

        libdbus-1-dev \

        libjansson-dev \

# For cavium sdk build

        libpcap-dev \

        dnsutils \

        libusb-dev \

# For debian image reconfiguration

        augeas-tools \

# For p4 build

        libyaml-dev \

        libevent-dev \

        libjudy-dev \

        libedit-dev \

        libnanomsg-dev \

        python-stdeb \

# For redis build

        libjemalloc-dev \

# For mft kernel module build

        dkms \

# For python3.5 build

        sharutils \

        libncursesw5-dev \

        libbz2-dev \

        liblzma-dev \

        libgdbm-dev \

        tk-dev \

        blt-dev \

        libmpdec-dev \

        libbluetooth-dev \

        locales \

        libsqlite3-dev \

        libgpm2 \

        time \

        net-tools \

        xvfb \

        python-sphinx \

                                                                                                                                                                         114,9         45%

        xvfb \

        python-sphinx \

        python3-sphinx \

# For Jenkins static analysis, unit testing and code coverage

        cppcheck \

        clang \

        pylint \

        gcovr \

        python-pytest=2.6.3* \

        python3-pytest=2.6.3* \

        python-pytest-cov \

        python3-pytest-cov \

        python-parse \

# For snmpd

        libmysqlclient-dev \

        libmysqld-dev \

        libperl-dev \

        libpci-dev \

        libpci3 \

        libsensors4 \

        libsensors4-dev \

        libwrap0-dev \

# For mpdecimal

        docutils-common \

        libjs-sphinxdoc \

        libjs-underscore \

        python-docutils \

        python-markupsafe \

        python-pygments \

        python-roman \

        sphinx-common \

# For sonic config engine testing

        python-lxml \

        python-netaddr \

        python-ipaddr \

        python-yaml \

# For sonic utilities

        python3-netaddr \

# For lockfile

        procmail \

# For gtest

        libgtest-dev \

        cmake \

# For pam_tacplus build

        autoconf-archive \

# For python-based swsscommon

        swig3.0 \

# For iproute2

        cm-super-minimal \

        libatm1-dev \

        libelf-dev \

        libmnl-dev \

        libselinux1-dev \

        linuxdoc-tools \

        lynx \

                                                                                                                                                                         160,9         68%

        linuxdoc-tools \

        lynx \

        texlive-latex-extra \

        texlive-latex-recommended

 

执行过程:

{

---> Running in 4d4760f239b1(容器,镜像采用上面的缓存镜像)

}

 

 

 

 

# For linux build

RUN apt-get -y build-dep linux

 

# For gobgp build

RUN export VERSION=1.8.3 \

 && axel https://storage.googleapis.com/golang/go$VERSION.linux-amd64.tar.gz \

 && tar -C /usr/local -xzf go1.8.3.linux-amd64.tar.gz \

 && echo 'export GOROOT=/usr/local/go' >> /etc/bash.bashrc \

 && echo 'export PATH=$PATH:$GOROOT/bin' >> /etc/bash.bashrc

 

# Upgrade pip2

# Note: use pip2 specific version so jinja2 2.10 will install

RUN python2 -m pip install -U pip==9.0.3

 

# For p4 build

RUN pip install \

        ctypesgen \

        crc16

 

# For sonic config engine testing

#( sudo chown -R 'zcdocker' /usr/local/lib/python2.7,避免产生权限问题)

RUN pip install pyangbind==0.6.0

 

 

# Note: force upgrade debian packaged jinja2, if installed

RUN pip install --force-reinstall --upgrade jinja2>=2.10

 

# For templating (requiring jinja2)

# sudo chown -R 'zcdocker' /usr/local/bin

RUN pip install j2cli

 

# For sonic utilities testing

RUN pip install click-default-group click natsort tabulate

 

# For supervisor build

RUN pip install meld3 mock

 

# Install dependencies for isc-dhcp-relay build

RUN apt-get -y build-dep isc-dhcp

 

# Install vim

RUN apt-get install -y vim

 

# Install rsyslog

RUN apt-get install -y rsyslog

 

RUN cd /usr/src/gtest && cmake . && make -C /usr/src/gtest

 

RUN mkdir /var/run/sshd

EXPOSE 22

#EXPOSE用来指定端口,使容器内的应用可以通过端口和外界交互。

 

# Install depot-tools (for git-retry)

RUN

# echo "/etc/init.d/polipo start" &&\

#git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git /usr/share/depot_tools &&\

#echo "/etc/init.d/polipo stop"

ENV PATH /usr/share/depot_tools:$PATH

#设置环境变量

 

# Install docker engine 17.03.2~ce-0 inside docker and enable experimental feature

RUN apt-get update

RUN apt-get install -y \

           apt-transport-https \

           ca-certificates \

           curl \

           gnupg2 \

           software-properties-common

RUN curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -

RUN add-apt-repository \

           "deb [arch=amd64] https://download.docker.com/linux/debian \

           $(lsb_release -cs) \

           stable"

RUN apt-get update

RUN apt-get install -y docker-ce=17.03.2~ce-0~debian-jessie

RUN echo "DOCKER_OPTS=\"--experimental\"" >> /etc/default/docker

 

 

 

 

三.相关DOCKERFILE命令

 

Docker 容器镜像删除

1.停止所有的container,这样才能够删除其中的images

docker stop $(docker ps -a -q)

如果想要删除所有container的话再加一个指令:

docker rm $(docker ps -a -q)

2.查看当前有些什么images

docker images

3.删除images,通过imageid来指定删除谁

docker rmi <image id>

想要删除untagged images,也就是那些id<None>image的话可以用

docker rmi $(docker images | grep "^<none>" | awk "{print $3}")

要删除全部image的话

docker rmi $(docker images -q)

 

 

docker image --tree #查看镜像的依赖关系

 

 

卸载Docker

sudo apt-get remove docker docker-engine

卸载Docker后,/var/lib/docker/目录下会保留原Docker的镜像,网络,存储卷等文件. 如果需要全新安装Docker,需要删除/var/lib/docker/目录

rm -fr /var/lib/docker/

 

 

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/weixin_38266076/article/details/81624021