最近项目上服务器磁盘满了,项目上小哥为了腾出来点空间,把docker的overlay2文件给删了部分,导致部分容器启动时候报错:
大体意思就是overlay2下面的这个文件没了
处理方式:
问题根源在于docker的 Root Dir满了,这个默认路径在 /var/lib/docker
我们可以在部署docker时候修改这个默认路径,改成一个相对较大路径下
但是迁移到大磁盘治标不治本,需要找出来根本原因,我们去docker的Root Dir 输入命令
查看大文件路径,可以发现两个目录容易比较大 一个是container目录 一个是overlay2目录
对于overlay2目录,可以使用
对于container目录,基本是容器运行日志造成的,进入 container目录 输入命令 可以看到大文件,都是一些日志文件
对于日志
同时对于容器加启动限制
或者 修改/etc/docker/daemon.json配置文件
或者在启动的docker-compose.yml添加限制
/var/lib/docker下的几个目录 及docker的几个id
1、 /var/lib/docker下目录结构为:
可以看到docker涉及到的一些概念容器、镜像、网络、挂载等都在这里有对应的目录,这是docker的存储目录
2、docker存储驱动:
现在docker支持很多种文件驱动类型,比如AUFS、OverlayFS,OverlayFS实现方式和AUFS类似,但是更快、且实现起来简单
对于linux内核4.0及以上版本 或者红帽、centos 3.10.0-514版本可以使用overlay2存储驱动,其他低版本使用overlay(更推进 overlay2, 对于inode管理更好 效率更高)
我们可以通过修改配置文件 /etc/docker/daemon.json 来调整驱动类型
3、container目录:
container目录内部是启动容器的一些配置信息
hosts、hostname域名等信息;
config.v2.json配置文件,我们使用docker inspect 容器时候获取到的容器配置信息;
*-json.log容器产品日志文件
4、image目录:
distribution 目录
因此虽说这两种 ID 都表示 镜像层 hash ID,但一个是压缩的,一个是解压缩的,所以 hash 运算后不一致
5、layerdb目录
sha目录,内部记录ChainID
如果layer是最底层,没有任何父layer,那么diffID = chainID;
否则,chainID(n)=sha256sum(chainID(n-1)) diffID(n))
举个例子: 两层的 diffid diffid2 进行shasum256运算得出chainID
找到chainID之后,进去具体某个目录则看到 cache-id,指向具体真实的的overlay2文件
mounts: 每启动一个容器,则在 layerdb下面会多一个 mounts文件(就是启动容器之后 回显的文件)
6、Overlay2:
lower:底层文件系统。对于Docker来说,就是只读的镜像层;upper:上层文件系统。对于Docker来说,就是可读写的容器层;merged:作为统一视图的联合挂载点。对于Docker来说,就是用户视角下的文件系统;work:提供辅助功能。
最后说明下,回到最开头的问题,如果误删了文件导致docker容器无法启动,可以将磁盘上的/var/lib/docker目录重命名,然后重启docker服务,让docker重新拉取镜像,但如果以前的文件系统没有映射,会丢失文件,所以还是建议存储的内容一定要做好目录映射。