Docker中overlay2磁盘占用爆满清理方案

252 阅读8分钟

1. 检查磁盘空间和各容器占用空间

1.1. 检查磁盘空间情况

首先检查磁盘空间确认overlay2占用空间

df -h

可以看到以下结果

Filesystem      Size  Used Avail Use% Mounted on
udev            7.9G     0  7.9G   0% /dev
tmpfs           1.6G  2.1M  1.6G   1% /run
/dev/sda1       197G   59G  131G  32% /
tmpfs           7.9G     0  7.9G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
/dev/sda15      124M   12M  113M  10% /boot/efi
overlay         197G   59G  131G  32% /var/lib/docker/overlay2/3ea43957615f592f2a7b28512fd7f344ac762bfc80a4a964ac467b17f562203e/merged
overlay         197G   59G  131G  32% /var/lib/docker/overlay2/bd8702eb9dcc24aff1a54387374f6609b431aabb1c7131359296867986dc84a0/merged
overlay         197G   59G  131G  32% /var/lib/docker/overlay2/b6b66bb24dc1186c12f18ddb3487a3b81ef40767993a722b08359808635461bd/merged
overlay         197G   59G  131G  32% /var/lib/docker/overlay2/0bf724bd62f24f7411c573b03fef2816c0b14a696ce04e8b78c4616b704b1b86/merged
overlay         197G   59G  131G  32% /var/lib/docker/overlay2/d7caeb11110a19f032d90855ae491c9cb35c5cbbd57daf266e5b12c3494ba21e/merged
overlay         197G   59G  131G  32% /var/lib/docker/overlay2/e4ec25032cb6814980100348c68e937bb4b9e48c098dbf99c5a543428f73e8b7/merged
overlay         197G   59G  131G  32% /var/lib/docker/overlay2/53277c320141d4efa122ad91fe38fe9e7362d29d2cdabb5c3d8c2a1bdea12120/merged
overlay         197G   59G  131G  32% /var/lib/docker/overlay2/b5b65a3ebe16e33091590dbdbea7c51b6ffc8ab894358d9cb7d95934a14a8579/merged
overlay         197G   59G  131G  32% /var/lib/docker/overlay2/864d8e14ba8c74bc627a35847aff844e45acc43686abc7d81c471969fe2b8386/merged
overlay         197G   59G  131G  32% /var/lib/docker/overlay2/5d0d903a3ccd4b5b2cd6741d4eb9654b10667fd5707c13d3d51f2678b5c4d7a2/merged
overlay         197G   59G  131G  32% /var/lib/docker/overlay2/4c2bf66ffcd7f2a8bb03dcee3f5d445c4be9c56b899aaea319689a92193fbaf4/merged
overlay         197G   59G  131G  32% /var/lib/docker/overlay2/3a9e03fd9038307f133da2800527610a6334e458d42d8a406ea30e108dd8ec58/merged
overlay         197G   59G  131G  32% /var/lib/docker/overlay2/4c509ec79872340afca9c9a763782005fa043f5e4c988acc9f24f371d7c79b5c/merged
overlay         197G   59G  131G  32% /var/lib/docker/overlay2/d9bad19c0ce3f9ff18364ee882e52bb9fef3db1c5a99bdbfb97fe4dbbea6f985/merged
overlay         197G   59G  131G  32% /var/lib/docker/overlay2/492549dc47bc8b55a73c945ad3eb699fe34c5e563d22cf4b16383048420fbffe/merged
overlay         197G   59G  131G  32% /var/lib/docker/overlay2/31a7a2393fa100d485b852cda049e4efe7e2d57240a638bde911901a9878e6bd/merged
overlay         197G   59G  131G  32% /var/lib/docker/overlay2/c56e33e03da1a8e849eb8d02a660cfdbf1b21774a99adb8bb1435e072ead0eaf/merged
tmpfs           1.6G     0  1.6G   0% /run/user/0

如果看到overlay Use%这一栏占用百分比过高说明确实是overlay目录占用过高导致服务器磁盘空间过小的问题

1.2. 检查容器的占用情况

首先检查docker模块中的占用情况

docker system df

结果显示

TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          20        18        8.739GB   684.5MB (7%)
Containers      18        17        11.12MB   6.23kB (0%)
Local Volumes   7         6         348.8MB   72.39MB (20%)
Build Cache     754       0         40.38GB   40.38GB
  • Images: 镜像的数量及占用大小
  • Containers: 容器的数量及占用大小
  • Local Volumes: 本地卷数量及占用大小
  • Build Cache: 打包构建时的缓存大小

我们主要是清理Images、Containers和Build Cache中的文件

2. 执行清理操作

2.1. 清理无用的Images

首先先查看一下目前存在的镜像

docker images

结果

REPOSITORY                                     TAG       IMAGE ID       CREATED        SIZE
<none>                                         <none>    defd79220cd6   2 months ago   239MB

可以看到有很多到字样的镜像。这里我只截取一个作为参考。发现数量和占用大小都挺多的。

none镜像被官方称为dangling镜像。 代表没有标签且没有被使用过的镜像,可以安全放心的清理。

清理方法也很简单,执行下面命令

docker image prune

这条命令会自动帮我们清除带有的无效镜像。命令执行完毕会提示释放了多少个空间。然后我们再来执行docker images命令会发现带有的镜像全部被清理干净了磁盘空间也得到了释放!

2.2. 清理Containers容器中的日志

Containers容器占用最多的基本上就是日志文件

Docker 日志(也就是 docker logs 输出的东西) 默认存放在:

/var/lib/docker/containers/<container-id>/<container-id>-json.log

这个日志文件可能会越积越大,需要定期清理。

方法1:

先找到日志文件路径:

docker inspect <容器名或ID> --format='{{.LogPath}}'

然后清空它

truncate -s 0 "$(docker inspect <容器名或ID> --format='{{.LogPath}}')"

方法2: 还有另一种方式可以一次性清理所有容器

find /var/lib/docker/containers/ -name "*-json.log" -exec truncate -s 0 {} ;

不删除文件、不重启服务,不影响任何容器运行。

2.2.1. 从根源限制Docker日志大小(一劳永逸的方法 推荐)

我们可以设置限制日志大小从而不用每次都来手动删除日志

输入

vim /etc/docker/daemon.json

然后再文件中写入

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

这样每个容器最多只会占用30MB的日志空间。

写入完成后并不会立刻生效,需要重启运行中的容器。

如果有条件的情况下重启docker会对所有容器都生效

systemctl restart docker

2.3. 清理Build Cache构建缓存

Build Cache主要是构建时的缓存,清理它们下次打包构建时速度可能会慢点,对于系统没有任何影响。如果磁盘占用过高需要及时清理。清理方法也特别简单就一行命令

docker builder prune

执行完成后可以发现服务器的内存又释放了一大截。

总结

通过先查看磁盘占用、再清理无用镜像与日志、最后删除构建缓存,可以快速释放overlay2占用的磁盘空间。如果希望长期稳定,建议同时配置日志大小限制,并定期用docker system dfdf -h复查空间,避免再次爆满。

好了,本期教程到此结束。如果有任何疑问可以在下方留言 更多精彩内容可以关注我的博客 haydenbi.com