今天上集群查看有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:提供辅助功能。