一 Docker镜像的创立
创立镜像有三种办法,分别为【依据已有镜像创立】、【依据本地模板创立】以及【依据Dockerfile创立】。
1.1 依据现有镜像创立
1)docker export 导出
先创立一个容器,然后登录容器以后写入数据,之后运用docker export导出镜像成压缩包,能够迁移,或许直接导入运用
2)将修正后的容器提交为新的镜像,需求运用该容器的ID号创立新镜像
常用选项
选项 | 意义 |
---|---|
-m | 阐明信息 |
-a | 作者信息 |
-p | 生成进程中中止容器的运转 |
1.2 依据本地模板创立
经过导入操作体系模板文件能够生成镜像,模板能够从OPENVZ 开源项目下载,下载地址为:
openvz.org/Download/te…
#模板里边便是运用docker export 指令导出的容器文件
#下载模板
wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
#导入为镜像,两种办法
cat debian-7.0-x86-minimal.tar.gz | docker import - debian:test #办法一
docker import debian-7.0-x86-minimal.tar.gz -- debian:test #办法二
#查看镜像
docker images
#运用导入的镜像创立容器
docker run -itd debian:test bash
docker ps -a
1.2.1 依据基本模板创立镜像运转容器(Debian体系)
1.3 依据Dockerfile 创立
1.3.1 联合文件体系(UnionFS )
UnionFS(联合文件体系): Union文件体系(UnionFS)是一种分层、轻量级而且高性能的文件体系,它支持对文件体系的修正作为一次提交来一层层的叠加,一起能够将不同目录挂载到同一个虚拟文件体系下。AUFS、overlayFS 及Devicemapper 都是一种UnionFS 。
Union文件体系是Docker镜像的根底。镜像能够经过分层来进行承继,依据根底镜像(没有父镜像),能够制作各种具体的运用镜像。
特性: 一次一起加载多个文件体系,但从外面看起来,只能看到一一个文件体系,联合加载会把各层文件体系叠加起来,这样终究的文件体系会包含一切底层的文件和目录。
咱们下载的时分看到的一层层的便是联合文件体系。
1.3.2 镜像加载原理
Docker的镜像实践上由一层一层的文件体系组成,这种层级的文件体系便是UnionFS。
bootfs
主要包含bootloader和kernel,bootloader主 要是引导加载kernel,Linux刚启 动时会加载bootfs文件体系。
在Docker镜像的最底层是bootfs,这一层 与咱们典型的Linux/Unix体系是一样的, 包含boot加载器和内核。当boot加载完结之 后整个内核就都在内存中了,此刻内存的运用权已由bootfs转交给内核,此刻体系也会卸载bootfs。
rootfs
,在bootfs之 上。包含的便是典型Linux体系中的/dev、/proc、/bin、/etc等规范目录和文件。rootfs便是各种不同的操作体系发行版,比方Ubuntu, Centos等。
咱们能够了解成一开始内核里边什么都没有,操作一个指令下载Debian,这是就会在内核上面加了一层根底镜像:在暗转一个emacs,会在根底镜像上叠加一层image:接着在装置一个Apache,又会在images上面在叠加一层image。最终它们看起来就像一个文件体系即容器的rootfs。在docker的体系里把这些rootfs叫做docker的镜像。可是,此刻的每一层rootfs都是read-only的,咱们此刻还不能对其进行操作。但咱们创立一个容器,也便是将docker镜像进行实例化,体系会在一层或是多层read-only的rootfs之上分配一层空的read-write的rootfs。
-
bootfs便是内核引导器(引导加载内核)和内核。
-
rootfs是n多个根底镜像(供给根底操作环境)和运用镜像叠加在一同的只读层。
-
运转的容器实例会在rootfs之上增加一个可读可写层。
此刻有人会说能够我能够删去镜像里边的根底目录,好接下来进行演示,并解说,来处理这个困惑。
运用的是同一个镜像进行解说
1.2.3 为什么Docker里的centos的大小才200M?
由于对于精简的OS,rootfs能够很小, 只需求包含最基本的指令、东西和程序库就能够了,由于底层直接用宿主机的kernel,自己只需求供给rootfs就能够了。由此可见对于不同的linux发行版,bootfs基本是一 致的, rootfs会 有差别,因而不同的发行版能够共用bootfs。
大部分镜像是通用的,但假如专门依据某个版别创立的镜像,在其他版别的操作体系中运转可能会有问题。
1.2.4 Dockerfile
Docker镜像是一个特别的文件体系,除了供给容器运转时所需的程序、库、资源、装备等文件外,还包含了一些为运转时预备的一些装备参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
镜像的定制实践上便是定制每一层所增加的装备、文件。假如咱们能够把每一层修正 装置、构建、操作的指令都写入一个脚本, 用这个脚本来构建、定制镜像,那么镜像构建透明性的问题、体积的问题就都会处理。这个脚本便是Dockerfile。
Dockerfile是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因而每一条指令的内容,便是描绘该层应当怎么构建。有了Dockerfile, 咱们需求定制首己额定的需求时,只需在Docketlle上增加或许修正指令,重新生成image 即可,省去了敲指令的费事。便是描绘该层应当怎么构建。有了Dockerfile,当咱们需求定制自己额定的需求时,只需在Dockerfile上增加或许修正指令,重新生成image即可,省去了敲指令的费事。
除了手动生成Docker镜像之外,能够运用bockerfile主动生成镜像。Dockerfile 是由多条的指令组成的文件,其间每条指令对应Linux中的一条指令,Docker程序将读取Dockerfile中的指令生成指定镜像。
Dockerfile结构大致分为四个部分:根底镜像信息、保护者信息、镜像操作指令和容器发动时履行指令。Dockerfile每行支持一 条指令, 每条指令可带着多个参数,支持运用以“#“号开头的注释。
1.2.5 Docker镜像结构的分层
镜像不是一个单一的文件,而是有多层构成。容器其实是在镜像的最上面加了一层读写层,在运转容器里做的任何文件改动,都会写到这个读写层。假如删去了容器,也就删去了其最上面的读写层,文件改动也就丢失了。Docker运用存储驱动办理镜像每层内容及可读写层的容器层。
(1)Dockerfile中的每个指令都会创立一个新的镜像层;
(2)镜像层将被缓存和复用;
(3)当Dockerfile的指令修正了,仿制的文件变化了,或许构建镜像时指定的变量不同了,对应的镜像层缓存就会失效;
(4)某一层的镜像缓存失效,它之后的镜像层缓存都会失效;
(5)镜像层是不可变的,假如在某一层中增加一个文件,然后鄙人一层中删去它,则镜像中仍然会包含该文件,只是这个文件在Docker 容器中不可见了。
bootfs: bootfs加载器+内核,容器都是同享内核的,所以都有相同的bootfs。
rootfs只读层: rootfs能够有多层,对外表现看起来便是一个全体。
运用镜像运转一个容器实例时,就会在rootfs只读层上挂载一层可读可写层。
二 Dockerfile 操作指令的指令
Dockerfile简介:
Dockerfile其实便是咱们用来构建Docker镜像的源码,当然这不是所谓的编程源码,而是一些指令的组合,只需了解它的逻辑和语法格局,就能够编写Dockerfile了。
简单点说,Dockerfile的作用:它能够让用户个性化定制Docker镜像。由于作业环境中的需求林林总总,网络上的镜像很难满足实践的需求。
Dockerfile常见指令:
指令 | 作用 |
---|---|
FROM image_name:tag | 声明根底镜像 |
MAINTAINER user_name | 声明镜像的作者 |
ENV key value | 设置环境变量 (能够写多条) |
RUN command | 编译镜像时运转的脚本(能够写多条) |
CMD | 设置容器的发动指令 |
ENTRYPOINT | 设置容器的进口程序 |
ADD source_dir/file dest_dir/file | 将宿主机的文件仿制到镜像内,假如是一个压缩文件,将会在仿制后主动解压。支持URL途径下载源文件,但下载方式不能主动解压。 |
COPY source_dir/file dest_dir/file | 和ADD类似,将宿主机的文件仿制到镜像内,可是假如有压缩文件并不能解压。不支持URL途径下载。 |
WORKDIR path_dir | 设置作业目录 |
ARG | 设置编译镜像时加入的参数 |
VOLUMN | 设置容器的挂载卷 |
2.1 FROM 镜像
指定新镜像所依据的根底镜像,第一条指令有必要为FROM指令,每创立一-个镜像就需求一条FROM指令。
2.2 MAINTAINER 姓名
阐明新镜像的保护人信息
2.3 RUN 指令
在所依据的镜像上履行指令,并提交到新的镜像中.
尽量削减run指令的条数。
- 当指令较长时,能够运用 \ 来换行;
- 多条指令能够运用 ; 或 && 合并成一条指令,削减镜像的层数。
2.4 ENTRYPOINT
ENTRYPOINT ["要运转的程序","参数1","参数2"]
设定容器发动时第一个运转的指令及其参数。
能够经过运用指令docker run --entrypoint
来掩盖镜像中的ENTRYPOINT指令的内容。
两种格局:
exec格局(数值格局):ENTRYPOINT [“指令”,“选项”,“参数”]
shell格局:ENTRYPOINT 指令 选项 参数
前面四个指令就能够创立一个粗略的镜像。
2.5 CMD
CMD ["要运转的程序","参数1","参数2"]
发动容器时默许履行的指令或许脚本,Dockerfile只能有一条CMD指令。假如指定多条指令,只履行最终一 条指令。
假如在docker run时指定了指令或许镜像中有ENTRYPOINT,那么CMD就会被掩盖。
CMD 能够为ENTRYPOINT 指令供给默许参数。
两种格局:
exec方式:CMD [“要运转的程序”,“参数1”, “参数2”]
shell方式: CMD 指令 参数1 参数2
ENTRYPOINT和CMD共存的情形: ENTRYPOIN指定指令,CMD传参
容器运转时的优先级:
docker run –entrypoint > Dockerfile ENTRYPOINT > docker run指令> Dockerfile CMD
ENTRYPOINT和CMD的差异:
- ENTRYPOINT设定容器发动时第一个运转的指令;CMD是发动容器时默许履行的指令,假如指定多条CMD指令,只履行最终一 条指令。
- 假如在docker run时指定了指令或许镜像中有ENTRYPOINT,那么CMD就会被掩盖,而且会将CMD中的指令作为参数传给ENTRYPOINT。
- CMD能够为ENTRYPOINT进行传参。
2.6 EXPOSE 端口号
指定新镜像加载到Docker 时要开启的端口。
用于暴露端口,否则即使做了端口映射,外部也找不到。
2.7 ENV
ENV 环境变量 变量值
设置一个环境变量的值,会被后面的RUN运用。
2.8 ADD
ADD 源文件/目录 方针文件/目录
将源文件仿制到镜像的指定途径中,源文件要与 Dockerfile 位于相同目录中,或许是一个URL。(URL途径,在线途径)
有如下注意事项:
1、
假如源途径是个文件,且方针途径是以 / 结束, 则docker会把方针途径当作一个目录,会把源文件仿制到该目录下。
假如方针途径不存在,则会主动创立方针途径。
2、
假如源途径是个文件,且方针途径是不以/结束,则docker会把方针途径当作一个文件。
假如方针途径不存在,会以方针途径为名创立一个文件,内容同源文件。
假如方针文件是个存在的文件,会用源文件掩盖它,当然只是内容掩盖,文件名仍是方针文件名。
假如方针文件实践是个存在的目录,则会源文件仿制到该目录下。注意, 这种情况下,最好显示的以/结束,以防止混杂。
3、
假如源途径是个目录,且方针途径不存在,则docker会主动以方针途径创立一个目录,把源途径目录下的文件仿制进来。
假如方针途径是个现已存在的目录,则docker 会把源途径目录下的文件仿制到该目录下。
4、
假如源文件是个归档文件,则docker会主动帮解压。(解压后仿制源目录到镜像中的目录)
URL下载和解压特性不能一同运用。任何压缩文件经过URL仿制,都不会主动解压。
(不支持下载和解压一同运用,下载就不会解压。即只解压本地压缩包,不会解压下载的压缩包)
-
ADD的优点:在履行<源文件>为tar压缩文件的话,压缩格局为 gzip、bzip2以及xz的情况下,会主动仿制并解压成<方针途径>
-
ADD的缺点:在不解压的前提下,无法仿制tar压缩文件。会令镜像构建缓存失败,然后可能会令镜像构建变得比较缓慢。具体是否运用,能够依据是否需求主动解压来决定。
2.9 COPY
COPY 源文件/目录 方针文件/目录
只仿制本地主机上的文件/目录仿制到方针地点,源文件/目录要与Dockerfile在相同的目录中。
ADD和COPY比较:(相同需求下,官方推荐运用 COPY)
1、共同点:
ADD和COPY都能够仿制本地文件到镜像中。
2、差异:
ADD:假如是一个压缩文件,ADD会在仿制后主动解压。且支持URL途径下载源文件,但URL下载和解压特性不能一同运用,任何压缩文件经过URL仿制,都不会主动解压。 COPY:假如是压缩文件,COPY并不能解压。且COPY只能仿制本地文件,不支持URL途径仿制。
2.11 VOLUME [“目录”]
在容器中构建一个挂载点(即创立数据卷)
2.12 USER 用户/UID
指定运转容器时的用户。(用于切换用户)
2.13 WORKDIR 途径
为后续的RUM、CMD、ENTRYPOIDT指定作业方针。(用于切换容器中的目录)
CMD能够为ENTRYPOINT指令供给默许参数
workdir /opt #切换镜像层
run cd /opt #会增加镜像层
2.14 ONBULD 指令
指定所生成的镜像作为一个根底镜像时所要运转的指令。
当在一个Dockerfile文件中加上ONBUILD指令,该指令对利用该Dockerfile构建镜像(比方为A镜像)不会发生实质性影响。
可是当编写一个新的Dockerfile文件来依据A镜像构建一个镜像 (比方为B镜像)时,这时结构A镜像的Dockerfile文件中的ONBUILD指令就收效了,在构建B镜像的进程中,首要会履行ONBUILD指令指定的指令,然后才会履行其它指令。
(即加私货,这个指令不是给我用的,是给其他镜像用的)
2.15 AGR
设置编译镜像时加入的参数。
ARG指令,能够引用在docker build构建镜像时指定的参数,即达到引用参数的效果。
运用ENV指令界说的环境变量始终会掩盖同名的ARG指令。
ARG CONT_IMG_VER #Dockfile中指定变量名
ENV CONT_IMG_VER=v1.0.0
RUN echo $CONT_IMG_VER #AEG和ENV界说的变量名,不要重复,否则最终echo的是ENV界说的值
docker build --build-arg CONT_IMG_VER=v2.0 . #构建镜像时传入变量值
#由于AEG和ENV界说的变量名重复了,ENV指令界说的环境变量始终会掩盖同名的ARG指令,所以最终输出的是ENV界说的值。
2.16 创立镜像
编写完结Dockerfile之后,能够经过 docker build
指令来创立镜像。
基本的格局为 docker build [选项] 途径
,该指令将读取指定途径下(包含子目录)的Dockerfile,并将该途径下一切内容发送给Docker服务端,由服务端来创立镜像。因而一般建议放置Dockerfile的目录为空目录。
另外,能够经过.dockerignore文件(每一行增加一条匹配模式)来让Docker疏忽途径下的目录和文件。
要指定镜像的标签信息,能够经过-t选项。
在编写Dockerfile 时,有严厉的格局需求遵循:
- 第一行有必要运用FROM指令指明所依据的镜像称号;
- 之后运用MAINTAINER 指令阐明保护该镜像的用户信息;
- 然后是镜像操作相关指令,如RUN指令/EXPOSE/ADD/ENV/ARG等等。每运转一条指令,都会给根底镜像增加新的一层。(多条指令能够运用 ; 或 && 合并成一条指令,削减镜像的层数)
- 最终运用CMD或许ENTRYPOINT指令指定发动容器时要运转的指令操作。
三 Dockerfile案例实战
Dockerfile编写进程
1): FROM 指定根底镜像
2): MAINTAINER 指定镜像作者信息
3): RUN EXPOSE ENV ADD 等指令指定镜像构建的进程
4): CMD ENTRYPOINT 指定容器发动时运转的指令
3.1 yum源装置Apache
#指定根底镜像
FROM centos:7
#指定镜像及作者信息
MAINTAINER this is apache image <al 2022-11-27>
#镜像操作指令装置Apache软件
RUN yum -y install httpd
#暴露程序端口80
EXPOSE 80
#把本地编写好的网页文件仿制到容器镜像中的指定方位
ADD index.html /var/www/html/
#指定发动容器时第一个运转的指令,前台运转Apache
ENTRYPOINT ["/usr/sbin/apachectl"]
CMD ["-D", "FOREGROUND"]
构建Apache镜像
依据创立的镜像运转容器
3.2 编译装置Apache
预备装置包
apr-1.6.2.tar.gz
apr-util-1.6.0.tar.gz
httpd-2.4.29.tar.bz2
#指定根底镜像
FROM centos:7
#指定作者信息
MAINTAINER this is apache <al 2022-11-27>
#装置Nginx
RUN yum -y install gcc gcc-c++ make pcre pcre-devel expat-devel perl
ADD apr-1.6.2.tar.gz /opt/
ADD apr-util-1.6.0.tar.gz /opt/
ADD httpd-2.4.29.tar.bz2 /opt/
RUN mv /opt/apr-1.6.2 /opt/httpd-2.4.29/srclib/apr &&\
mv /opt/apr-util-1.6.0 /opt/httpd-2.4.29/srclib/apr-util &&\
cd /opt/httpd-2.4.29 &&\
./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi &&\
make -j3 &&\
make install
#暴露端口
EXPOSE 80
#指定容器运转时履行的指令
CMD ["/user/local/httpd/bin/apachect","-D","FOREGROUND"]
3.3 编译装置Nginx
首要预备Nginx的装置包
vim Dockerfile
#履行yum装置依靠包
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
#履行创立用户的指令
RUN useradd -M -s /sbin/nologin nginx
#解压文件到opt目录
ADD nginx-1.22.0.tar.gz /opt/
#切换作业目录
WORKDIR /opt/nginx-1.22.0/
#履行装备和编译装置
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module
RUN make
RUN make install
#让体系识别Nginx的指令
ENV PATH /usr/local/nginx/sbin:$PATH
#暴露端口
EXPOSE 80
EXPOSE 443
#指定要运转的指令
ENTRYPOINT ["/usr/local/nginx/sbin/nginx"]
CMD ["-g","daemon off;"]
一开始没有指定Nginx页面,现在想指定一个作业页面(Nginx)
-v 指定数据卷目录即可
3.4 分阶段构建容器
3.5 运用JDK的镜像构建Tomcat容器
docker pull openjdk:8-jre-alpine
FROM openjdk:8-jre-alpine
ADD apache-tomcat-9.0.16.tar.gz /opt/
EXPOSE 8080
CMD ["/opt/apache-tomcat-9.0.16/bin/catalina.sh","run"]
3.6 构建dockerfile的时间传参
vim Dockerfile
FROM centos:7
ARG INPUY_VAR
RUN echo $INPUY_VAR
docker build --build-arg INPUY_VAR=abc1234 .
3.7 ARG与ENV
ENV所输出的值,始终会掩盖ARG传入的值
3.8 VOLUME能够防止用户忘记运用-v发动容器导致容器数据的丢失
假如用户在运转容器的时分运用了-v指定了挂载目录,此刻VOLUME指令就不会收效,只要在不-v的时分起作用
四 总结
4.1 Nginx小常识
偶数版的Nginx压缩包为为稳定版,非偶数版的便是非稳定版
4.2 怎么把我的镜像体积给缩小?
- 根底镜像尽量运用轻量级最小化的镜像。
- Dockerfile中尽量把RUN指令合并在一同,削减镜像的层数(由于每一个RUN指令便是一个镜像层)。
- 多级构建(拿Dockerfile构建好的镜像再构建一次)。
4.3创立镜像
4.3.1 依据本机镜像创立
- 依据镜像docker run 运转容器,在容器中增修改的操作
- 运用指令docker commit 提交成新的镜像
4.3.2 依据容器模板文件创立
- docker export 将容器导出为模板文件
- 运用指令docker import将模板文件导入成镜像
4.3.3 依据Dockerfile构建镜像
Dockerfile结构大致分为四个部分:根底镜像信息(用from指定)、保护者信息(maintainer、镜像操作指令和容器发动时履行指令。
-
第一行有必要运用FROM指令指明所依据的镜像称号;
-
之后运用MAINTAINER 指令阐明保护该镜像的用户信息;
-
然后是镜像操作相关指令,如RUN指令/EXPOSE/ADD/ENV/ARG等等。每运转一条指令,都会给根底镜像增加新的一层。(多条指令能够运用 ; 或 && 合并成一条指令,削减镜像的层数)
-
最终运用CMD或许ENTRYPOINT指令指定发动容器时要运转的指令操作。
4.4 容器发动时运转的指令优先级
docker run --entrypoint 指令 > ENTRYPOINT 发动指令 >docker run 镜像 指令 > CMD 默许发动指令
4.5 ADD 与 COPY 的差异
- 共同点:都能仿制本地文件/目录到镜像中
- 差异:COPY只能仿制本地文件/目录,而ADD还能经过URL下载文件仿制到镜像中,ADD还有能把本地tar包解压成目录仿制到镜像的功用,但ADD不能一起把经过URL下载的tar包进行解压仿制到镜像中
4.6 镜像的文件类型
UNTONFS 联合文件体系
存储驱动 overlay2
4.7 镜像的组成
镜像由bootfs(加载内核) rootfs(镜像层、只读)两个部分组成