گو میں ڈوکر کنٹینرز کا انتظام کرنا

دستاویزی!

جب آپ ڈوکر ہب یا رجسٹری سے سرور پر کنٹینرز کو خود بخود اپ ڈیٹ/اسٹارٹ کرنے کے لیے اپنی بائیک کو لکھنے کا فیصلہ کرتے ہیں، تو آپ کے سسٹم پر Docker ڈیمون کا انتظام کرنے میں مدد کے لیے ایک Docker Cli کام آ سکتا ہے۔
گو میں ڈوکر کنٹینرز کا انتظام کرنا

کام کرنے کے لیے، آپ کو کم از کم 1.9.4 گو ورژن کی ضرورت ہے۔

اگر آپ نے ابھی تک ماڈیولز پر سوئچ نہیں کیا ہے تو درج ذیل کمانڈ کے ساتھ Cli کو انسٹال کریں:

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 کے ساتھ آؤٹ پٹ کرتی ہے۔ لانچ کرنے سے پہلے، آپ کو اس کنٹینر کی 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

نیا تبصرہ شامل کریں