概述
鉴于以下情况:
docker
存储驱动程序使用ZFS;- 仅
docker
创建legacy
数据集;
Bash:
$ docker ps -a | wc -l
16
$ docker volume ls | wc -l
12
$ zfs list | grep legacy | wc -l
157
这里有16个容器(正在运行和停止的)。12个卷。 157个数据集。 这似乎是许多遗留数据集。我想知道它们中的很多是否已经变得孤立,以至于甚至连docker
也不再知道它们,所以它们不会被清理。
背景
在我的Debian zfs池中有一个巨大的遗留卷列表。当我在这台机器上开始使用Docker时,它们开始出现:
$ sudo zfs list | grep legacy | wc -l
486
它们都是以下形式:
pool/var/<64-char-hash> 202K 6,18T 818M legacy
此位置仅供docker使用。
$ docker info | grep -e Storage -e Dataset
Storage Driver: zfs
Parent Dataset: pool/var
我开始清理了。
$ docker system prune -a
(...)
$ sudo zfs list | grep legacy | wc -l
154
这样就好了。不过,我只运行了大约15个容器,在运行docker system prune -a
之后,每个容器的历史记录显示只有最后一个镜像层仍然可用。其余的都是<missing>
(因为它们已被清理掉)。
$ docker images | wc -l
15
如果在清理其余部分后所有容器仅使用最后一个镜像层,那么Docker是否只应使用15个镜像层和15个运行容器,总共30个卷?
$ sudo zfs list | grep legacy | wc -l
154
我能否找出容器/镜像是否在使用中?是否有一条命令可以遍历ZFS中所有pool/var/<hash>
数据集,并找出它们属于哪个docker容器/镜像?可能有很多可以删除的内容,但我不知道如何确定它们已经无用(除了信任docker system prune
之外)。
由于docker过度使用zfs卷,我的zfs list
命令混乱不堪,无论是视觉上还是性能上。现在列出zfs卷需要大约10秒钟,而不是小于1秒钟。
证明docker不再看到悬空计数
$ docker ps -qa --no-trunc --filter "status=exited"
(no output)
$ docker images --filter "dangling=true" -q --no-trunc
(no output)
$ docker volume ls -qf dangling=true
(no output)
zfs list
的例子:
NAME USED AVAIL REFER MOUNTPOINT
pool 11,8T 5,81T 128K /pool
pool/var 154G 5,81T 147G /mnt/var
pool/var/0028ab70abecb2e052d1b7ffc4fdccb74546350d33857894e22dcde2ed592c1c 1,43M 5,81T 1,42M legacy
pool/var/0028ab70abecb2e052d1b7ffc4fdccb74546350d33857894e22dcde2ed592c1c@211422332 10,7K - 1,42M -
# and 150 more of the last two with different hashes
docker volume ls
中的容器 - 这些容器仅约有15个卷(如预期)。 - Redsandrozfs
存储驱动,它们很可能也是 Docker 层。但我怀疑它们是来自一个古老版本的孤立层。请参考问题末尾编辑后的示例输出。 - Redsandrozfs list -r rpool/docker | awk '/docker\// { print $1 }' | xargs -l zfs destroy -R
将rpool/docker
替换为您本地的Docker数据集。 - kei1aeh5quahQu4U