01-docker原理-05-overlay2目录
文章目录
前言:
本章分析 docker 的 overlay2 目录
docker的整体目录的分析见《docker的目录》一文
1. “l”目录
- 目录位置
overlay2目录下有有一个“l”目录 - 内容
里边有一些软连接指向 /overlay2/CacheID 目录下的 diff目录。
[root@liubei l]# ll
total 444
lrwxrwxrwx 1 root root 72 Jan 21 08:48 2GJHC55KDLLSH725ATMROHMQHW -> ../3ef5f9868d2f72e7dcd3ff1047176d2c9f78ef06342552896badb97876427ba8/diff
lrwxrwxrwx 1 root root 72 Jan 21 08:49 2Q4QW2CEWO47MDMGSDORECFGI2 -> ../99153898c52a78f3b7bbd4ed06c32b32facb00e471496ce55324dcae95442dff/diff
lrwxrwxrwx 1 root root 72 Jan 21 08:49 2QWP34GCA3MW5YPGZJDB4U36VO -> ../9668210804fd9774d6be658253bb36afcf80808140da91fc6f07315984aa25e3/diff
lrwxrwxrwx 1 root root 72 Jan 21 08:48 3V4AGOIEAL5XGQIGO66Y5UPHY3 -> ../8cf959aa82bf88454d10c467f3e33a897d19ab6a9ab7d0f3b6d669f1315ca56e/diff
- 作用
这是为了避免挂载命令超出长度。
2. CacheID目录作用
overlay2目录下还有很多已CacheID为目录名的目录,这些目录存储的是镜像和容器各层的实际内容。
[root@liubei overlay2]# ll
total 432
drwx------ 4 root root 4096 Oct 29 2019 012de5e5bdb0562b4b60c50d235c9eb9fe17a9a5592ec3fbd9231dedf38afb2d
drwx------ 4 root root 4096 Jan 21 08:48 03468b1e67108a1a2acade9b1f05e2e6fa5b5d282e9526af8628a48104102940
drwx------ 4 root root 4096 Jan 21 08:49 0387aa8919e5fa943132c89ae93574807c77b15aa0cd7514a1f29c9287a87a5d
drwx------ 5 root root 4096 Feb 2 10:45 08b19b890cc0348eabca15b585820d91bd59d88e3fdd5c2f589fe5e69ecb5cfa
drwx------ 4 root root 4096 Jan 21 09:41 08b19b890cc0348eabca15b585820d91bd59d88e3fdd5c2f589fe5e69ecb5cfa-init
......
2.1 容器上层存储目录
其中带 -init
的目录和跟它同名但不带-init
的目录是容器上层的目录。如上例中:
drwx------ 5 root root 4096 Feb 2 10:45 08b19b890cc0348eabca15b585820d91bd59d88e3fdd5c2f589fe5e69ecb5cfa
drwx------ 4 root root 4096 Jan 21 09:41 08b19b890cc0348eabca15b585820d91bd59d88e3fdd5c2f589fe5e69ecb5cfa-init
-
带init的目录
这个目录对容器是只读的 -
没有init的容器目录
容器的读写目录,容器中写入时候会把文件拷贝进来(读操作直接在每层操作,不需拷贝)
演示:
比如我进入容器,在home下写一个hello.txt的文件,于是宿主机该目录下的diff目录中多了一个 home目录,下边多了一个hello.txt文件。
生命周期:
- 当容器创建时生成这些目录
- 当容器删除时,目录删除
2.2 镜像层存储目录ing
- 位置
只有一个以CacheID命名的目录(即没有对应CacheID-init
目录的) - 生命周期
随镜像下载而创建,随镜像删除而删除
3. CacheID目录和容器的对应关系
3.1 查看存储目录属于哪个容器
- overlay2下有如下目录
08b19b890cc0348eabca15b585820d91bd59d88e3fdd5c2f589fe5e69ecb5cfa
08b19b890cc0348eabca15b585820d91bd59d88e3fdd5c2f589fe5e69ecb5cfa-init
- 查找属于那个容器
[root@pre-server01 overlay2]# docker ps -q | xargs docker inspect --format '{{.State.Pid}}, {{.Id}}, {{.Name}}, {{.GraphDriver.Data.WorkDir}}' | grep "08b19b890cc0348eabca15b585820d91bd59d88e3fdd5c2f589fe5e69ecb5cfa"
3262, 6bf1cc99809501fe6c5133bbadd1a973b938425fd87a5ff98e3f4ab7d570589a, /das-db, /var/lib/docker/overlay2/08b19b890cc0348eabca15b585820d91bd59d88e3fdd5c2f589fe5e69ecb5cfa/work
说明:
如上可见,该存储对应 的容器名为 das-db
3.2 查看指定容器的存储目录
其实就是2.2反向查,测试如下
[root@DoN02 overlay2]# docker ps -q | xargs docker inspect --format '{{.State.Pid}}, {{.Id}}, {{.Name}}, {{.GraphDriver.Data.WorkDir}}' | grep gateway
134626, bf6c6433bd2ed870daad08fd667ece93db2f8c5e05da786d0ca9838a2bcf72d4, /k8s_filebeat_gateway-854ff898c5-t7j49_crust-framework_d6e24bdc-8632-4691-b2ef-c112efdb6784_0, /data/docker/overlay2/72df0bfe3f322eeff69f43394e9bde50a786103f278c00a1dd8bde457889e077/work
134565, d278f3488213a2396dda0a781dc5ea5d512ea11675ee30a0521817ad8a5a4b1e, /k8s_gateway_gateway-854ff898c5-t7j49_crust-framework_d6e24bdc-8632-4691-b2ef-c112efdb6784_0, /data/docker/overlay2/9e31372295296a2d83bd725214063f60114499582be4027e13c78b241e1cf16c/work
134439, a16364fc28a7c67e35d1d2c0c73fdc18b5705dfe1b21d3c79a0a99618594a88a, /k8s_POD_gateway-854ff898c5-t7j49_crust-framework_d6e24bdc-8632-4691-b2ef-c112efdb6784_0, /data/docker/overlay2/0e362acb07459c9fd97f5b1bbe2431a33daf19e091da78c8abed459985fdff69/work
28798, 1ce006e2a0ac90d7dc838d52d9b5865bc76e75a40f79bd4839ef818e46730197, /k8s_gateway_etcd-75d4485689-j4g2z_streaming_373adf06-d4b8-4aa7-a161-ba8424a0eefe_0, /data/docker/overlay2/80385eb061acce97c369fe1577775e8230ce7108cf0ac01dce0346e1622fad94/work
说明:如上可见,查看 gataway 这个pod的目录,得到四条信息:
- 第一条是该pod里 filebeat的容器信息
- 第二条是该pod里gateway的容器,我们要找的是这个
- 第三条是该pod里pause的容器
- 第四条是k8s系统的,和该pod无关。
综上:我们要找的目录是/data/docker/overlay2/9e31372295296a2d83bd725214063f60114499582be4027e13c78b241e1cf16c
4. CacheID目录结构
[root@pre-server01 ffd866bd6ece4908f3edd84da09df8f470680276c4acc6752066de8d359e972c]# ll
total 16
-rw------- 1 root root 0 Jan 21 08:49 committed
drwxr-xr-x 3 root root 4096 Jan 21 08:49 diff
-rw-r--r-- 1 root root 26 Jan 21 08:49 link
-rw-r--r-- 1 root root 86 Jan 21 08:49 lower
drwx------ 2 root root 4096 Jan 21 08:49 work
- diff 目录
文件目录,各层的目录都会放在下边
[root@pre-server01 08b19b890cc0348eabca15b585820d91bd59d88e3fdd5c2f589fe5e69ecb5cfa]# ll diff/
total 20
drwxr-xr-x 2 root root 4096 Feb 2 14:06 home
drwx------ 2 root root 4096 Feb 2 13:40 root
drwxr-xr-x 3 root root 4096 Jan 28 2019 run
drwxrwxrwt 2 root root 4096 Feb 2 13:40 tmp
- link 文件
写明该存储对应的镜像层
[root@pre-server01 ffd866bd6ece4908f3edd84da09df8f470680276c4acc6752066de8d359e972c]# cat link
RMGBSAZLRQKZLACS72PTSJPS62
- lower 文件
指名该镜像层对应的底层镜像层
[root@pre-server01 ffd866bd6ece4908f3edd84da09df8f470680276c4acc6752066de8d359e972c]# cat lower
l/OSSHOMMOPKF74F3MR2JHEA33MG:l/2Q4QW2CEWO47MDMGSDORECFGI2:l/IUFHPX4Z3A74KHLPEYAMGPM5DI
- work 目录
文件系统的工作基础目录,挂载后内容会被清空,且在使用过程中其内容用户不可见
【FAQ】
1)overlay2 不支持NFS挂载
【问题】
将/var/lib/docker
目录移动到NFS挂载的目录之后,docker启动不起来
【查看】
查看报错日志如下
[root@crust-m02 data]# journalctl -xe
……
7月 06 11:49:50 crust-m02 dockerd[10652]: time="2021-07-06T11:49:50.475328532+08:00" level=error msg="'overlay2' is not supported over nfs" storage-driver=overlay2
7月 06 11:49:50 crust-m02 dockerd[10652]: time="2021-07-06T11:49:50.475349891+08:00" level=error msg="[graphdriver] prior storage driver overlay2 failed: backing file sys
……
2)镜像恢复
【问题】
客户现场docker启动不起来了,前台工程师需要提供快速解决的指导意见。
【分析】
- 根据现场工程师发来截图,初步判断大概率是docker目录出现问题,无法远程,现场工程师说不清楚。
- 镜像需要保留(客户内网无法下载新镜像)
- 容器需要的数据持久化存储没有问题。
【解决】
- 停止docker服务,mv docker目录,重启docker
现场启动正常,说明之前错误定位是对的。
- 停止docker服务,用原来docker目录下image目录和overly2替换新生成的docker目录下的对应目录
- 替换后原容器上层对应的目录( 见"2.1 容器上层存储目录")建议删除,当然你不删也不会有问题。
- 重启docker服务
posted on 2021-09-05 18:49 运维开发玄德公 阅读(246) 评论(0) 编辑 收藏 举报 来源