በ Go ውስጥ Docker ኮንቴይነሮችን ማስተዳደር

ሰነድ!

መንጠቆዎችን ከመክተቻው ማዕከል ወይም ከመዝገቡ ላይ ለመፃፍ ብስክሌትዎን ለመፃፍ ሲወስኑ ኮንቴይነሮችን በራስ ሰር ለማዘመን/በአገልጋዩ ላይ ለመጀመር Docker Cli በሲስተምዎ ላይ ያለውን የዶከር ዴሞን ለማስተዳደር ሊረዳዎ ይችላል።
በ Go ውስጥ Docker ኮንቴይነሮችን ማስተዳደር

ለመስራት የGo ስሪት ቢያንስ 1.9.4 ያስፈልግዎታል

አሁንም ወደ ሞጁሎች ካልተቀየሩ ክሊን በሚከተለው ትዕዛዝ ይጫኑ፡

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 ይጠቀማሉ፣
የግል መዝገቦች ኤችቲቲፒኤስን በመጠቀም ለመገናኘት መዋቀር አለባቸው።

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

ምንጭ: hab.com

አስተያየት ያክሉ