Go'da Docker kapsayıcılarını yönetme

Belgeler!

Sunucudaki kapsayıcıları otomatik olarak güncellemek/çalıştırmak için docker hub'ından veya kayıt defterinden kancaları yakalamak için kendi bisikletinizi yazmaya karar verdiğinizde, sisteminizdeki Docker arka plan programını yönetmenize yardımcı olacak Docker Cli'yi yararlı bulabilirsiniz.
Go'da Docker kapsayıcılarını yönetme

Çalışmak için 1.9.4'ten düşük olmayan Go sürümüne ihtiyacınız olacak

Hala modüllere geçmediyseniz aşağıdaki komutla Cli'yi yükleyin:

go get github.com/docker/docker/client

Konteyner çalıştırma

Aşağıdaki örnek, Docker API'sini kullanarak bir konteynerin nasıl çalıştırılacağını gösterir. Komut satırında şu komutu kullanırsınız: docker run, ancak hizmetimizde bu görevin üstesinden kolaylıkla gelebiliriz.
Bu örnek, komutu çalıştırmaya eşdeğerdir 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)
}

Çalışan konteynerlerin listesini alma

Bu örnek, komutu çalıştırmaya eşdeğerdir 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)
    }
}

Çalışan tüm konteynerlerin durdurulması

Container'ları nasıl oluşturup çalıştıracağınızı öğrendikten sonra, onları nasıl yöneteceğinizi öğrenmenin zamanı geldi. Aşağıdaki örnek, çalışan tüm kapsayıcıları durduracaktır.

Bu kodu bir üretim sunucusunda çalıştırmayın!

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

Tek bir kapsayıcıya ilişkin günlükleri görüntüleme

Bireysel kaplarla çalışabilirsiniz. Aşağıdaki örnek, belirtilen tanımlayıcıya sahip konteyner günlüklerini görüntüler. Başlamadan önce loglarını almak istediğiniz konteynerin ID’sini değiştirmeniz gerekmektedir.

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

Resimlerin bir listesini alma

Bu örnek, komutu çalıştırmaya eşdeğerdir 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)
    }
}

Çekme

Bu örnek, komutu çalıştırmaya eşdeğerdir 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)
}

Kullanıcı kimlik doğrulamasıyla bir görüntüyü indirme

Bu örnek, komutu çalıştırmaya eşdeğerdir docker pull, kimlik doğrulama ile.

Kimlik doğrulama verileri açık metin olarak gönderilir. Resmi liman işçisi kayıt defteri HTTPS'yi kullanır,
özel kayıtların da verileri HTTPS kullanarak aktaracak şekilde yapılandırılması gerekir.

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

Kaynak: habr.com

Yorum ekle