Heim >Backend-Entwicklung >Golang >„docker system df' und „/system/df' (Docker-API-Endpunkt)
php-Editor Yuzai ist hier, um Ihnen zwei Befehle in Docker vorzustellen: „docker system df“ und „/system/df“ (Docker-API-Endpunkt). Beide Befehle werden verwendet, um die Ressourcennutzung des Docker-Systems anzuzeigen, ihre Verwendungs- und Ergebnisanzeigemethoden unterscheiden sich jedoch geringfügig. „docker system df“ ist ein Docker-Befehl, der direkt im Terminal ausgeführt werden kann. Er zeigt die Nutzung verschiedener Ressourcen im Docker-System (einschließlich Images, Container, Datenmengen usw.) sowie die Gesamtressourcennutzung an . Und „/system/df“ ist ein Docker-API-Endpunkt, und Sie müssen relevante Informationen durch Aufrufen der API erhalten. Das Rückgabeergebnis ähnelt dem von „Docker System df“, eignet sich jedoch besser zum programmgesteuerten Ermitteln der Ressourcennutzung des Docker-Systems.
Ich schreibe ein Programm in Go, um die gesamte Festplattennutzung in GB von meinem Docker-Host abzurufen. Dafür verwende ich func DiskUsage()
aus go lib:
Wenn man sich den Code ansieht, ruft die Funktion den Docker-API-Endpunkt auf /system/df
:
Wenn ich jedoch diese Bibliothek mit der Berechnung von GB mit dem Befehl docker system df
verwende, bemerke ich ein seltsames Verhalten:
docker系统df
Ausgabe:
$ 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
Wie Sie sehen, gibt es einen Unterschied zwischen den beiden Ausgängen. Ich brauche Hilfe, um zu verstehen, ob mit meinen Berechnungen, die die Daten vom /system/df
Endpunkt abrufen, etwas nicht stimmt. Danke :)
Go-App:
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)) }
Basierend auf Docker-Quellcode:
system df
Befehl: https://github.com/docker/cli/blob/v24.0.5/cli/command/system/df.go
Mit dem folgenden Code sollten Sie in der Lage sein, genau zu reproduzieren, was docker 系统 df
tut:
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
die Gesamtgröße dar, sodass Sie diese nicht selbst berechnen müssenif !bc.Shared
)Um Größen in korrekte Einheiten umzurechnen, empfehle ich dringend die Verwendung von github.com/docker/go-units
(例如 units.HumanSize(float64(diskUsage.LayersSize))
). Das erspart Ihnen den Albtraum der Einheitenumrechnung!
Das obige ist der detaillierte Inhalt von„docker system df' und „/system/df' (Docker-API-Endpunkt). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!