Docker overlay2 磁盘占用过高主要有以下三个原因:
1、容器日志文件过大,未作限制
2、docker 未用容器、镜像、缓存等过多
3、docker 默认路径存放不合理

一、磁盘容量查询

  通过以下两条命令可以定位磁盘占用过高原因,可根据查询结果做相应处置。

1、df -h 容量查询

[root@hostname ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        50G   50G   35M 100% /
overlay          50G   50G   35M 100% /data/docker/overlay2/770abd1b64f51f05a0f7c5c71d7349f54c9c152c8f58263ea9dda4960a722d61/merged
overlay          50G   50G   35M 100% /data/docker/overlay2/19de54ababc18c2eb4c0d011434ac785480169a4e694c736dcbe938d497b5b3f/merged
overlay          50G   50G   35M 100% /data/docker/overlay2/78f613526719dd1eabd3fe1f383ca55f065182e538f81cb719dd53d01055e849/merged
overlay          50G   50G   35M 100% /data/docker/overlay2/a18694da44feba8f8379f422fdf67c00a1ac97efb281f8578770b7da4d55ad6a/merged

2、du -sh * 文件大小查询

#逐级排查大文件位置
[root@hostname ~]# du -sh /*
7.2G    /var
[root@hostname ~]# du -sh /var/*
37G     /opt/open
[root@hostname ~]# du -sh /var/lib/*
6.6G    /var/lib/docker

二、磁盘占用过高处理方法

1、日志文件清理

  docker 容器运行时会产生大量日志,默认路径:/var/lib/docker/containers/id-json.log,随着容器运行该日志文件会占用大量磁盘空间。

1.1 日志清空

[root@test ~]# echo '' > 容器id-json.log

注:不要直接删除日志文件,否则可能会影响新日志产生。

1.2 限制日志文件大小

  以上方法只能暂时解决日志占用空间过大问题,如果想一劳永逸可修改 docker 配置文件,增加日志文件大小限制。

[root@test ~]# vi /etc/docker/daemon.json 
{
    "log-driver":"json-file",
    "log-opts":{
        "max-size" :"50m",
        "max-file":"1"
    }
}

1.3 重启 dokcer

[root@test ~]# systemctl daemon-reload
[root@test ~]# systemctl restart docker

注:已存在的容器不会生效,需要重建该容器才可以使配置生效

2、历史数据清理

  Docker 长时间运行,会产生大量无用的镜像、容器、网络等缓存信息,占用大量磁盘空间。此时我们可以使用 prune 命令清理。

2.1 释放所有未使用资源

[root@test ~]# docker system prune
WARNING! This will remove:
  - all stopped containers    //清理停止容器
  - all networks not used by at least one container  //清理未使用网络
  - all dangling images    //清理废弃镜像
  - all dangling build cache   //清理构建缓存

Are you sure you want to continue? [y/N] y
Deleted Containers:
7a7fdd019a89eb68325d45ee6821c3f6f9a0b68b5631a21665ec484d59c8a44a

Total reclaimed space: 202.4kB

注:数据清理前一定要检查是否还有需要使用的容器和镜像,避免误清理。

2.2 按需清理

[root@test ~]# docker image prune  //清理废弃镜像
[root@test ~]# docker container prune //清理停止容器
[root@test ~]# docker network prune   //清理未使用网络
[root@test ~]# docker system prune   //清理构建缓存

3、修改 Docker 运行路径

注:此方法需停止容器,迁移 docker 运行目录,请在业务空闲期,备份好数据后操作。
Docker 运行时使用的目录默认 “/var/lib/docker”,该目录占用根目录磁盘空间,根目录磁盘容量普遍较小。日常生成环境 Linux 常会挂载大容量数据盘,可以将 Docker 默认运行目录修改到数据盘。
修改 Docker 运行路径有两种方法:
1、迁移 / var/lib/docker 数据,创建软连接。此种方法不需要改配置文件。
2、迁移 / var/lib/docker 数据,修改 docker 配置文件。

3.1 迁移 / var/lib/docker 数据,创建软连接

#docker运行目录在/var/lib/docker下
[root@test ~]# df -h    
文件系统                 容量  已用  可用 已用% 挂载点
overlay                   50G  5.8G   45G   12% /var/lib/docker/overlay2/c9de256d8ded736cf99dddda4c4f68e9c5e5162e1b7e70abdb0cd3fbfbbb7a19/merged
overlay                   50G  5.8G   45G   12% /var/lib/docker/overlay2/4e844541eb13d9c7af1c01f0b4681915e617c650c22a20e52f4b77e1e90dc369/merged
overlay                   50G  5.8G   45G   12% /var/lib/docker/overlay2/176c72f3913eea50a7bded4ad65363280680615c083140c725cfa63e4287cc51/merged
#停止所有容器,避免迁移时影响业务
[root@test ~]# docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2)
#将docker默认运行目录剪切到opt目录
[root@test ~]# mv /var/lib/docker /opt/
#查询是否已剪切完成
[root@test ~]# ls /opt/
containerd  docker  hio  rh
#新运行目录创建软连接
[root@test ~]# ln -s /opt/docker  /var/lib/docker
#重启docker服务
[root@test ~]# systemctl restart docker
#启动所有容器
[root@test ~]# docker start $(docker ps -a | awk '{ print $1}' | tail -n +2)
#检查原镜像是否存在
[root@test ~]# docker images
#检查容器是否运行正常
[root@test ~]# docker ps 
#检查docker默认路径是否切换成功,已切换到/opt/docker下
[root@test ~]# df -h
文件系统                 容量  已用  可用 已用% 挂载点
overlay                   50G  5.8G   45G   12% /opt/docker/overlay2/176c72f3913eea50a7bded4ad65363280680615c083140c725cfa63e4287cc51/merged
overlay                   50G  5.8G   45G   12% /opt/docker/overlay2/4e844541eb13d9c7af1c01f0b4681915e617c650c22a20e52f4b77e1e90dc369/merged
overlay                   50G  5.8G   45G   12% /opt/docker/overlay2/c9de256d8ded736cf99dddda4c4f68e9c5e5162e1b7e70abdb0cd3fbfbbb7a19/merged

3.2 迁移 / var/lib/docker 数据,修改 docker 配置

#docker运行目录在/var/lib/docker下
[root@test ~]# df -h    
文件系统                 容量  已用  可用 已用% 挂载点
overlay                   50G  5.8G   45G   12% /var/lib/docker/overlay2/c9de256d8ded736cf99dddda4c4f68e9c5e5162e1b7e70abdb0cd3fbfbbb7a19/merged
overlay                   50G  5.8G   45G   12% /var/lib/docker/overlay2/4e844541eb13d9c7af1c01f0b4681915e617c650c22a20e52f4b77e1e90dc369/merged
overlay                   50G  5.8G   45G   12% /var/lib/docker/overlay2/176c72f3913eea50a7bded4ad65363280680615c083140c725cfa63e4287cc51/merged
#停止所有容器,避免迁移时影响业务
[root@test ~]# docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2)
#将docker默认运行目录剪切到opt目录
[root@test ~]# mv /var/lib/docker /opt/
#查询是否已剪切完成
[root@test ~]# ls /opt/
containerd  docker  hio  rh
#修改docker配置文件,添加 "data-root"路径
[root@test ~]# vi /etc/docker/daemon.json
{
   "data-root": "/opt/docker"
}
#重启docker服务
[root@test ~]# systemctl daemon-reload
[root@test ~]# systemctl restart docker
#启动所有容器
[root@test ~]# docker start $(docker ps -a | awk '{ print $1}' | tail -n +2)
#检查原镜像是否存在
[root@test ~]# docker images
#检查容器是否运行正常
[root@test ~]# docker ps 
#检查docker默认路径是否切换成功,已切换到/opt/docker下
[root@test ~]# df -h
文件系统                 容量  已用  可用 已用% 挂载点
overlay                   50G  5.8G   45G   12% /opt/docker/overlay2/176c72f3913eea50a7bded4ad65363280680615c083140c725cfa63e4287cc51/merged
overlay                   50G  5.8G   45G   12% /opt/docker/overlay2/4e844541eb13d9c7af1c01f0b4681915e617c650c22a20e52f4b77e1e90dc369/merged
overlay                   50G  5.8G   45G   12% /opt/docker/overlay2/c9de256d8ded736cf99dddda4c4f68e9c5e5162e1b7e70abdb0cd3fbfbbb7a19/merged