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()
:
查看程式碼,該函數正在呼叫 docker api 端點 /system/df
:
但是,當我使用此庫與使用命令 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
$ 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原始碼:
system df
指令:https:/ /github.com/docker/cli/blob/v24.0.5/cli/command/system/df.go
您應該能夠使用以下程式碼準確重現 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中文網其他相關文章!