Quản lý bộ chứa Docker trong Go

Tài liệu!

Khi bạn quyết định ghi xe đạp của mình để bắt móc từ trung tâm docker hoặc từ sổ đăng ký để tự động cập nhật/khởi động bộ chứa trên máy chủ, Docker Cli có thể hữu ích để giúp quản lý daemon Docker trên hệ thống của bạn.
Quản lý bộ chứa Docker trong Go

Để hoạt động, bạn cần phiên bản Go ít nhất là 1.9.4

Nếu bạn vẫn chưa chuyển sang các mô-đun, hãy cài đặt Cli bằng lệnh sau:

go get github.com/docker/docker/client

Chạy container

Ví dụ sau đây cho thấy cách chạy vùng chứa bằng API Docker. Trên dòng lệnh, bạn sẽ sử dụng lệnh docker run, nhưng chúng tôi có thể dễ dàng đối phó với nhiệm vụ này trong dịch vụ của mình.
Ví dụ này tương đương với việc chạy lệnh 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)
}

Lấy danh sách các container đang chạy

Ví dụ này tương đương với việc chạy lệnh 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)
    }
}

Dừng tất cả các container đang chạy

Bây giờ bạn đã học cách tạo và chạy các vùng chứa, đã đến lúc tìm hiểu cách quản lý chúng. Ví dụ sau sẽ dừng tất cả các vùng chứa đang chạy.

Đừng chạy mã này trên máy chủ sản xuất!

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

Nhật ký đầu ra của một vùng chứa

Bạn có thể làm việc với các thùng chứa riêng lẻ. Ví dụ sau in nhật ký của vùng chứa có ID đã chỉ định. Trước khi bắt đầu, bạn cần thay đổi ID của vùng chứa có nhật ký mà bạn muốn lấy.

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

Lấy danh sách hình ảnh

Ví dụ này tương đương với việc chạy lệnh 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)
    }
}

Kéo

Ví dụ này tương đương với việc chạy lệnh 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)
}

Tải xuống một hình ảnh có xác thực người dùng

Ví dụ này tương đương với việc chạy lệnh docker pull, có xác thực.

Dữ liệu xác thực được gửi dưới dạng văn bản rõ ràng. Cơ quan đăng ký docker chính thức sử dụng HTTPS,
các cơ quan đăng ký riêng tư cũng phải được định cấu hình để giao tiếp bằng 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)
}

Nguồn: www.habr.com

Thêm một lời nhận xét