Go бағдарламасында Docker контейнерлерін басқару

Құжаттама!

Сервердегі контейнерлерді автоматты түрде жаңарту/іске қосу үшін докер хабынан немесе тізілімнен ілмектерді ұстау үшін өзіңіздің велосипедіңізді жазуды шешкен кезде, жүйеңіздегі Docker демонын басқаруға көмектесетін Docker Cli пайдалы болуы мүмкін.
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

пікір қалдыру