docker pull拉取镜像原理_Dockerfile镜像细节

原文:https://blog.csdn.net/weixin_31244053/article/details/112206093

docker pull nginx:1.13 # 观察下面拉取进度条有几个


Trying to pull repository docker.io/library/nginx ... 
1.13: Pulling from docker.io/library/nginx
f2aa67a397c4: Pull complete 
3c091c23e29d: Pull complete 
4a99993b8636: Pull complete 
Digest: sha256:b1d09e9718890e6ebbbd2bc319ef1611559e30ce1b6f56b2e3b479d9da51dc35
Status: Downloaded newer image for docker.io/nginx:1.13

docker history nginx:1.13 # 查看多少层


IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
ae513a47849c        2 years ago         /bin/sh -c #(nop)  CMD ["nginx" "-g" "daem...   0 B                 
          2 years ago         /bin/sh -c #(nop)  STOPSIGNAL [SIGTERM]         0 B                 
          2 years ago         /bin/sh -c #(nop)  EXPOSE 80/tcp                0 B                 
          2 years ago         /bin/sh -c ln -sf /dev/stdout /var/log/ngi...   22 B                
          2 years ago         /bin/sh -c set -x  && apt-get update  && a...   53.7 MB             
          2 years ago         /bin/sh -c #(nop)  ENV NJS_VERSION=1.13.12...   0 B                 
          2 years ago         /bin/sh -c #(nop)  ENV NGINX_VERSION=1.13....   0 B                 
          2 years ago         /bin/sh -c #(nop)  LABEL maintainer=NGINX ...   0 B                 
          2 years ago         /bin/sh -c #(nop)  CMD ["bash"]                 0 B                 
          2 years ago         /bin/sh -c #(nop) ADD file:ec5be7eec56a749...   55.3 MB  

# 因为其他的层没有大熊 所以最终的进度条只有两个  但是   dockerfile的命令确实是有这么多  

# 还可以发现一点:Dockerfile有多少条命令,那就有多少个镜像层(不信你数数)

---------------下面是docker镜像和dockerfile深入的一些原理 有兴趣可以看看

 

三、Docker镜像的特点

关于Docker镜像,有以下特点:

  • Dockerfile生成
  • 呈现层级结构
  • 每层镜像包含:镜像文件以及镜像json元数据信息

 

docker pull拉取镜像原理_Dockerfile镜像细节_第1张图片

图像来源: http:// open.daocloud.io/allen- tan-docker-xi-lie-zhi-shen-ke-li-jie-docker-jing-xiang-da-xiao/

3.1镜像呈现层级结构

联合文件系统(UnionFS)是实现Docker镜像的技术基础。在Docker中一般使用是AUFS(Another Union File System或Advanced Multilayered Unification File System)【具体还是得看宿主机用的什么系统】。

在搜索中文资料的时候,常常会发现有类似的解释:

“AUFS是一种 Union FS, 简单来说就是“支持将不同目录挂载到同一个虚拟文件系统下的文件系统”, AUFS支持为每一个成员目录设定只读(Rreadonly)、读写(Readwrite)和写(Whiteout-able)权限。Union FS 可以将一个Readonly的Branch和一个Writeable的Branch联合在一起挂载在同一个文件系统下”。

看得我一头雾水....后来去官方文档介绍AUFS:

AUFS is a union filesystem, which means that it layers multiple directories on a single Linux host and presents them as a single directory. These directories are called branches in AUFS terminology, and layers in Docker terminology

说白了,还是可以理解成:Docker的镜像的基础是联合文件系统,它支持将文件系统中的修改信息作为一次提交,并层层叠加,外界看到的是最外层的镜像。(比如外界只看到Tomcat镜像,而中间叠加了很多层镜像)

(这里只是拿AUFS说明,Docker实际上支持很多存储驱动,比如还有devicemapper,overlay2(Ubuntu的14.04.4或更高版本,16.04或更高版本), overlay,zfs

  • https://docs.docker-cn.com/engine/userguide/storagedriver/selectadriver/

3.1.1镜像继承(共享)

Docker镜像可以通过分层来进行继承

例如,hello-world的Dockerfile镜像FROM scratch镜像,scratch在Docker中是一个基础镜像

 
  1. FROM scratch

  2. COPY hello /

  3. CMD ["/hello"]

Centos的Dockerfile镜像也是FROM scratch镜像:

 
  1. FROM scratch

  2. ADD centos-7-docker.tar.xz /

  3.  
  4. LABEL org.label-schema.schema-version="1.0"

  5. org.label-schema.name="CentOS Base Image"

  6. org.label-schema.vendor="CentOS"

  7. org.label-schema.license="GPLv2"

  8. org.label-schema.build-date="20181205"

  9.  
  10. CMD ["/bin/bash"]

那么Centos镜像和hello-world共享同一个基础镜像层scratch,提高了存储效率

再说个例子,比如我们有一个Centos镜像,这个镜像大小是202M。然后,我们基于Centos镜像手动往里边添加一个Tomcat(假设这个Tomcat的大小是300M),生成一个镜像,总大小就是502M了。

如果仅仅是单纯的累加这两个镜像的大小:202M+502M=704M,但是由于镜像复用的存在,实际占用的磁盘空间大小是:202M+300M=502M

AUFS uses the Copy-on-Write (CoW) strategy to maximize storage efficiency and minimize overhead。

如果想要了解COW,不妨阅读我之前写过的文章:

  • COW奶牛!Copy On Write机制了解一下
  • CopyOnWriteArrayList你都不知道,怎么拿offer?

3.2json文件

Docker每一层镜像的json文件,都扮演着一个非常重要的角色,其主要的作用如下:

  • 记录 Docker 镜像中与容器动态信息相关的内容
  • 记录父子 Docker 镜像之间真实的差异关系
  • 弥补 Docker 镜像内容的完整性与动态内容的缺失

Docker镜像的json文件可以认为是镜像的元数据信息

最后

今天简单地聊了一下Docker镜像的一些细节,但没去深入了解,想要继续深入的同学还得通过官方文档等途径去学习哈。

参考资料:

  • Allen 谈 Docker
    • http://open.daocloud.io/tag/allen-tan-docker/
  • 官方文档介绍AUFS
    • https://docs.docker-cn.com/engine/userguide/storagedriver/aufs-driver/#example-image-and-container-on-disk-constructs
  • Docker核心实现技术(命名空间&控制组&联合文件系统&Linux网络虚拟化支持)
    • https://www.cnblogs.com/wade-luffy/p/6589254.html#_label3
  • Docker联合文件系统Union File System
    • http://www.dockerinfo.net/1753.html

 

你可能感兴趣的:(docker)