验证centos7中docker使用的overlay2文件系统
这个知识点,可以慢慢咀嚼~~~
一,选一个镜像分析。
运行好好,就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