Hantera Docker-behÄllare i Go

Dokumentation!

NÀr du bestÀmmer dig för att skriva din egen cykel för att hÀmta hooks frÄn Docker Hub eller frÄn registry för automatisk uppdatering/start av containrar pÄ servern kan Docker CLI vara till hjÀlp, vilket gör att du kan hantera Docker-demonen i ditt system.
Hantera Docker-behÄllare i Go

För att arbeta behövs Go-version inte lÀgre Àn 1.9.4

Om du fortfarande inte har övergÄtt till moduler, installera CLI med följande kommando:

go get github.com/docker/docker/client

Starta containern

Följande exempel visar hur man startar en container med hjÀlp av Docker API. I kommandoraden skulle du anvÀnda kommandot docker run, men vi klarar lÀtt av denna uppgift i vÄr tjÀnst.
Detta exempel Àr ekvivalent med att köra kommandot docker run alpine echo hello world

package main {
    ctx := context.Background()
    cli, err := client.NewEnvClient()
    if err != nil {
        panic(err)
    }

    // Gör docker pull
    reader, err := cli.ImagePull(ctx, "docker.io/library/alpine", types.ImagePullOptions{})
    if err != nil {
        panic(err)
    }
    io.Copy(os.Stdout, reader)

    hostBinding := nat.PortBinding{
        HostIP:   "0.0.0.0",
        HostPort: "8000",
    }
    containerPort, err := nat.NewPort("tcp", "80")
    if err != nil {
        panic("Kunde inte fÄ porten")
    }
    portBinding := nat.PortMap{containerPort: []nat.PortBinding{hostBinding}}

    // Skapa en container med angiven konfiguration
    resp, err := cli.ContainerCreate(ctx, &container.Config{
        Image: "alpine",
        Cmd:   []string{"echo", "hello world"},
        Tty:   true,
    }, &container.HostConfig{
        PortBindings: portBinding,
    }, nil, "")
    if err != nil {
        panic(err)
    }

    // Starta containern
    if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil {
        panic(err)
    }

    // FĂ„ containerns loggar
    out, err := cli.ContainerLogs(ctx, resp.ID, types.ContainerLogsOptions{ShowStdout: true})
    if err != nil {
        panic(err)
    }
    io.Copy(os.Stdout, out)
}

HÀmtning av listan över aktiva containrar

Detta exempel Àr ekvivalent med att köra kommandot docker ps

package main

import (
    "context"
    "fmt"

    "github.com/docker/docker/api/types"
    "github.com/docker/docker/client"
)

func main() {
    cli, err := client.NewEnvClient()
    if err != nil {
        panic(err)
    }

    // HÀmta listan över aktiva containrar (docker ps)
    containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{})
    if err != nil {
        panic(err)
    }

    // Skriv ut alla container-ID:n
    for _, container := range containers {
        fmt.Println(container.ID)
    }
}

Stoppa alla aktiva containrar

Efter att du har lÀrt dig att skapa och starta containrar Àr det dags att lÀra sig att hantera dem. NÀsta exempel stoppar alla aktiva containrar.

Kör inte denna kod i produktion servern!

paket huvud

import (
    "context"
    "fmt"

    "github.com/docker/docker/api/types"
    "github.com/docker/docker/client"
)

funktion huvud() {
    ctx := context.Background()
    cli, err := client.NewEnvClient()
    if err != nil {
        panic(err)
    }

    // HÀmtning av lista över körande containrar (docker ps)
    containrar, err := cli.ContainerList(ctx, types.ContainerListOptions{})
    if err != nil {
        panic(err)
    }

    för _, c := range containrar {
        fmt.Print("Stoppar container ", c.ID[:10], "... ")
        if err := cli.ContainerStop(ctx, c.ID, nil); err != nil {
            panic(err)
        }
        fmt.Println("Lyckades")
    }
}

Utskrift av loggar för enskild container

Du kan arbeta med enskilda containrar. I följande exempel skrivs loggarna för containern med det angivna ID:t ut. Innan du kör det mÄste du Àndra containerns ID vars loggar du vill hÀmta.

paket huvud

import (
    "context"
    "io"
    "os"

    "github.com/docker/docker/api/types"
    "github.com/docker/docker/client"
)

funktion huvud() {
    ctx := context.Background()
    cli, err := client.NewEnvClient()
    if err != nil {
        panic(err)
    }

    options := types.ContainerLogsOptions{ShowStdout: true}
    // Ändra ID för containern hĂ€r
    out, err := cli.ContainerLogs(ctx, "f1064a8a4c82", options)
    if err != nil {
        panic(err)
    }
    io.Copy(os.Stdout, out)
}

HÀmtning av lista över bilder

Detta exempel Àr ekvivalent med att köra kommandot docker image ls

paket huvud

import (
    "context"
    "fmt"

    "github.com/docker/docker/api/types"
    "github.com/docker/docker/client"
)

funktion huvud() {
    cli, err := client.NewEnvClient()
    if err != nil {
        panic(err)
    }

    // HÀmtning av lista över bilder
    bilder, err := cli.ImageList(context.Background(), types.ImageListOptions{})
    if err != nil {
        panic(err)
    }

    för _, bild := range bilder {
        fmt.Println(bild.ID)
    }
}

Pull

Detta exempel Àr ekvivalent med att köra kommandot docker pull

paket huvud

import (
    "context"
    "io"
    "os"

    "github.com/docker/docker/api/types"
    "github.com/docker/docker/client"
)

funktion huvud() {
    ctx := context.Background()
    cli, err := client.NewEnvClient()
    if err != nil {
        panic(err)
    }

    // docker pull alpine
    out, err := cli.ImagePull(ctx, "docker.io/library/alpine", types.ImagePullOptions{})
    if err != nil {
        panic(err)
    }
    defer out.Close()
    io.Copy(os.Stdout, out)
}

Nedladdning av bild med anvÀndarauthentisering

Detta exempel Àr ekvivalent med att köra kommandot docker pull, med autentisering.

Autentiseringsuppgifterna skickas i klartext. Officiella docker-registry anvÀnder HTTPS,
privata registry bör ocksÄ konfigureras för att överföra data med hjÀlp av HTTPS.

package main

import (
    "context"
    "encoding/base64"
    "encoding/json"
    "io"
    "os"

    "github.com/docker/docker/api/types"
    "github.com/docker/docker/client"
)

func main() {
    ctx := context.Background()
    cli, err := client.NewEnvClient()
    if err != nil {
        panic(err)
    }

    // Skapa en konfiguration för autentiseringsdata
    authConfig := types.AuthConfig{
        Username: "username",
        Password: "password",
    }
    encodedJSON, err := json.Marshal(authConfig)
    if err != nil {
        panic(err)
    }
    authStr := base64.URLEncoding.EncodeToString(encodedJSON)

    out, err := cli.ImagePull(ctx, "docker.io/library/alpine", types.ImagePullOptions{RegistryAuth: authStr})
    if err != nil {
        panic(err)
    }

    defer out.Close()
    io.Copy(os.Stdout, out)
}

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster