Ṣiṣakoso awọn apoti Docker ni Go

Iwe aṣẹ!

Nigbati o ba pinnu lati kọ keke rẹ lati mu awọn kio lati ibudo docker tabi lati iforukọsilẹ lati ṣe imudojuiwọn laifọwọyi / bẹrẹ awọn apoti lori olupin, o le rii pe Docker Cli wulo lati ṣe iranlọwọ ṣakoso daemon Docker lori ẹrọ rẹ.
Ṣiṣakoso awọn apoti Docker ni Go

Lati ṣiṣẹ, o nilo ẹya Go o kere ju 1.9.4

Ti o ko ba ti yipada si awọn modulu, fi Cli sori ẹrọ pẹlu aṣẹ atẹle:

go get github.com/docker/docker/client

Nṣiṣẹ a eiyan

Apẹẹrẹ atẹle n fihan bi o ṣe le ṣiṣẹ apoti kan nipa lilo API Docker. Lori laini aṣẹ, iwọ yoo lo aṣẹ naa docker run, ṣugbọn a le ni irọrun farada iṣẹ yii ni iṣẹ wa.
Apẹẹrẹ yii jẹ deede si ṣiṣe pipaṣẹ naa 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)
}

Ngba akojọ kan ti nṣiṣẹ awọn apoti

Apẹẹrẹ yii jẹ deede si ṣiṣe pipaṣẹ naa 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)
    }
}

Duro gbogbo awọn apoti ti nṣiṣẹ

Ni kete ti o ti kọ bi o ṣe le ṣẹda ati ṣiṣe awọn apoti, o to akoko lati kọ ẹkọ bi o ṣe le ṣakoso wọn. Apẹẹrẹ atẹle yoo da gbogbo awọn apoti ti nṣiṣẹ duro.

Maṣe ṣiṣẹ koodu yii lori olupin iṣelọpọ!

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

Awọn akọọlẹ ti o jade ti eiyan kan

O le ṣiṣẹ pẹlu awọn apoti kọọkan. Apẹẹrẹ atẹle ṣe atẹjade awọn akọọlẹ ti eiyan pẹlu ID ti a ti sọ tẹlẹ. Ṣaaju ki o to bẹrẹ, o nilo lati yi ID ti eiyan ti awọn akọọlẹ ti o fẹ gba.

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

Gbigba atokọ ti awọn aworan

Apẹẹrẹ yii jẹ deede si ṣiṣe pipaṣẹ naa 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)
    }
}

Fa

Apẹẹrẹ yii jẹ deede si ṣiṣe pipaṣẹ naa 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)
}

Gbigba aworan kan pẹlu ijẹrisi olumulo

Apẹẹrẹ yii jẹ deede si ṣiṣe pipaṣẹ naa docker pull, pẹlu ìfàṣẹsí.

Awọn data ijẹrisi ti wa ni fifiranṣẹ ni ọrọ mimọ. Awọn iforukọsilẹ docker osise lo HTTPS,
Awọn iforukọsilẹ ikọkọ gbọdọ tun tunto lati ṣe ibaraẹnisọrọ nipa lilo 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)
}

orisun: www.habr.com

Fi ọrọìwòye kun