Dockers镜像分层
更新:HHH   时间:2023-1-7


Dockers镜像分层

1,Dockers的最小镜像

[root@localhost ~]# docker pull hello-world
//下载一个最小的镜像
[root@localhost ~]# docker images
//查看镜像

[root@localhost ~]# docker run hello-world
//运行一下hello-world (里面是一个文本对docker运行的简单介绍)


dockerfile的组成
1)FROM:scratch(抓、挠)
2)COPY:hello /
3)CMD:[“/hello”]
FROM

 语法:FROM <image>[:<tag>]
 解释:设置要制作的镜像基于哪个镜像,FROM指令必须是整个Dockerfile的第一个指令,如果指定的镜像不存在默认会自动从Docker Hub上下载。

COPY

  语法:COPY <src> <dest>
  解释:用法与ADD相同,不过<src>不支持使用url,所以在使用docker build – < somefile时该指令不能使用。

CMD

  语法:①CMD ["executable", "param1", "param2"]    #将会调用exec执行,首选方式
      ②CMD ["param1", "param2"]        #当使用ENTRYPOINT指令时,为该指令传递默认参数
      ③CMD <command> [ <param1>|<param2> ]        #将会调用/bin/sh -c执行
  解释:CMD指令中指定的命令会在镜像运行时执行,在Dockerfile中只能存在一个,如果使用了多个CMD指令,则只有最后一个CMD指令有效。当出现ENTRYPOINT指令时,CMD中定义的内容会作为ENTRYPOINT指令的默认参数,也就是说可以使用CMD指令给ENTRYPOINT传递参数。
  注意:RUN和CMD都是执行命令,他们的差异在于RUN中定义的命令会在执行docker build命令创建镜像时执行,而CMD中定义的命令会在执行docker run命令运行镜像时执行,另外使用第一种语法也就是调用exec执行时,命令必须为绝对路径。

2、Base镜像(基础镜像
Centos:7镜像的dockerfile

FROM scratch

ADD centos-7-x86_ _64-docker.tar.xz /

LABEL org. label-schema. schema-version="1.0" \|
org. label-schema. name="Centos Base Image" \
org. labe1-schema. vendor="centos" \
org. labe1-schema. 1icense="GPLV2" \
org. labe1-schema build-date="20190305 '

CMD ["/bin/bash"]

3、镜像的分层
1)dockerfile的书写格式为:Dockerfile(首字母大写,包括文件名称)
2)From:构建镜像有两种方式,一种scratch(从零构建),另一种可以基于某个镜像开始构建
3)镜像所运行的操作(用户所期望的)

[root@localhost ~]# mkdir test
//创建测试目录
[root@localhost ~]# cd test
//进入测试目录
[root@localhost ~]#vim Dockerfile
//编写Dockerfile
FROM centos:7  
RUN yum -y install vim  #或["yum","install","vim"]
RUN yum -y install net-tools
CMD ["/bin/bash"]

执行一下

[root@localhost test]# docker build -t centos7-vim-net-tools:12-11 .
//使用当前目录的 Dockerfile 创建镜像,标签为 centos7-vim-net-tools:12-11
build: 使用 Dockerfile 创建镜像
-t:标签
. :当前目录

执行的层次

4.Dockerfile镜像分层总结
镜像时容器的基石,容器是镜像运行后的实例。当镜像运行为容器之后,对镜像的所有数据仅有只读权限,如果需要对镜像源文件进行修改或删除操作,此时是在容器层(可写层)进行的,用到了COW(copy on write)写时复制机制。

Docker镜像的缓存特性

1.创建一个新的Dockerfile文件

[root@localhost ~]# vim Dockerfile
FROM centos:7
RUN yum -y install vim
RUN yum -y install net-tools
RUN yum -y install wget
CMD ["/bin/bash"]
[root@localhost ~]# docker build -t new-centos .
//使用当前目录的 Dockerfile 创建镜像,名称为new-centos


如果在相同的层,有用到相同的镜像,可以不必再去下载,直接使用缓存。(如果第一层的不相同了,那么下面的相同也没用了,需要重新下载)

3.再次创建一个新的Dockerfile

[root@localhost ~]# mkdir test1
[root@localhost ~]# cd test
[root@localhost test]# cd ../test1
[root@localhost test1]# vim Dockerfile
FROM centos:7
RUN yum -y install vim
RUN yum -y install wget
RUN yum -y install net-tools
CMD ["/bin/bash"]
[root@localhost test1]# docker build -t centos-new .
//使用当前目录的 Dockerfile 创建镜像,名称为centos-new


即使镜像层里的操作一样,也必须是在同一层才可以使用dockerfile的缓存特性
如果制作镜像过程中,不想使用缓存,可以--no-cache选项

返回云计算教程...