云原生实践

验证centos7中docker使用的overlay2文件系统

2020-11-01  本文已影响0人  万州客

这个知识点,可以慢慢咀嚼~~~

一,选一个镜像分析。

运行好好,就nginx:1.18-alpine啦。

docker images
nginx                                                    1.18-alpine         ab94f84cc474        6 months ago        21.3MB 

得到image id: ab94f84cc474

二,查看此image id由哪些layer id组成

cat /var/lib/docker/image/overlay2/imagedb/content/sha256/ab94f84cc4744a5addf3c896206e1e666abde0eadc26990d640395cfacae24a5 
{"architecture":"amd64","os":"linux","rootfs":{"type":"layers","diff_ids":["sha256:3e207b409db364b595ba862cdc12be96dcdad8e36c59a03b7b3b61c946a5741a","sha256:34cf0e74977f5cabe21fd5465978f35ec87b57ed928745a0f2054bc7e1dcbcf9"]}}

只需要留心rootfs里的diff_ids数据即可。
即两个layer id:
"sha256:3e207b409db364b595ba862cdc12be96dcdad8e36c59a03b7b3b61c946a5741a"(这个直接对应)
"sha256:34cf0e74977f5cabe21fd5465978f35ec87b57ed928745a0f2054bc7e1dcbcf9"(这个接下来要计算)

三,查看这些layer id的cache id

只有底层layer id可以对应

cat /var/lib/docker/image/overlay2/layerdb/sha256/3e207b409db364b595ba862cdc12be96dcdad8e36c59a03b7b3b61c946a5741a/cache-id 
96629ef0f0bc67db66c80819439e0730965e2e2b28adf5a0268c5d2d09243197

第二层layer要使用sha256sum计算。
也就是最底层的一个符合,这是因为那是因为docker使用了chainID的方式去保存这些layer,简单来说就是chainID=sha256sum(H(chainID) diffid)

echo -n "sha256:3e207b409db364b595ba862cdc12be96dcdad8e36c59a03b7b3b61c946a5741a sha256:34cf0e74977f5cabe21fd5465978f35ec87b57ed928745a0f2054bc7e1dcbcf9" | sha256sum -
f38720cdbb52db9bfe940ccfb529f197e70d2dbd60596ff6d0198315adc51af4  -

cat  /var/lib/docker/image/overlay2/layerdb/sha256/f38720cdbb52db9bfe940ccfb529f197e70d2dbd60596ff6d0198315adc51af4/cache-id 
1b645ae96b404e55ebb669161a7f234bf6161e6be5f3d62cebb8484577f3dea5

所以相应的catch id分别为:

96629ef0f0bc67db66c80819439e0730965e2e2b28adf5a0268c5d2d09243197
1b645ae96b404e55ebb669161a7f234bf6161e6be5f3d62cebb8484577f3dea5

四,查看底层cache id的内容

处于底层的镜像目录包含了一个diff和一个link文件,diff目录存放了当前层的镜像内容,而link文件则是与之对应的短名称:

cat /var/lib/docker/overlay2/96629ef0f0bc67db66c80819439e0730965e2e2b28adf5a0268c5d2d09243197/link 
UX63QQY3NHDVNE3247WVWZD62Y

五,查看上层cache id的内容

在这之上的镜像还多了work目录和lower文件,lower文件用于记录父层的短名称,work目录用于联合挂载指定的工作目录。

cat /var/lib/docker/overlay2/1b645ae96b404e55ebb669161a7f234bf6161e6be5f3d62cebb8484577f3dea5/lower 
l/UX63QQY3NHDVNE3247WVWZD62Y
[root@k3s-agent overlay2]# cat 1b645ae96b404e55ebb669161a7f234bf6161e6be5f3d62cebb8484577f3dea5/link 
DNJL7YGXM7NVEZJDDETX3PNDUV

六,查看l目录中的短链接

l目录包含了所有层的软连接,短链接使用短名称,避免mount时候参数达到页面大小限制(演示中mount | grep overlay2命令查看时候的短目录):

ll /var/lib/docker/overlay2/l
lrwxrwxrwx. 1 root root 72 Oct 24 21:40 DNJL7YGXM7NVEZJDDETX3PNDUV -> ../1b645ae96b404e55ebb669161a7f234bf6161e6be5f3d62cebb8484577f3dea5/diff
lrwxrwxrwx. 1 root root 72 Oct 24 21:40 UX63QQY3NHDVNE3247WVWZD62Y -> ../96629ef0f0bc67db66c80819439e0730965e2e2b28adf5a0268c5d2d09243197/diff

七,测试运行docker容器中的读写层

运行一个容器,在容器里写一个新的文件,然后,就可以测试写时复制的机制了。
另外init层,是自定义hosts,网络配置等,也值得关注一下。

# 比如,在容器的/root/目录下,写入一个helloword文件,按如下方式,查找到内容
cd /var/lib/docker/overlay2
find . -name "helloworld" |ls -trlh
上一篇下一篇

猜你喜欢

热点阅读