Διαχείριση κοντέινερ Docker στο Go

Τεκμηρίωση!

Όταν αποφασίζετε να γράψετε το ποδήλατό σας για να πιάσει γάντζους από το docker hub ή από το μητρώο για αυτόματη ενημέρωση/εκκίνηση των κοντέινερ στον διακομιστή, ένα Docker Cli μπορεί να σας βοηθήσει να διαχειριστείτε τον δαίμονα Docker στο σύστημά σας.
Διαχείριση κοντέινερ Docker στο Go

Για να εργαστείτε, χρειάζεστε την έκδοση Go τουλάχιστον 1.9.4

Εάν ακόμα δεν έχετε μεταβεί σε λειτουργικές μονάδες, εγκαταστήστε το 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, με έλεγχο ταυτότητας.

Τα δεδομένα ελέγχου ταυτότητας αποστέλλονται σε καθαρό κείμενο. Τα επίσημα μητρώα docker χρησιμοποιούν 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

Προσθέστε ένα σχόλιο