Go'до Docker контейнерлерин башкаруу

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

Сервердеги контейнерлерди автоматтык түрдө жаңыртуу/иштетүү үчүн докер хабынан же реестрден илгичтерди кармоо үчүн өз велосипедиңизди жазууну чечкениңизде, сиз Docker Cli системасын пайдалуу деп тапсаңыз болот, ал системаңыздагы Docker демонун башкарууга жардам берет.
Go'до Docker контейнерлерин башкаруу

Иштөө үчүн сизге 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("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)
}

Иштеп жаткан контейнерлердин тизмесин алуу

Бул мисал буйрукту иштетүүгө барабар 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("Stopping container ", c.ID[:10], "... ")
        if err := cli.ContainerStop(ctx, c.ID, nil); err != nil {
            panic(err)
        }
        fmt.Println("Success")
    }
}

Бир контейнер үчүн журналдарды көрсөтүү

Сиз жеке контейнерлер менен иштей аласыз. Төмөнкү мисал контейнер журналдарын көрсөтүлгөн идентификатор менен көрсөтөт. Баштоодон мурун, журналдарын алгыңыз келген контейнердин идентификаторун өзгөртүшүңүз керек.

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

тартуу

Бул мисал буйрукту иштетүүгө барабар 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, аутентификация менен.

Аутентификация маалыматтары ачык текстте жөнөтүлөт. Расмий докер реестри HTTPS колдонот,
жеке реестрлер да 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)
}

Source: www.habr.com

Комментарий кошуу