目录

  • Docker file
  • Docker file 构建过程解析
  • 内容基础知识
  • Docker file的大致流程
  • 小总结
  • Docker File体系解析
  • FROM
  • MAINTAINER
  • RUN
  • EXPOSE
  • WORKDIR
  • ENV
  • ADD
  • COPY
  • VOLUME
  • CMD
  • ENTRYPOINT
  • ONBUILD
  • 小总结
  • 案例
  • Base(scratch)
  • 自定义镜像mycentos
  • 1、拉去centos基础镜像
  • 2、编写dockerfile文件
  • 3、通过dockerfile来创建镜像
  • CMD/ENTRYPOINT样例
  • CMD
  • ENTRYPOINT
  • 注意:关于ENTRYPOINT指定-i参数不会打印首部问题分析


Docker file

Docker file 构建过程解析

内容基础知识

  1. 每条保留字指令都必须为大写且后要跟随至少一个参数
  2. 指令按照从上到下,顺序执行
  3. #表示注释
  4. 每条指令都会创建一个新的镜像层,并对镜像层进行提交

Docker file的大致流程

  1. docker从基础镜像运行一个容器
  2. 执行一条指令并对容器做出修改
  3. 执行类似docker commit的操作提交一个新的镜像层
  4. docker在基于刚提交的镜像运行一个新容器
  5. 执行docker file中的下一条指令知道所有指令都执行完成

小总结

从应用软件角度来看,Docker file、docker镜像、docker容器分别代表三个不同阶段

  • docker file是软件的原材料
  • docker镜像是软件的交付品
  • docker容器则可以认定为是软件的运行状态

Docker file面向开发,Docker镜像面向交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。

Docker File体系解析

FROM

基础镜像,当前镜像是基于那个镜像的

MAINTAINER

镜像维护者的姓名和邮箱地址

RUN

容器构建时需要运行的命令

EXPOSE

当前容器对外暴露出的端口

WORKDIR

指定在创建容器后,终端默认登进来的工作目录,一个落脚点

ENV

用来构建镜像过程中这还环境变量

ADD

将宿主机目录下的文件拷贝进镜像切ADD命令会自动处理URI和解压tar压缩包

COPY

类似ADD,拷贝文件和目录到镜像中

将从构建上下文目录中<源路径>的文件、目录复制到新的一层的镜像内的<目标路径>位置

COPY src dest

COPY [“src”,“dest”]

VOLUME

容器数据卷,用于数据保存和持久化工作

CMD

指定一个容器启东市要运行的命令

Dcoker file中可以有多个CMD指令,但只有最后一个会生效,CMD会被dcoekr run 之后的参数替换

ENTRYPOINT

指定一个容器启动时要运行的命令

  1. 和CMD的目的一样,都是在指定容器启动程序及参数
  2. ENTRYPOINT对参数的处理方式----追加

ONBUILD

当构建一个呗集成的Docker file时运行命令,父镜像在被自继承后父镜像的onbulid被触发

sql中的类似于触发器

小总结

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ayw9By11-1574145664626)(imgs/Docker File体系解析.png)]

案例

Base(scratch)

Docker Hub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的

自定义镜像mycentos

1、拉去centos基础镜像
docker pull centos
2、编写dockerfile文件
#基础镜像
FROM centos
#指定环境变量
ENV MYPATH /usr/local
#指定工作目录
WORKDIR $MYPATH

#容器构建时 给镜像安装vim和net-tools
RUN yum -y install vim
RUN yum -y install net-tools

#设置暴露的端口号
EXPOSE 80

#执行/bin/bash命令
CMD /bin/bash
3、通过dockerfile来创建镜像
#切记最后的小数点。代表当前目录
docker build -f dockerfile -t mycentos:1.4 .
root@instance-3iyah5yw:/usr/local/etc/docker# docker build -f dockerfile -t mycentos:1.4 .
Sending build context to Docker daemon 2.048kB
 Step 1/8 : FROM centos
 —> 0f3e07c0138f
 Step 2/8 : MAINTAINER ZYH534956355@qq.com —> Using cache
 —> 9aa3e19cade6
 Step 3/8 : ENV MYPATH /usr/local
 —> Using cache
 —> 66a7962da9bd
 Step 4/8 : WORKDIR $MYPATH
 —> Using cache
 —> 829dd5bd8659
 Step 5/8 : RUN yum -y install vim
 —> Using cache
 —> ffe3729013f7
 Step 6/8 : RUN yum -y install net-tools
 —> Using cache
 —> e466b2b281fb
 Step 7/8 : EXPOSE 80
 —> Using cache
 —> 8c957dc7ed86
 Step 8/8 : CMD /bin/bash
 —> Running in f22670e97535
 Removing intermediate container f22670e97535
 —> 4c6efdd5cf26
 Successfully built 4c6efdd5cf26
 Successfully tagged mycentos:1.4

CMD/ENTRYPOINT样例

CMD

docekrfile

