Go дахь Docker контейнеруудыг удирдах

Баримт бичиг!

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

Ажиллахын тулд танд 1.9.4-ээс доошгүй Go хувилбар хэрэгтэй болно

Хэрэв та модуль руу шилжиж амжаагүй бол 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")
    }
}

Нэг контейнерт зориулсан логуудыг харуулж байна

Та бие даасан савтай ажиллах боломжтой. Дараах жишээнд заасан танигчтай контейнерийн бүртгэлийг харуулав. Эхлэхээсээ өмнө бүртгэлийг хүлээн авахыг хүсч буй контейнерийн 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)
}

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх