Birêvebirina konteynerên Docker li Go

Documentation!

Gava ku hûn biryar didin ku hûn bisîklêta xwe ji bo girtina çengelan ji navenda dockerê an ji qeydê binivîsin da ku bixweber konteynerên li ser serverê nûve bikin/rêvebirin, dibe ku hûn Docker Cli kêrhatî bibînin, ku dê ji we re bibe alîkar ku daemonê Docker-ê li ser pergala we birêve bibe.
Birêvebirina konteynerên Docker li Go

Ji bo xebatê hûn ê hewceyê guhertoya Go ne ji 1.9.4 kêmtir bin

Ger we hîn jî neguherî modulan, Cli bi fermana jêrîn saz bikin:

go get github.com/docker/docker/client

Konteynir dimeşîne

Mînaka jêrîn destnîşan dike ka meriv çawa konteynir bi karanîna Docker API-ê dimeşîne. Li ser rêza fermanê hûn ê fermanê bikar bînin docker run, lê em dikarin di xizmeta xwe de bi hêsanî bi vî karî rabin.
Ev nimûne bi xebitandina fermanê re wekhev e 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)
}

Danîna navnîşek konteynerên xebitandinê

Ev nimûne bi xebitandina fermanê re wekhev e 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)
    }
}

Rawestandina hemî konteynerên ku diçin

Gava ku we fêr kir ku meriv çawa konteyneran biafirîne û bi rê ve bibe, wextê wê ye ku hûn fêr bibin ka meriv wan çawa çawa birêve dibe. Mînaka jêrîn dê hemî konteynerên xebitandinê rawestîne.

Vê kodê li ser serverek hilberandinê nemeşînin!

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

Nîşandana têketinên ji bo konteynirek yekane

Hûn dikarin bi konteynerên kesane re bixebitin. Mînaka jêrîn têketinên konteynerê bi nasnavê diyarkirî nîşan dide. Berî ku hûn dest pê bikin, hûn hewce ne ku nasnameya konteynera ku têketinên ku hûn dixwazin bistînin biguhezînin.

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

Danîna navnîşek wêneyan

Ev nimûne bi xebitandina fermanê re wekhev e 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)
    }
}

Kişandin

Ev nimûne bi xebitandina fermanê re wekhev e 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)
}

Daxistina wêneyek bi piştrastkirina bikarhêner

Ev nimûne bi xebitandina fermanê re wekhev e docker pull, bi erêkirinê.

Daneyên erêkirinê bi nivîsek zelal têne şandin. Registry docker ya fermî HTTPS bikar tîne,
divê qeydên taybet jî werin mîheng kirin ku daneyan bi karanîna HTTPS veguhezînin.

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

Source: www.habr.com

Add a comment