مدیریت کانتینرهای Docker در Go

مستندات!

هنگامی که تصمیم می گیرید دوچرخه خود را برای گرفتن قلاب از داکر هاب یا از رجیستری بنویسید تا به طور خودکار کانتینرها را روی سرور به روز کنید/اجرا کنید، ممکن است Docker Cli برای شما مفید باشد که به مدیریت شبح داکر در سیستم شما کمک می کند.
مدیریت کانتینرهای 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("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، با احراز هویت

داده های احراز هویت به صورت متن واضح ارسال می شود. رجیستری رسمی docker از 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)
}

منبع: www.habr.com

اضافه کردن نظر