Управление на Docker контейнери в Go

Документация!

Когато решите да напишете своя велосипед по ловене на хукове от docker hub или от registry за автоматично обновление/стартиране на контейнери на сървъра, може да ви е полезен Docker CLI, който ще ви помогне да управлявате демона Docker във вашата система.
Управление на Docker контейнери в Go

За работа ще ви е необходим Go версия не по-ниска от 1.9.4

Ако все още не сте преминали на модули, инсталирайте CLI с следната команда:

go get github.com/docker/docker/client

Стартиране на контейнера

Следващият пример показва как да стартирате контейнер с помощта на Docker API. В командния ред бихте използвали командата docker run, но ние лесно можем да се справим с тази задача в нашия сервис.
Този пример е еквивалентен на стартирането на командата 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("Неуспех при получаването на порта")
    }
    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)
}

Получаване на списък с активни контейнери

Този пример е еквивалентен на стартирането на командата 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)
    }
}

Спиране на всички активни контейнери

След като научихте как да създавате и стартирате контейнери, време е да научите как да ги управлявате. Следващият пример ще спре всички активни контейнери.

Не стартирайте този код в продукция сървър!

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("Спиране на контейнер ", c.ID[:10], "... ")
        if err := cli.ContainerStop(ctx, c.ID, nil); err != nil {
            panic(err)
        }
        fmt.Println("Успех")
    }
}

Извеждане на логовете на отделен контейнер

Можете да работите с отделни контейнери. В следващия пример се извеждат логовете на контейнера с посочения идентификатор. Преди стартиране, трябва да промените идентификатора на контейнера, чийто логове искате да получите.

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

Получаване на списък с изображения

Този пример е еквивалентен на стартирането на командата 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)
    }
}

Pull

Този пример е еквивалентен на стартирането на командата 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)
}

Изтегляне на изображение с удостоверяване на потребителя

Този пример е еквивалентен на стартирането на командата docker pull, с удостоверяване.

Данните за удостоверяване се изпращат в открит вид. Официалнитеdocker registry използват HTTPS,
частните registry също трябва да бъдат настроени за предаване на данни с използване на HTTPS.

пакет основен

импорт (
    "контекст"
    "кодиране/base64"
    "кодиране/json"
    "io"
    "os"

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

функция основна() {
    ctx := контекст.Фон()
    cli, err := client.NewEnvClient()
    ако err != nil {
        паника(err)
    }

    // Създаване на конфиг с данни за удостоверяване
    authConfig := types.AuthConfig{
        Потребителско име: "username",
        Парола: "password",
    }
    encodedJSON, err := json.Marshal(authConfig)
    ако err != nil {
        паника(err)
    }
    authStr := base64.URLEncoding.EncodeToString(encodedJSON)

    out, err := cli.ImagePull(ctx, "docker.io/library/alpine", types.ImagePullOptions{RegistryAuth: authStr})
    ако err != nil {
        паника(err)
    }

    отложи out.Close()
    io.Copy(os.Stdout, out)
}

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster