docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > Docker磁盘空间清理

Docker磁盘空间清理的方法实现

作者:margu_168

在使用Docker的过程中,系统会逐渐积累一些无用的垃圾文件,占据宝贵的磁盘空间并影响系统性,本文主要介绍了Docker磁盘空间清理的方法实现,具有一定的参考价值,感兴趣的可以了解一下

Docker磁盘空间清理

使用docker system命令清除*
docker system df命令,类似于Linux上的df命令,用于查看Docker的磁盘使用情况:

[root@k8s-m1 ~]# docker system df 
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          14        12        3.072GB   744.8MB (24%)
Containers      28        13        621.1MB   621.1MB (99%)
Local Volumes   4         0         747.7MB   747.7MB (100%)
Build Cache     0         0         0B        0B

可以看到,Docker镜像占用了3.07GB磁盘,Docker容器占用了621.1MB磁盘,Docker数据卷占用了 747.7MB磁盘。

执行docker system prune -a命令之后,Docker占用的磁盘空间减少了很多:

[root@k8s-m1 ~]# docker system df 
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          8         8         750MB     3.552MB (0%)
Containers      13        13        11.62kB   0B (0%)
Local Volumes   4         0         747.7MB   747.7MB (100%)
Build Cache     0         0         0B        0B

手动清理Docker镜像/容器/数据卷

对于旧版的Docker(版本1.13之前),是没有docker system命令的,因此需要进行手动清理。这里给出几个常用的命令,

# 删除所有关闭的容器
docker ps -a | grep Exit | cut -d ‘’ -f 1 | xargs docker rm

# 删除所有dangling镜像(即无tag的镜像):
docker images | grep “” | awk “{print $3}”

# 删除所有dangling数据卷(即无用的volume):
docker volume rm $(docker volume ls -qf dangling=true)

占用大空间的容器查找

有时候,当使用了上面提到的方法清理磁盘之后,发现磁盘空间并没有清理出来多少,需要进行进一步分析

在centos上,Docker的所有相关文件,包括镜像、容器等都保存在/var/lib/docker/目录中,但是一般都是容器会造成磁盘占用的空间特别大,这个时候就需要通过docker overlay2 目录名查找对应容器名:

1、观察到是 /var/lib/docker/overlay2目录占用空间大,进入到 /var/lib/docker/overlay2 目录下,查看谁占用的较多

[root@k8s-m1 ~]# du -sh /var/lib/docker/*
16K     /var/lib/docker/builder
88K     /var/lib/docker/buildkit
95M     /var/lib/docker/containers
7.7M    /var/lib/docker/image
128K    /var/lib/docker/network
1.6G    /var/lib/docker/overlay2
100K    /var/lib/docker/volumes
[root@k8s-m1  ~]# cd /var/lib/docker/overlay2/
[root@k8s-m1 ~]# du -s /var/lib/docker/overlay2/* | sort -rn | more
191492  /var/lib/docker/overlay2/a3e0d664d7b493bae51c87f8bcb2e5dfecd7b1ef14b8f6e73ed0e5cd246df8a3
147888  /var/lib/docker/overlay2/a40859c088c98e9eee27b81a71bf340dc444a2c172c042b2f890f9afd41dae8c

如上所示,占用空间最大的目录为/var/lib/docker/overlay2/a3e0d664d7b493bae51c87f8bcb2e5dfecd7b1ef14b8f6e73ed0e5cd246df8a3

2、再通过目录名查找容器名

[root@k8s-m1 ~]# docker ps -q | xargs docker inspect --format '{{.State.Pid}}, {{.Id}}, {{.Name}}, {{.GraphDriver.Data.WorkDir}}' | grep a3e0d664d7b493bae51c87f8bcb2e5dfecd7b1ef14b8f6e73ed0e5cd246df8a3
16210, 5ea65cf847e0fbd65e7fe8a0d730b6d4e29f1a5facbf33b4b1bbada23d2b2e3b, /k8s_calico-node_calico-node-cgffm_kube-system_06eac25d-01f7-4b1b-ad3f-e9b15b761fb5_4, /var/lib/docker/overlay2/a3e0d664d7b493bae51c87f8bcb2e5dfecd7b1ef14b8f6e73ed0e5cd246df8a3/work

输出依次为,进程pid、容器ID、容器名、存储work路径,即可确定是哪个容器。此方法也常用于查找某个容器在宿主机上的工作目录。

检查是否对应:

[root@k8s-m1 ~]# docker ps -a|grep 5ea
5ea65cf847e0   ee86d6374c0e                                        "start_runit"            6 days ago    Up 6 days                         k8s_calico-node_calico-node-cgffm_kube-system_06eac25d-01f7-4b1b-ad3f-e9b15b761fb5_4

结论:存储的数据目录ID和容器的ID是不一样的,要注意区分。

进而可以到具体容器进行排查是什么原因造成了磁盘空间占用过多。如果可以手动清理(如日志)可以先手动清理,清理不了允许重启的话可以重启(重建)容器试试。

如果是nginx的容器,并且是日志文件造成磁盘空间过大可以使用
使用truncate命令,可以将nginx容器的日志文件“清零”:
truncate -s 0 /var/lib/docker/containers/c84f63acd6b88a7a217c511bf1eba4f8c12c735a7c0436d18ac49cf566d4fd6b/*-json.log

当然,这个命令只是临时有作用,日志文件迟早又会涨回来。要从根本上解决问题,就需要限制nginx容器的日志文件大小。这个可以通过配置日志的max-size来实现。

重启Docker

还有时候,当清理了镜像、容器以及数据卷之后,发现磁盘空间并没有减少,这个时间可以尝试重启docker服务。

到此这篇关于Docker磁盘空间清理的方法实现的文章就介绍到这了,更多相关Docker磁盘空间清理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文