Docker konteineru pārvaldība pakalpojumā Go

Dokumentācija!

Kad nolemjat rakstīt savu velosipēdu, lai noķertu āķus no Docker centrmezgla vai no reģistra, lai automātiski atjauninātu/startētu konteinerus serverī, Docker Cli var noderēt, lai palīdzētu pārvaldīt Docker dēmonu jūsu sistēmā.
Docker konteineru pārvaldība pakalpojumā Go

Lai strādātu, ir nepieciešama Go versija vismaz 1.9.4

Ja joprojām neesat pārslēdzies uz moduļiem, instalējiet Cli ar šādu komandu:

go get github.com/docker/docker/client

Konteinera palaišana

Šajā piemērā parādīts, kā palaist konteineru, izmantojot Docker API. Komandrindā jūs izmantotu komandu docker run, taču mēs varam viegli tikt galā ar šo uzdevumu mūsu pakalpojumā.
Šis piemērs ir līdzvērtīgs komandas palaišanai docker run alpine echo hello world

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

    // Делаем 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("Unable to get the port")
    }
    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)
}

Darbojošo konteineru saraksta iegūšana

Šis piemērs ir līdzvērtīgs komandas palaišanai 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)
    }

    // Получение списка запуцщенных контейнеров(docker ps)
    containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{})
    if err != nil {
        panic(err)
    }

    // Вывод всех идентификаторов контейнеров
    for _, container := range containers {
        fmt.Println(container.ID)
    }
}

Apturiet visus darbojošos konteinerus

Tagad, kad esat iemācījies izveidot un palaist konteinerus, ir pienācis laiks uzzināt, kā tos pārvaldīt. Šis piemērs apturēs visus darbojošos konteinerus.

Nepalaidiet šo kodu ražošanas serverī!

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

    // Получение списка запуцщенных контейнеров(docker ps)
    containers, err := cli.ContainerList(ctx, types.ContainerListOptions{})
    if err != nil {
        panic(err)
    }

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

Viena konteinera izvades žurnāli

Jūs varat strādāt ar atsevišķiem konteineriem. Nākamajā piemērā tiek izvadīti konteinera žurnāli ar norādīto ID. Pirms darba sākšanas ir jāmaina konteinera ID, kura žurnālus vēlaties iegūt.

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}
    // Измените id контейнера здесь
    out, err := cli.ContainerLogs(ctx, "f1064a8a4c82", options)
    if err != nil {
        panic(err)
    }
    io.Copy(os.Stdout, out)
}

Attēlu saraksta iegūšana

Šis piemērs ir līdzvērtīgs komandas palaišanai 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)
    }

    // Получение списка образов
    images, err := cli.ImageList(context.Background(), types.ImageListOptions{})
    if err != nil {
        panic(err)
    }

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

Vilkt

Šis piemērs ir līdzvērtīgs komandas palaišanai 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)
}

Attēla lejupielāde ar lietotāja autentifikāciju

Šis piemērs ir līdzvērtīgs komandas palaišanai docker pull, ar autentifikāciju.

Autentifikācijas dati tiek nosūtīti skaidrā tekstā. Oficiālie dokeru reģistri izmanto HTTPS,
privātie reģistri ir arī jākonfigurē, lai sazinātos, izmantojot 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)
    }

    // Создание конфига с данными для аутентификации
    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)
}

Avots: www.habr.com

Pievieno komentāru