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

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

WBOY
WBOYnach vorne
2024-02-09 16:45:08570Durchsuche

`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
    
  • My Go-Anwendungsausgabe:
    $ 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))
}

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
)
  • 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>
  • 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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen