Go-da Docker konteynerlərinin idarə edilməsi

Sənədlər!

Serverdəki konteynerləri avtomatik yeniləmək/çalışdırmaq üçün docker hub-dan və ya reyestrdən qarmaqları tutmaq üçün öz velosipedinizi yazmağa qərar verdiyiniz zaman sisteminizdə Docker demonunu idarə etməyə kömək edəcək Docker Cli-ni faydalı tapa bilərsiniz.
Go-da Docker konteynerlərinin idarə edilməsi

İşləmək üçün sizə 1.9.4-dən aşağı olmayan Go versiyası lazımdır

Əgər hələ də modullara keçməmisinizsə, Cli-ni aşağıdakı əmrlə quraşdırın:

go get github.com/docker/docker/client

Konteyneri idarə etmək

Aşağıdakı nümunə Docker API istifadə edərək konteynerin necə işlədiləcəyini göstərir. Komanda xəttində əmrdən istifadə edərdiniz docker run, lakin xidmətimizdə bu işin öhdəsindən asanlıqla gələ bilərik.
Bu nümunə əmri yerinə yetirməyə bərabərdir 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 konteynerlərin siyahısını əldə etmək

Bu nümunə əmri yerinə yetirməyə bərabərdir 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)
    }
}

Bütün işləyən konteynerlərin dayandırılması

Konteynerləri necə yaratmağı və idarə etməyi öyrəndikdən sonra onları necə idarə etməyi öyrənməyin vaxtı gəldi. Aşağıdakı nümunə bütün işləyən konteynerləri dayandıracaq.

Bu kodu istehsal serverində işlətməyin!

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

Tək konteyner üçün qeydlər göstərilir

Fərdi qablarla işləyə bilərsiniz. Aşağıdakı nümunə müəyyən identifikatorla konteyner qeydlərini göstərir. Başlamazdan əvvəl qeydlərini almaq istədiyiniz konteynerin identifikatorunu dəyişdirməlisiniz.

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

Şəkillərin siyahısının alınması

Bu nümunə əmri yerinə yetirməyə bərabərdir 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)
    }
}

Çəkmək

Bu nümunə əmri yerinə yetirməyə bərabərdir 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)
}

İstifadəçi identifikasiyası ilə şəkil endirilir

Bu nümunə əmri yerinə yetirməyə bərabərdir docker pull, autentifikasiya ilə.

Doğrulama məlumatları aydın mətnlə göndərilir. Rəsmi docker reyestri HTTPS-dən istifadə edir,
şəxsi registrlər də HTTPS istifadə edərək məlumat ötürmək üçün konfiqurasiya edilməlidir.

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

Mənbə: www.habr.com

Добавить комментарий