Docker konténerek kezelése Go-ban

Dokumentáció!

Amikor úgy dönt, hogy megírja a Docker Hub-ból vagy a registryből való horgok lehorgászását, hogy automatikusan frissítse és indítsa a konténereket a szerveren, hasznos lehet a Docker CLI, amely segít kezelni a Docker démonját a rendszerben.
Docker konténerek kezelése Go-ban

A munka elindításához legalább 1.9.4-es Go verzió szükséges.

Ha még nem tért át a modulokra, telepítse a CLI-t a következő parancs segítségével:

go get github.com/docker/docker/client

Konténer indítása

A következő példa bemutatja, hogyan indítsunk el egy konténert a Docker API segítségével. A parancssorban a következő parancsot használná: docker run, de ezt a feladatot könnyedén megoldhatjuk a szolgáltatásunkban.
Ez a példa egyenértékű a következő parancs futtatásával: docker run alpine echo hello world

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

    
    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("Nem sikerült megszerezni a portot")
    }
    portBinding := nat.PortMap{containerPort: []nat.PortBinding{hostBinding}}

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

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

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

Futtatott konténerek listaának lekérdezése

Ez a példa egyenértékű a következő parancs futtatásával: 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)
    }

    
    containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{})
    if err != nil {
        panic(err)
    }

    
    for _, container := range containers {
        fmt.Println(container.ID)
    }
}

Minden futó konténer leállítása

Miután megtanulta, hogyan kell létrehozni és futtatni a konténereket, itt az ideje, hogy megtanulja, hogyan kezelje őket. A következő példa leállít minden futó konténert.

Ne futtassa ezt a kódot éles környezetben. szerveren!

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

    // Az futó konténerek listájának lekérése (docker ps)
    containers, err := cli.ContainerList(ctx, types.ContainerListOptions{})
    if err != nil {
        panic(err)
    }

    for _, c := range containers {
        fmt.Print("Konténer leállítása ", c.ID[:10], "... ")
        if err := cli.ContainerStop(ctx, c.ID, nil); err != nil {
            panic(err)
        }
        fmt.Println("Siker")
    }
}

Egy adott konténer naplóinak kimenete

Egy adott konténerrel dolgozhat. A következő példában a megadott azonosítójú konténer naplói jelennek meg. A futtatás előtt módosítania kell a konténer azonosítóját, amelynek a naplóit szeretné megkapni.

package 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}
    // Itt módosítsa a konténer ID-ját
    out, err := cli.ContainerLogs(ctx, "f1064a8a4c82", options)
    if err != nil {
        panic(err)
    }
    io.Copy(os.Stdout, out)
}

Képek listájának lekérése

Ez a példa egyenértékű a következő parancs futtatásával: docker image ls

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

    // A képek listájának lekérése
    images, err := cli.ImageList(context.Background(), types.ImageListOptions{})
    if err != nil {
        panic(err)
    }

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

Húzás

Ez a példa egyenértékű a következő parancs futtatásával: docker pull

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

Kép letöltése felhasználói hitelesítéssel

Ez a példa egyenértékű a következő parancs futtatásával: docker pull, a hitelesítéssel.

A hitelesítési adatok nyílt szövegben kerülnek elküldésre. A hivatalos docker registry-k HTTPS-t használnak,
a magán registry-ket is HTTPS használatára kell beállítani.

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

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

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster