首頁 >後端開發 >Golang >`docker system df` 與 `/system/df` (docker api 端點)

`docker system df` 與 `/system/df` (docker api 端點)

WBOY
WBOY轉載
2024-02-09 16:45:08567瀏覽

`docker system df` 与 `/system/df` (docker api 端点)

php小編魚仔在這裡為大家介紹一下docker中的兩個指令:`docker system df`和`/system/df`(docker api端點)。這兩個指令都是用來查看docker系統資源使用情況的,但是它們的使用方式和結果顯示方式略有不同。 `docker system df`是一個docker指令,可以直接在終端機中執行,它會顯示出docker系統中各個資源(包括映像、容器、資料磁碟區等)的使用情況,以及整體的資源佔用。而`/system/df`是一個docker api的端點,需要透過呼叫api來取得相關資訊。它的回傳結果與`docker system df`相似,但是更適合用於程式化的方式取得docker系統資源使用情況。

問題內容

我正在用 Go 編寫一個程序,以從我的 docker 主機獲取以 GB 為單位的總磁碟使用情況。為此,我使用 go lib 中的 func DiskUsage()

  • https://pkg.go.dev/github.com/docker/docker/client#Client.DiskUsage。

查看程式碼,該函數正在呼叫 docker api 端點 /system/df

  • https://docs.docker.com/engine/api/v1.43/#tag/System/operation/SystemDataUsage

但是,當我使用此庫與使用命令 docker system df 計算 GB 時,我注意到一個奇怪的行為:

  • docker系統df輸出:
    $ docker system df
    TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
    Images          223       4         21.02GB   20.7GB (98%)
    Containers      6         0         0B        0B
    Local Volumes   13        1         536.4MB   340.4MB (63%)
    Build Cache     954       0         13.51GB   13.51GB
    
  • My Go 應用程式輸出:
    $ go run ./cmd/main.go
    Images: TOTAL (223), 17GB
    Build Cache: TOTAL (954), 29GB
    

如您所看到的,兩個輸出之間存在差異。 我需要協助來了解我從 /system/df 端點取得資料的計算是否有問題。 謝謝:)

Go應用程式:

package main

import (
    "context"
    "fmt"

    "github.com/docker/docker/api/types"
    "github.com/docker/docker/client"
)

func main() {
    cli, err := client.NewClientWithOpts(client.FromEnv)
    if err != nil {
        panic(err)
    }

    diskUsg, err := cli.DiskUsage(context.Background(), types.DiskUsageOptions{})
    if err != nil {
        panic(err)
    }
    b := float64(0)
    for _, ch := range diskUsg.BuildCache {
        b = b + float64(ch.Size)
    }

    b2 := float64(0)
    for _, ch := range diskUsg.Images {
        if ch.Size > ch.SharedSize {
            b2 = b2 + (float64(ch.Size) - float64(ch.SharedSize))
            continue
        }
        b2 = b2 + (float64(ch.SharedSize) - float64(ch.Size))
    }

    fmt.Printf("Images: TOTAL (%d), %2.fGB\n", len(diskUsg.Images), float64(b2)/(1<<30))
    fmt.Printf("Build Cache: TOTAL (%d), %2.fGB\n", len(diskUsg.BuildCache), float64(b)/(1<<30))
}

解決方法

基於Docker原始碼:

您應該能夠使用以下程式碼準確重現 docker 系統 df 所做的事情:

  • go.mod
#
module 76982562-docker-system-df-vs-system-df-docker-api-endpoint

go 1.21.0

require (
    github.com/docker/cli v24.0.5+incompatible
    github.com/docker/docker v24.0.5+incompatible
)
  • main.go
#
<code>package main

import (
    "context"
    "fmt"
    "os"

    "github.com/docker/cli/cli/command/formatter"
    "github.com/docker/docker/api/types"
    "github.com/docker/docker/client"
    "github.com/docker/go-units"
)

func main() {
    cli, err := client.NewClientWithOpts(client.FromEnv)
    if err != nil {
        panic(err)
    }

    diskUsage, err := cli.DiskUsage(context.Background(), types.DiskUsageOptions{})
    if err != nil {
        panic(err)
    }

    var bsz int64
    for _, bc := range diskUsage.BuildCache {
        if !bc.Shared {
            bsz += bc.Size
        }
    }

    fmt.Printf("Images: TOTAL (%d), %s\n", len(diskUsage.Images), units.HumanSize(float64(diskUsage.LayersSize)))
    fmt.Printf("Build Cache: TOTAL (%d), %s\n", len(diskUsage.BuildCache), units.HumanSize(float64(bsz)))
}
</code>
  • 對於圖片,docker庫直接提供了diskUsage.LayersSize來表示總大小,所以你不用自己計算
  • 對於建置緩存,您需要排除共享項目 (if !bc.Shared)

要以正確的單位轉換大小,我強烈建議使用github.com/docker/go-units (例如units.HumanSize(float64(diskUsage.LayersSize))) 。這將避免您單位轉換的惡夢!

以上是`docker system df` 與 `/system/df` (docker api 端點)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除