目錄
問題內容
解決方法
首頁 後端開發 Golang `docker system df` 與 `/system/df` (docker api 端點)

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

Feb 09, 2024 pm 04:45 PM

`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 (
    &quot;context&quot;
    &quot;fmt&quot;
    &quot;os&quot;

    &quot;github.com/docker/cli/cli/command/formatter&quot;
    &quot;github.com/docker/docker/api/types&quot;
    &quot;github.com/docker/docker/client&quot;
    &quot;github.com/docker/go-units&quot;
)

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(&quot;Images: TOTAL (%d), %s\n&quot;, len(diskUsage.Images), units.HumanSize(float64(diskUsage.LayersSize)))
    fmt.Printf(&quot;Build Cache: TOTAL (%d), %s\n&quot;, 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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章標籤

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Go語言包導入:帶下劃線和不帶下劃線的區別是什麼? Go語言包導入:帶下劃線和不帶下劃線的區別是什麼? Mar 03, 2025 pm 05:17 PM

Go語言包導入:帶下劃線和不帶下劃線的區別是什麼?

Beego框架中NewFlash()函數如何實現頁面間短暫信息傳遞? Beego框架中NewFlash()函數如何實現頁面間短暫信息傳遞? Mar 03, 2025 pm 05:22 PM

Beego框架中NewFlash()函數如何實現頁面間短暫信息傳遞?

Go語言中如何將MySQL查詢結果List轉換為自定義結構體切片? Go語言中如何將MySQL查詢結果List轉換為自定義結構體切片? Mar 03, 2025 pm 05:18 PM

Go語言中如何將MySQL查詢結果List轉換為自定義結構體切片?

如何編寫模擬對象和存根以進行測試? 如何編寫模擬對象和存根以進行測試? Mar 10, 2025 pm 05:38 PM

如何編寫模擬對象和存根以進行測試?

如何定義GO中仿製藥的自定義類型約束? 如何定義GO中仿製藥的自定義類型約束? Mar 10, 2025 pm 03:20 PM

如何定義GO中仿製藥的自定義類型約束?

您如何在GO中編寫單元測試? 您如何在GO中編寫單元測試? Mar 21, 2025 pm 06:34 PM

您如何在GO中編寫單元測試?

Go語言如何便捷地寫入文件? Go語言如何便捷地寫入文件? Mar 03, 2025 pm 05:15 PM

Go語言如何便捷地寫入文件?

如何使用跟踪工具了解GO應用程序的執行流? 如何使用跟踪工具了解GO應用程序的執行流? Mar 10, 2025 pm 05:36 PM

如何使用跟踪工具了解GO應用程序的執行流?

See all articles