栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Docker原理简述(二)

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Docker原理简述(二)

本篇文章主要是对镜像管理模块说明 1.首先了解几个关键概念

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(文件系统的工作基础目录)

3.镜像上传以及容器运行时镜像管理目录数据的变化

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镜像驱动的功能都有了一定的认识。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/972549.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号