Go හි 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")
    }
}

තනි කන්ටේනරයක නිමැවුම් ලොග්

ඔබට තනි බහාලුම් සමඟ වැඩ කළ හැකිය. පහත උදාහරණය මඟින් නිශ්චිත හැඳුනුම්පත සහිත බහාලුම් ලොග් ප්‍රතිදානය කරයි. ආරම්භ කිරීමට පෙර, ඔබට ලබා ගැනීමට අවශ්‍ය කන්ටේනරයේ හැඳුනුම්පත වෙනස් කළ යුතුය.

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

අදහස් එක් කරන්න