Go ۾ ڊاکر ڪنٽينرز جو انتظام

دستاويز!

جڏهن توهان فيصلو ڪيو ته توهان جي پنهنجي سائيڪل کي پڪڙڻ لاءِ ڊڪر هب يا رجسٽري کان پاڻمرادو تازه ڪاري / سرور تي ڪنٽينرز هلائڻ لاءِ، توهان کي ڳولي سگهو ٿا ڊڪر ڪلي مفيد، جيڪو توهان جي سسٽم تي ڊڪر ڊيمن کي منظم ڪرڻ ۾ مدد ڪندو.
Go ۾ ڊاکر ڪنٽينرز جو انتظام

ڪم ڪرڻ لاءِ توھان کي ضرورت پوندي Go ورجن 1.9.4 کان گھٽ نه آھي

جيڪڏهن توهان اڃا تائين ماڊلز کي تبديل نه ڪيو آهي، ڪلائي کي هيٺ ڏنل حڪم سان انسٽال ڪريو:

go get github.com/docker/docker/client

ڪنٽينر هلائڻ

هيٺ ڏنل مثال ڏيکاري ٿو ته ڊڪر 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

تبصرو شامل ڪريو