Docker清理数据和目录结构介绍

今天上集群查看有POD状态不正常,然后describe POD事件提示

docker: Error response from daemon: open /var/lib/docker/overlay2/***: no such file or directory

出现这个提示的意思是overlay2下面的这个文件没有了,出现这个问题的原因是docker root dir目录已经写满了,root dir的默认路径就是 /var/lib/docker,当然这个路径也可以通过daemon.json文件的data-root参数来配置指定路径。

{
  "data-root": "/data/lib/docker"
}

可以使用docker info|grep 'Root Dir'命令查看当前数据存储的路径

docker info|grep 'Root Dir'
 Docker Root Dir: /var/lib/docker

清理不用的镜像我们可以使用prune命令

docker system prune -a

清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像),-a命令清理得更加彻底,可以将没有容器使用Docker镜像都删掉
对于container目录,基本是容器运行日志造成的,进入container目录输入命令可以看到大文件,都是一些日志文件,这些可以通过max-size和max-file参数来限制大小和数量。

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3",
  }
}

查看大文件

du -h --max-depth=1 | sort -n

然而出现这种情况用以下方式来解决,具体步骤如下:

1.把这个POD容器的deployment资源删除,删除前确保数据备份好了,或者其它需要备份的数据。

2.去这个节点删除这个镜像。

3.重新拉取或者导入这个镜像,然后再次部署这个POD的deployment,启动POD容器,如果有数据还需要进行数据的导入。

下面介绍docker一些目录和数据

docker存储驱动

docker支持很多种文件驱动类型,比如AUFS、OverlayFS,OverlayFS实现方式和AUFS类似。

对于linux内核4.0及以上版本 或者红帽、centos 3.10.0-514版本可以使用overlay2存储驱动,其他低版本使用overlay(更推进 overlay2, 对于inode管理更好 效率更高)

我们可以通过修改配置文件 /etc/docker/daemon.json 来调整驱动类型

{
  "storage-driver": "overlay2"
}

container目录

container目录内部是启动容器的一些配置信息

hosts、hostname域名等信息;
config.v2.json配置文件,我们使用docker inspect 容器时候获取到的容器配置信息;
*-json.log容器产品日志文件

image目录

distribution目录
diffid-by-digest 保存了digest(layerID)->diffID的映射关系
v2metadata-by-diffid 保存了diffid -> (digest,repository)的映射关系
digest(layerID) 就是 pull 镜像时的 hash ID,拉取是 镜像层文件是压缩文件,压缩态
diffid 是 docker inspect 查看到的 镜像层 hash ID,此时 镜像层文件是解压缩的,解压缩态
因此虽说这两种 ID 都表示 镜像层 hash ID,但一个是压缩的,一个是解压缩的,所以 hash 运算后不一致
imagedb、layerdb 这俩都是元数据文件
imagedb可以看到镜像的元数据信息, cat下看到内部写着 dfffid
repositories.json 记录本地镜像列表, 镜像名称-版本:imageId
rootfs:
    diffid: sha256 记录各层解压后经过sha256算法计算得来的值,两个优势 一个方便校验、一个方便共享

layerdb目录

sha目录,内部记录ChainID
如果layer是最底层,没有任何父layer,那么diffID = chainID;否则,chainID(n)=sha256sum(chainID(n-1)) diffID(n))
举个例子: 两层的 diffid diffid2 进行shasum256运算得出chainID
echo -n "sha256:5dacd731af1b0386ead06c8b1feff9f65d9e0bdfec032d2cd0bc03690698feda sha256:dd0338cdfab32cdddd6c30efe8c89d0229d9f939e2bb736fbb0a52f27c2b0ee9" | shasum -a 256
找到chainID之后,进去具体某个目录则看到 cache-id,指向具体真实的的overlay2文件
mounts
每启动一个容器,则在 layerdb下面会多一个 mounts文件(就是启动容器之后 回显的文件)

Overlay2目录

lower:底层文件系统。对于Docker来说,就是只读的镜像层;
upper:上层文件系统。对于Docker来说,就是可读写的容器层;
merged:作为统一视图的联合挂载点。对于Docker来说,就是用户视角下的文件系统;
work:提供辅助功能。


内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/927.html

我要评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。