Dockerfile
- dockflie框架
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-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 886d6a43533e(Using 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命令
1.停止所有的container,这样才能够删除其中的images:
docker stop $(docker ps -a -q)
如果想要删除所有container的话再加一个指令:
docker rm $(docker ps -a -q)
2.查看当前有些什么images
docker images
3.删除images,通过image的id来指定删除谁
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/