Ngatur wadah Docker di Go

Dokuméntasi!

Lamun anjeun mutuskeun nulis sapédah sorangan pikeun nyekel hook ti hub docker atanapi ti pendaptaran pikeun otomatis ngamutahirkeun / ngajalankeun peti dina server, Anjeun bisa manggihan nu Docker Cli mangpaat, nu bakal nulungan ngatur daemon Docker on sistem Anjeun.
Ngatur wadah Docker di Go

Pikeun damel anjeun peryogi versi Go henteu langkung handap tina 1.9.4

Upami anjeun masih teu acan ngalih ka modul, pasang Cli nganggo paréntah di handap ieu:

go get github.com/docker/docker/client

Ngajalankeun wadah

Conto di handap ieu nunjukkeun kumaha ngajalankeun wadah nganggo Docker API. Dina garis paréntah anjeun bakal nganggo paréntah docker run, tapi urang bisa kalayan gampang Cope jeung tugas ieu dina layanan urang.
Conto ieu sami sareng ngajalankeun paréntah 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)
}

Meunang daptar wadah ngajalankeun

Conto ieu sami sareng ngajalankeun paréntah 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)
    }
}

Ngeureunkeun sagala wadah ngajalankeun

Sakali anjeun geus diajar kumaha carana nyieun jeung ngajalankeun peti, éta waktu pikeun neuleuman kumaha carana ngatur eta. Conto di handap ieu bakal ngeureunkeun sadaya wadah anu ngajalankeun.

Ulah ngajalankeun kode ieu dina server produksi!

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

Mintonkeun log pikeun wadah tunggal

Anjeun tiasa dianggo kalayan wadahna individu. Conto di handap ieu mintonkeun log wadahna sareng identifier anu ditangtukeun. Sateuacan ngamimitian, anjeun kedah ngarobih ID wadah anu log anu anjeun hoyong tampa.

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

Meunang daptar gambar

Conto ieu sami sareng ngajalankeun paréntah 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)
    }
}

Betot

Conto ieu sami sareng ngajalankeun paréntah 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)
}

Ngundeur hiji gambar kalawan auténtikasi pamaké

Conto ieu sami sareng ngajalankeun paréntah docker pull, kalawan auténtikasi.

Data auténtikasi dikirim dina téks anu jelas. Pendaptaran docker resmi nganggo HTTPS,
pendaptaran swasta ogé kudu ngonpigurasi pikeun mindahkeun data maké 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)
}

sumber: www.habr.com

Tambahkeun komentar