【发布时间】:2019-02-22 12:42:32
【问题描述】:
总结
鉴于:
- 存储驱动
dockerusers是ZFS; - 只有
docker创建legacy数据集;
重击:
$ 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 秒,而不是
证明 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
【问题讨论】:
-
您是否尝试过此处建议的说明? stackoverflow.com/questions/35655849/…
-
我现在做了,谢谢你的建议。不幸的是,它不适用于查找用于图像或图层的挂载。它只查找具有特定 volumes 的容器,例如
docker volume ls中的那些 - 只有大约 15 卷(如预期的那样) -
我确实阅读了您的问题超过 10 次。然后我意识到也许你根本不是指 Docker 中的卷。由于 docker 中的卷不能从空中出现,我们必须通过“-v”标志指定它们。你能把'sudo zfs list'的内容放上去吗?也许我应该在那之后编辑我的答案......
-
@Light.G 由于
zfs存储驱动程序,它们很可能是也是 Docker 层。但我怀疑他们是古代版本的孤儿。请参阅问题末尾编辑的示例输出。 -
@Redsandro:可以用最新的 Docker 确认行为,做了修剪舞,看起来像 Docker 中的(又一个)错误:/ 这有效(但会杀死所有卷/图像/etc.pp ) 对于 Docker:
zfs list -r rpool/docker | awk '/docker\// { print $1 }' | xargs -l zfs destroy -R将rpool/docker替换为您的本地 Docker 数据集。