registry:首次基于某个镜像启动容器,当宿主机上并不存在需要的镜像,这时docker就会从registry中下载,registry用以保存docker镜像,包括镜像层次结构和元数据,类似于git仓库。用户可以自己搭建,也可以用官方的,比如docker hub。registry即为repository的集合;
repository:由具有某个功能的docker镜像的所有迭代版本构成的镜像组,比如repository名为centos的镜像组下面包含centos多个版本的镜像;
manifest:主要存在于registry中作为docker镜像的元数据文件,在镜像被pull到docker宿主机时,manifest被转化为本地的镜像配置文件config
image:用来存放一组镜像相关的元数据信息,主要包括镜像的架构、默认配置信息、构建镜像的容器配置信息、历史构建容器信息以及关联的所有镜像层的diffid信息
layer:docker镜像采用分层的方式构建,每个镜像都由一系列的镜像层组成。当修改容器内的某个文件时,只对容器的可读层进行变动,下面的只读层保留原始版本不变。同个layer可以在不同的容器间共享
2.镜像管理模块相关的目录介绍(下面是以overlay2镜像驱动为例的目录说明)/var/lib/docker/image/overlay2/
|-distribution #存放只读镜像层的digestid和diffid对应关系
|-layerdb #存放镜像层元数据
|--mounts
|---[容器ID] #以容器id为目录名,目录下存放可读写层的id和init层的id(mountid和intid)
|--sha256
|---[chainID] #以chainid为目录名,目录下存放只读层的cacheid(对应镜像层id)、parent(所属父层镜像的chainid)、diffid(基于差分内容计算得出),如果目录下没有parent,就说明这是最底层的镜像层
|-imagedb #存放镜像元数据
|--content
|---sha256
|----[镜像ID] #以镜像id为文件名,里面存放镜像的元数据,包含基于该镜像产生的镜像层diffID
|-repositories.json #镜像组
/var/lib/docker/overlay2/[cacheid]或[mountid]或[initid] #以cacheid、mountid、initid为目录,存放每个镜像层的镜像文件,包括只读层、容器的可读写层以及初始化层
|-diff(差分信息)
|-link (该层的标识ID)
|-lower(该层下面关联的所有镜像层)
|-merged(处于运行状态的容器才会有,容器挂载点,给用户暴露统一视角)
|-work(文件系统的工作基础目录)
a.当从registry pull golang镜像到宿主机时
查看该镜像的image id为76199a964a3f:
[root@localhost sha256]# docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE nginx_test latest 482202b2c6d5 4 days ago 142MB golang latest 76199a964a3f 12 days ago 964MB
/var/lib/docker/image/overlay2/imagedb/content/sha256目录下会存放该镜像的元数据:
[root@localhost sha256]# ll total 32 -rw-------. 1 root root 7656 Jun 7 00:11 0e901e68141fd02f237cf63eb842529f8a9500636a9419e3cf4fb986b8fe3d5d -rw-------. 1 root root 7661 Jun 10 04:17 482202b2c6d5d85a26eff97e1017fc06579e5aee8ec2d143372e851d02aa8768 -rw-------. 1 root root 2142 Jun 13 23:39 5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6 -rw-------. 1 root root 7104 Jun 7 00:16 76199a964a3fc66e31bda713381e92285f479fe8e3d4514a473f95ffc2062440
查看该镜像的元数据信息:
[root@localhost sha256]# cat 76199a964a3fc66e31bda713381e92285f479fe8e3d4514a473f95ffc2062440
在元数据信息的diff_ids里面就是pull下来的镜像的镜像层diffid,这里可以看出golang镜像有7层
"os":"linux","rootfs":{"type":"layers","diff_ids":["sha256:e7597c345c2eb11bce09b055d7c167c526077d7c65f69a7f3c6150ffe3f557ea","sha256:7dbadf2b9bd82a7447533776d0c8de6687cfcf241d3aa993ed8a86ad1347c6e0","sha256:9177197c67d08b25357b0b5ba8f7b944f321970dddbbe93b36cb726e9bdfd678","sha256:ee509ed6e976cdad5adda963902f78e442ea5fc05f955bd2c2c9026789f84b42","sha256:aa12cb66a67384af5792910e2c2c42552a9f327e6f394fc31b3c4b8981920aa8","sha256:93577ba442d7770f113eb666c2a298d1dad4743969350280e473ecb2e9e8fe25","sha256:7d251f26bba565388a4823dd6752d7e6846abcfa4a700556384eb5b6abd35812"]
在/var/lib/docker/image/overlay2/layerdb/sha256下,找到其中一个镜像层的目录,查看cacheid,
该目录里面没有parent文件,说明该层是镜像的最底层
[root@localhost sha256]# ll | grep "e759" drwx------. 2 root root 71 Jun 7 00:11 e7597c345c2eb11bce09b055d7c167c526077d7c65f69a7f3c6150ffe3f557ea [root@localhost e7597c345c2eb11bce09b055d7c167c526077d7c65f69a7f3c6150ffe3f557ea]# ll total 416 -rw-r--r--. 1 root root 64 Jun 7 00:11 cache-id -rw-r--r--. 1 root root 71 Jun 7 00:11 diff -rw-r--r--. 1 root root 9 Jun 7 00:11 size -rw-r--r--. 1 root root 410541 Jun 7 00:11 tar-split.json.gz [root@localhost e7597c345c2eb11bce09b055d7c167c526077d7c65f69a7f3c6150ffe3f557ea]# cat cache-id d77b695035cb31748a02711805b33b83c9e42114e9993256722f6c40383d3310
根据cacheid去/var/lib/docker/overlay2/目录下,diff里面存放了该镜像层的镜像文件
[root@localhost overlay2]# ll |grep "d77b" drwx--x---. 3 root root 47 Jun 7 00:11 d77b695035cb31748a02711805b33b83c9e42114e9993256722f6c40383d3310 [root@localhost overlay2]# cd d77b695035cb31748a02711805b33b83c9e42114e9993256722f6c40383d3310/ [root@localhost d77b695035cb31748a02711805b33b83c9e42114e9993256722f6c40383d3310]# ll total 4 -rw-------. 1 root root 0 Jun 7 00:11 committed drwxr-xr-x. 21 root root 224 Jun 7 00:11 diff -rw-r--r--. 1 root root 26 Jun 7 00:11 link
同时,/var/lib/docker/image/overlay2/distribution/diffid-by-digest/sha256目录下会存放只读镜像层的digestid和diffid的对应关系(注意:docker commit 制作的镜像,产生的镜像层不会有digestid,因为digestid是用于从registry拉取镜像时候用的,而该镜像层并不在registry里面)
[root@localhost sha256]# grep "e759" . -r -n ./e756f3fdd6a378aa16205b0f75d178b7532b110e86be7659004fc6a21183226c:1:sha256:e7597c345c2eb11bce09b055d7c167c526077d7c65f69a7f3c6150ffe3f557ea [root@localhost sha256]# pwd /var/lib/docker/image/overlay2/distribution/diffid-by-digest/sha256
b.基于 golang镜像创建容器时
创建容器后,查看容器id
[root@localhost mounts]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2f3c49bb7a52 golang "bash" 16 seconds ago Exited (0) 16 seconds ago golangtest
mounts目录下会新建个该容器的目录,里面存放内容如下:
[root@localhost mounts]# pwd /var/lib/docker/image/overlay2/layerdb/mounts [root@localhost mounts]# ll | grep "2f3c49bb7a52" drwxr-xr-x. 2 root root 51 Jun 14 10:45 2f3c49bb7a522cbe9a592fffc389e94d98848cf86ae3fd81aca8b1440d8cadd9 [root@localhost mounts]# cd 2f3c49bb7a522cbe9a592fffc389e94d98848cf86ae3fd81aca8b1440d8cadd9/ [root@localhost 2f3c49bb7a522cbe9a592fffc389e94d98848cf86ae3fd81aca8b1440d8cadd9]# ll total 12 -rw-r--r--. 1 root root 69 Jun 14 10:45 init-id -rw-r--r--. 1 root root 64 Jun 14 10:45 mount-id -rw-r--r--. 1 root root 71 Jun 14 10:45 parent [root@localhost 2f3c49bb7a522cbe9a592fffc389e94d98848cf86ae3fd81aca8b1440d8cadd9]# cat init-id da569d8a57e6a5991c2a61f8ee6df31ed4dedea4f366227f9205f20684225c1a-init [root@localhost 2f3c49bb7a522cbe9a592fffc389e94d98848cf86ae3fd81aca8b1440d8cadd9]# cat mount-id da569d8a57e6a5991c2a61f8ee6df31ed4dedea4f366227f9205f20684225c1a
根据mount-id和init-id去overlay2目录下,查看容器镜像层的信息,lower里面记录了该层下面关联的所有镜像层,且diff里面存放了该层的所有文件
[root@localhost overlay2]# pwd /var/lib/docker/overlay2 [root@localhost overlay2]# ll | grep "da569d8a57e6a59" drwx--x---. 4 root root 55 Jun 14 10:45 da569d8a57e6a5991c2a61f8ee6df31ed4dedea4f366227f9205f20684225c1a drwx--x---. 4 root root 72 Jun 14 10:45 da569d8a57e6a5991c2a61f8ee6df31ed4dedea4f366227f9205f20684225c1a-init [root@localhost overlay2]# cd da569d8a57e6a5991c2a61f8ee6df31ed4dedea4f366227f9205f20684225c1a [root@localhost da569d8a57e6a5991c2a61f8ee6df31ed4dedea4f366227f9205f20684225c1a]# ll total 8 drwxr-xr-x. 2 root root 6 Jun 14 10:45 diff -rw-r--r--. 1 root root 26 Jun 14 10:45 link -rw-r--r--. 1 root root 231 Jun 14 10:45 lower drwx------. 3 root root 18 Jun 14 10:45 work [root@localhost da569d8a57e6a5991c2a61f8ee6df31ed4dedea4f366227f9205f20684225c1a]# cat link QNWR2GFHDOC2OMTXHQR22GEM2O [root@localhost da569d8a57e6a5991c2a61f8ee6df31ed4dedea4f366227f9205f20684225c1a]# cat lower l/3OMUEBST375BBJNYMRAAWZCRBD:l/DSLFQOAMZ372NDYJS3YLONZOBQ:l/PS2ZHNTZ6XZI322H644PZSX7EO:l/YCUICCRYL42LJCN673FNIWH6IG:l/3N3O25PL4BWDNCCPQDYSEXDSBL:l/CQU65LQURWQRP42RGK2I3POG7N:l/IZH2VIYZMQTXQ5EFW33ZQJSNNX:l/SZQ3RUXF2LQQTNWEYG2YTO74TR [root@localhost overlay2]# cd da569d8a57e6a5991c2a61f8ee6df31ed4dedea4f366227f9205f20684225c1a-init/ [root@localhost da569d8a57e6a5991c2a61f8ee6df31ed4dedea4f366227f9205f20684225c1a-init]# ll total 8 -rw-------. 1 root root 0 Jun 14 10:45 committed drwxr-xr-x. 4 root root 46 Jun 14 10:45 diff -rw-r--r--. 1 root root 26 Jun 14 10:45 link -rw-r--r--. 1 root root 202 Jun 14 10:45 lower drwx------. 3 root root 18 Jun 14 10:45 work [root@localhost da569d8a57e6a5991c2a61f8ee6df31ed4dedea4f366227f9205f20684225c1a-init]# cat link 3OMUEBST375BBJNYMRAAWZCRBD [root@localhost da569d8a57e6a5991c2a61f8ee6df31ed4dedea4f366227f9205f20684225c1a-init]# cat lower l/DSLFQOAMZ372NDYJS3YLONZOBQ:l/PS2ZHNTZ6XZI322H644PZSX7EO:l/YCUICCRYL42LJCN673FNIWH6IG:l/3N3O25PL4BWDNCCPQDYSEXDSBL:l/CQU65LQURWQRP42RGK2I3POG7N:l/IZH2VIYZMQTXQ5EFW33ZQJSNNX:l/SZQ3RUXF2LQQTNWEYG2YTO74TR
当容器处于运行状态时,mount镜像层目录下会出现merged目录,实现各镜像层的联合挂载,屏蔽老数据,向用户展示可读写层的新数据
[root@localhost da569d8a57e6a5991c2a61f8ee6df31ed4dedea4f366227f9205f20684225c1a]# ll total 8 drwxr-xr-x. 5 root root 40 Jun 10 04:20 diff -rw-r--r--. 1 root root 26 Jun 10 04:20 link -rw-r--r--. 1 root root 231 Jun 10 04:20 lower drwxr-xr-x. 1 root root 40 Jun 10 04:20 merged drwx------. 3 root root 18 Jun 10 04:20 work
结尾:相信通过上面目录介绍,以及结合实际使用案例分析数据的产生,大家对镜像管理模块的构成、graphdriver镜像驱动的功能都有了一定的认识。



