【问题标题】:Get Docker Container Disk Usage as Percentage以百分比形式获取 Docker 容器磁盘使用率
【发布时间】:2021-06-28 21:20:00
【问题描述】:

Docker 系统 df 显示有关 docker 守护进程使用的磁盘空间量的信息。

TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              5                   2                   16.43 MB            11.63 MB (70%)
Containers          2                   0                   212 B               212 B (100%)
Local Volumes       2                   1                   36 B                0 B (0%)

我想使用 Go Docker 客户端获取总磁盘使用率的百分比https://pkg.go.dev/github.com/docker/docker/client

{
  "LayersSize": 1092588,
  "Images": [
    {
      "Id": "sha256:2b8fd9751c4c0f5dd266fcae00707e67a2545ef34f9a29354585f93dac906749",
      "ParentId": "",
      "RepoTags": [
        "busybox:latest"
      ],
      "RepoDigests": [
        "busybox@sha256:a59906e33509d14c036c8678d687bd4eec81ed7c4b8ce907b888c607f6a1e0e6"
      ],
      "Created": 1466724217,
      "Size": 1092588,
      "SharedSize": 0,
      "VirtualSize": 1092588,
      "Labels": {},
      "Containers": 1
    }
  ],
  "Containers": [
    {
      "Id": "e575172ed11dc01bfce087fb27bee502db149e1a0fad7c296ad300bbff178148",
      "Names": [
        "/top"
      ],
      "Image": "busybox",
      "ImageID": "sha256:2b8fd9751c4c0f5dd266fcae00707e67a2545ef34f9a29354585f93dac906749",
      "Command": "top",
      "Created": 1472592424,
      "Ports": [],
      "SizeRootFs": 1092588,
      "Labels": {},
      "State": "exited",
      "Status": "Exited (0) 56 minutes ago",
      "HostConfig": {
        "NetworkMode": "default"
      },
      "NetworkSettings": {
        "Networks": {
          "bridge": {
            "IPAMConfig": null,
            "Links": null,
            "Aliases": null,
            "NetworkID": "d687bc59335f0e5c9ee8193e5612e8aee000c8c62ea170cfb99c098f95899d92",
            "EndpointID": "8ed5115aeaad9abb174f68dcf135b49f11daf597678315231a32ca28441dec6a",
            "Gateway": "172.18.0.1",
            "IPAddress": "172.18.0.2",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "MacAddress": "02:42:ac:12:00:02"
          }
        }
      },
      "Mounts": []
    }
  ],
  "Volumes": [
    {
      "Name": "my-volume",
      "Driver": "local",
      "Mountpoint": "/var/lib/docker/volumes/my-volume/_data",
      "Labels": null,
      "Scope": "local",
      "Options": null,
      "UsageData": {
        "Size": 10920104,
        "RefCount": 2
      }
    }
  ]
}

remote api 给出 json 数据。但我不确定如何从中获得确切的磁盘使用情况。

以前有谁有过这样的运气吗?

【问题讨论】:

    标签: docker go containers


    【解决方案1】:

    docker system df 命令仅以百分比打印可回收空间的大小。可回收是未使用的图像占用的空间,这是您可以在不破坏任何内容的情况下删除的图像的总大小。

    让我们看一下docker CLI utility 的源代码,以更好地了解docker system df 的作用。 df 的使用有两个上下文:docker imagesdocker containers。源代码是不言自明的。对于我们使用SizeRw 的容器(如果将容器与其基本映像进行比较,则为已创建或更改的文件的大小)值,以检测容器总大小与非活动容器之间的百分比差异。对于 docker 镜像,我们使用虚拟和共享大小的镜像来实现这些目的。

    因此,根据您的问题,我假设docker system df 给出的百分比数据并不是您真正需要的。据我了解,您希望获得所有容器或映像使用的总磁盘空间的百分比。

    这并不难做到。让我们获取总磁盘大小,从 docker 客户端获取 DiskUsage 结构并评估所需的百分比:

    package main
    
    import (
        "context"
        "fmt"
        "os"
    
        "github.com/docker/docker/client"
        "golang.org/x/sys/unix"
    )
    
    func main() {
        wd, err := os.Getwd()
        if err != nil {
            panic(err)
        }
    
        // Get amount of free disk space
        var stat unix.Statfs_t
        unix.Statfs(wd, &stat)
    
        // Available blocks * size per block = available space in bytes
        avail := stat.Bavail * uint64(stat.Bsize)
    
        // Create a docker client and request DiskUsage.
        // Replace this code with your own.
        cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
        if err != nil {
            panic(err)
        }
        du, err := cli.DiskUsage(context.Background())
        if err != nil {
            panic(err)
        }
    
        fmt.Printf("Available: %d bytes\n", avail)
        fmt.Printf("Space used: %f%%\n", 100-((float64)((int64)(avail)-du.LayersSize)/(float64)(avail))*100)
    }
    

    我假设您使用的是 *nix 系统。对于 Windows,您可以使用 x/sys/windows 包获取磁盘空间总量。请参阅this answer 了解更多信息。

    上面的代码打印了所有层使用的总磁盘空间的百分比。如果您需要特定容器或图像的信息,您可以使用DiskUsage struct du 中描述的in the API reference 的字段。

    我希望您可以轻松地修改这个最小的示例以适应您的任务。

    【讨论】:

      猜你喜欢
      • 2015-07-28
      • 1970-01-01
      • 2020-11-27
      • 1970-01-01
      • 2019-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-13
      相关资源
      最近更新 更多