Идоракунии контейнерҳои Docker дар Go

Ҳуҷҷат!

Вақте ки шумо қарор медиҳед, ки велосипеди шахсии худро барои гирифтани қалмоқҳо аз маркази докер ё реестр барои ба таври худкор навсозӣ/кор кардани контейнерҳо дар сервер нависед, шумо метавонед Docker Cli-ро муфид ёбед, ки он ба идоракунии демони Docker дар системаи шумо кӯмак мекунад.
Идоракунии контейнерҳои Docker дар Go

Барои кор ба шумо версияи Go лозим аст, ки на камтар аз 1.9.4

Агар шумо то ҳол ба модулҳо нагузашта бошед, Cli-ро бо фармони зерин насб кунед:

go get github.com/docker/docker/client

Кори контейнер

Мисоли зерин нишон медиҳад, ки чӣ гуна контейнерро бо истифодаи API Docker иҷро кардан мумкин аст. Дар сатри фармон шумо фармонро истифода мебаред 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")
    }
}

Намоиши гузоришҳо барои як контейнер

Шумо метавонед бо контейнерҳои инфиродӣ кор кунед. Мисоли зерин гузоришҳои контейнерро бо идентификатори муайяншуда нишон медиҳад. Пеш аз оғоз, шумо бояд ID-и контейнерро, ки сабтҳои онро гирифтан мехоҳед, тағир диҳед.

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

Манбаъ: will.com

Илова Эзоҳ