gpt4 book ai didi

docker - 如何清理Docker ZFS旧共享

转载 作者:行者123 更新时间:2023-12-02 04:27:39 25 4
gpt4 key购买 nike

概要

鉴于:

  • 存储驱动程序docker用户是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秒而不是<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

    最佳答案

    我有同样的问题,但找不到满意的答案。添加what I eventually found,因为此问题是搜索量最高的结果之一。

    背景

    Docker的ZFS存储驱动程序将每个图像的每一层存储为单独的旧数据集。

    即使只有少数几个图像也可能导致大量的图层,每个图层都对应一个legacy ZFS数据集。

  • 引用Docker ZFS driver docs:

    The base layer of an image is a ZFS filesystem. Each child layer is a ZFS clone based on a ZFS snapshot of the layer below it. A container is a ZFS clone based on a ZFS Snapshot of the top layer of the image it’s created from.


  • 调查

    您可以通过运行以下命令检查一张图像使用的数据集:

     $ docker image inspect [IMAGE_NAME]

    输出示例:
    ...
    "RootFS": {
    "Type": "layers",
    "Layers": [
    "sha256:f2cb0ecef392f2a630fa1205b874ab2e2aedf96de04d0b8838e4e728e28142da",
    ...
    ...
    ...
    "sha256:2e8cc9f5313f9555a4decca744655ed461e21fbe48a0f078ed5f7c4e5292ad2e",
    ]
    },
    ...

    这说明了为什么只运行十几个容器就可以看到150多个创建的数据集。


  • 修剪并删除未使用的图像。
    $ docker image prune -a
  • 为避免zfs list变慢,请指定感兴趣的数据集。
    假设您将docker存储在tank/docker中,其他文件存储在tank/data中。通过递归选项仅列出data数据集:
    # recursively list tank/data/*
    $ zfs list tank/data -r
  • 关于docker - 如何清理Docker ZFS旧共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52387244/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com