FROM centos
RUN yum -y install curl
CMD curl -s www.baidu.com
root@instance-3iyah5yw:/usr/local/etc/docker# docker build -f dockerfile2 -t mycentos:1.5 .
 Sending build context to Docker daemon 3.072kB
 Step 1/3 : FROM centos
 —> 0f3e07c0138f
 Step 2/3 : RUN yum -y install curl
 —> Running in a16376fe0c3d
 CentOS-8 - AppStream 1.6 MB/s | 6.3 MB 00:03
 CentOS-8 - Base 878 kB/s | 7.9 MB 00:09
 CentOS-8 - Extras 850 B/s | 2.1 kB 00:02
 Package curl-7.61.1-8.el8.x86_64 is already installed.
 Dependencies resolved.
 Nothing to do.
 Complete!
 Removing intermediate container a16376fe0c3d
 —> 60f970ccefe2
 Step 3/3 : CMD curl -s www.baidu.com
 —> Running in 1aae837bff1b
 Removing intermediate container 1aae837bff1b
 —> 2d69db12c750
 Successfully built 2d69db12c750
 Successfully tagged mycentos:1.5
 root@instance-3iyah5yw:/usr/local/etc/docker#

启动容器不加命令

root@instance-3iyah5yw:/usr/local/etc/docker# docker run -it mycentos:1.5

root@instance-3iyah5yw:/usr/local/etc/docker#


启动加命令

root@instance-3iyah5yw:/usr/local/etc/docker# docker run -it mycentos:1.5 -i
 docker: Error response from daemon: OCI runtime create failed: container_linux.go:346: starting container process caused “exec: “-i”: executable file not found in $PATH”: unknown.
 root@instance-3iyah5yw:/usr/local/etc/docker#root@instance-3iyah5yw:/usr/local/etc/docker# docker run -it mycentos:1.5 /bin/bash
 [root@6cd2b123f6ef /]# ls
 bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
 [root@6cd2b123f6ef /]# ls
 bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
 [root@6cd2b123f6ef /]# exit
 exit
 root@instance-3iyah5yw:/usr/local/etc/docker#

总结

  • 当创建容器时不带命令时
    执行CMD指定的命令
  • 当创建容器带命令时
    则覆盖docker file中的CMD命令

即CMD只执行最新的一个命令

ENTRYPOINT

dockerfile

FROM centos
RUN yum -y install curl
#
#
ENTRYPOINT ["curl","-s","www.baidu.com"]
注意:关于ENTRYPOINT指定-i参数不会打印首部问题分析

使用ENTRYPOINT时指定参数时相当于加载参数中

ENTRYPOINT ["curl","-s","www.baidu.com"]

指定参数-i时,实际执行中,会将其变更为

ENTRYPOINT ["curl","-s","-i","www.baidu.com"]

如果使用 shell 格式的话,实际的命令会被包装为 sh -c 的参数的形式进行执行。比如:

CMD echo $HOME

在实际执行中,会将其变更为:

CMD [ "sh", "-c", "echo $HOME" ]

如果使用ENTRYPOINT时使用 curl -s www.baidu.com则会被转化为["curl" "-s" "-i" "www.baidu.com"]

可以通过docker history --no-trunc mycentos:1.8查看

root@instance-3iyah5yw:/usr/local/etc/docker# docker history --no-trunc mycentos:1.6
 IMAGE CREATED CREATED BY SIZE COMMENT
 sha256:b94448dd001f04a3fe49c7a254a042c64a76b2729e5a1e7700ac351cfa080730 40 minutes ago /bin/sh -c #(nop) ENTRYPOINT ["/bin/sh" “-c” “curl -s www.baidu.com”] 0B
 sha256:60f970ccefe25df8bb2e5b3e12ee311bdf5ed696182751880e5ecabd58a77a38 About an hour ago /bin/sh -c yum -y install curl 29.6MB
 sha256:0f3e07c0138fbe05abcb7a9cc7d63d9bd4c980c3f61fea5efa32e7c4217ef4da 6 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
 6 weeks ago /bin/sh -c #(nop) LABEL org.label-schema.schema-version=1.0 org.label-schema.name=CentOS Base Image org.label-schema.vendor=CentOS org.label-schema.license=GPLv2 org.label-schema.build-date=20190927 0B
 6 weeks ago /bin/sh -c #(nop) ADD file:d6fdacc1972df524a795bd36cf75dd355faefbe9a69d88d1fff95599e2eeed4c in / 220MB
 root@instance-3iyah5yw:/usr/local/etc/docker#

所以这事加 -i 没有打印首部信息

不带参数

root@instance-3iyah5yw:/usr/local/etc/docker# docker run -it mycentos:1.6
root@instance-3iyah5yw:/usr/local/etc/docker#

带参数

root@instance-3iyah5yw:/usr/local/etc/docker# docker run -it mycentos:1.7 -i
 HTTP/1.1 200 OK
 Accept-Ranges: bytes
 Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
 Connection: Keep-Alive
 Content-Length: 2381
 Content-Type: text/html
 Date: Sun, 17 Nov 2019 09:40:11 GMT
 Etag: “588604c8-94d”
 Last-Modified: Mon, 23 Jan 2017 13:27:36 GMT
 Pragma: no-cache
 Server: bfe/1.0.8.18
 Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/ 
root@instance-3iyah5yw:/usr/local/etc/docker#

总结

  • 当创建容器时不带参数时
    执行ENTRYPOINT指定的命令
  • 当创建容器带参数时
    则将参数加入ENTRYPOINT指定的命令,组合成新的命令