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目录出现问题,无法远程,现场工程师说不清楚。
  • 镜像需要保留(客户内网无法下载新镜像)
  • 容器需要的数据持久化存储没有问题。

【解决】

  1. 停止docker服务,mv docker目录,重启docker

现场启动正常,说明之前错误定位是对的。

  1. 停止docker服务,用原来docker目录下image目录和overly2替换新生成的docker目录下的对应目录
  2. 替换后原容器上层对应的目录( 见"2.1 容器上层存储目录")建议删除,当然你不删也不会有问题。
  3. 重启docker服务

posted on 2021-09-05 18:49  运维开发玄德公  阅读(246)  评论(0编辑  收藏  举报  来源

导航