Styring af Docker-containere i Go

Dokumentation!

Når du beslutter dig for at skrive din cykel til at hente hooks fra Docker Hub eller fra registry til automatisk opdatering/start af containerne på serveren, kan Docker CLI være nyttigt til at styre Docker-dæmonen på dit system.
Styring af Docker-containere i Go

Du skal bruge Go version 1.9.4 eller nyere.

Hvis du stadig ikke har skiftet til moduler, skal du installere CLI med følgende kommando:

go get github.com/docker/docker/client

Start af container

Det følgende eksempel viser, hvordan man starter en container ved hjælp af Docker API. I kommandoprompten ville du bruge kommandoen docker run, men vi klarer nemt denne opgave i vores service.
Dette eksempel er ækvivalent med at køre kommandoen docker run alpine echo hello world

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

    // Henter docker image
    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("Kunne ikke få porten")
    }
    portBinding := nat.PortMap{containerPort: []nat.PortBinding{hostBinding}}

    // Opretter en container med den givne 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)
    }

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

    // Henter container loggene
    out, err := cli.ContainerLogs(ctx, resp.ID, types.ContainerLogsOptions{ShowStdout: true})
    if err != nil {
        panic(err)
    }
    io.Copy(os.Stdout, out)
}

Hente liste over kørende containere

Dette eksempel er ækvivalent med at køre kommandoen 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)
    }

    // Henter liste over kørende containere (docker ps)
    containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{})
    if err != nil {
        panic(err)
    }

    // Udskriver alle container ID'er
    for _, container := range containers {
        fmt.Println(container.ID)
    }
}

Stop alle kørende containere

Når du har lært at oprette og starte containere, er det tid til at lære at administrere dem. Det næste eksempel stopper alle kørende containere.

Kør ikke denne kode i produktion serveren!

pakke main

import (
    "context"
    "fmt"

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

    // Henter listen af kørende containere (docker ps)
    containers, err := cli.ContainerList(ctx, types.ContainerListOptions{})
    if err != nil {
        panic(err)
    }

    for _, c := range containers {
        fmt.Print("Stopper container ", c.ID[:10], "... ")
        if err := cli.ContainerStop(ctx, c.ID, nil); err != nil {
            panic(err)
        }
        fmt.Println("Succes")
    }
}

Visning af logfiler for en enkelt container

Du kan arbejde med en enkelt container. I det følgende eksempel vises logfilerne for containeren med det angivne ID. Før du kører, skal du ændre container-ID'et for den container, hvis logfiler du ønsker at hente.

pakke main

import (
    "context"
    "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)
    }

    options := types.ContainerLogsOptions{ShowStdout: true}
    // Ændre container ID her
    out, err := cli.ContainerLogs(ctx, "f1064a8a4c82", options)
    if err != nil {
        panic(err)
    }
    io.Copy(os.Stdout, out)
}

Hentning af liste over billeder

Dette eksempel er ækvivalent med at køre kommandoen docker image ls

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

    // Hentning af liste over billeder
    images, err := cli.ImageList(context.Background(), types.ImageListOptions{})
    if err != nil {
        panic(err)
    }

    for _, image := range images {
        fmt.Println(image.ID)
    }
}

Pull

Dette eksempel er ækvivalent med at køre kommandoen docker pull

pakke main

import (
    "context"
    "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)
    }

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

Hentning af billede med brugergodkendelse

Dette eksempel er ækvivalent med at køre kommandoen docker pull, med godkendelse.

Godkendelsesdata sendes i klar tekst. Officielle Docker-registre bruger HTTPS,
private registre skal også være konfigureret til at overføre data ved hjælp af HTTPS.

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

    // Oprettelse af en konfiguration med legitimationsoplysninger
    authConfig := types.AuthConfig{
        Username: "brugernavn",
        Password: "adgangskode",
    }
    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)
}

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster