Heim > Backend-Entwicklung > Golang > „docker system df' und „/system/df' (Docker-API-Endpunkt)

„docker system df' und „/system/df' (Docker-API-Endpunkt)

WBOY
Freigeben: 2024-02-09 16:45:08
nach vorne
583 Leute haben es durchsucht

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

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.

Frageninhalt

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:

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

Wenn man sich den Code ansieht, ruft die Funktion den Docker-API-Endpunkt auf /system/df:

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

Wenn ich jedoch diese Bibliothek mit der Berechnung von GB mit dem Befehl docker system df verwende, bemerke ich ein seltsames Verhalten:

  • docker系统dfAusgabe:
    $ 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
    
    Nach dem Login kopieren
  • My Go-Anwendungsausgabe:
    $ go run ./cmd/main.go
    Images: TOTAL (223), 17GB
    Build Cache: TOTAL (954), 29GB
    
    Nach dem Login kopieren

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))
}

Nach dem Login kopieren

Lösung

Basierend auf Docker-Quellcode:

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
)
Nach dem Login kopieren
  • 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>
Nach dem Login kopieren
  • Bei Bildern stellt docker库直接提供了diskUsage.LayersSize die Gesamtgröße dar, sodass Sie diese nicht selbst berechnen müssen
  • Für den Build-Cache müssen Sie freigegebene Projekte ausschließen (if !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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage