Menaxhimi i konteinerëve Docker në Go

Dokumentacioni!

Kur të vendosni të shkruani, biçikletën tuaj për kapjen e hook-ëve nga docker hub ose nga registry për azhurnimin/e nisjen automatike të kontejnerëve në server, Docker Cli mund t'ju ndihmojë në menaxhimin e demonit Docker në sistemin tuaj.
Menaxhimi i konteinerëve Docker në Go

Për punë do të nevojitet Go versioni jo më i ulët se 1.9.4.

Nëse akoma nuk keni kaluar në module, instaloni CLI me komandën në vijim:

go get github.com/docker/docker/client

Nisja e kontejnerit

Shembulli në vijim tregon si të nisni një kontejner duke përdorur Docker API. Në vijën e komandës do të përdornit komandën docker run, por ne do ta realizojmë këtë detyrë pa ndonjë vështirësi në shërbimin tonë.
Ky shembull është ekuivalent me ekzekutimin e komandës docker run alpine echo hello world

package main {
    ctx := context.Background()
    cli, err := client.NewEnvClient()
    if err != nil {
        panic(err)
    }

    // Bëjmë 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("E pamundur të marrim portin")
    }
    portBinding := nat.PortMap{containerPort: []nat.PortBinding{hostBinding}}

    // Krijojmë një kontejner me konfigurimin e caktuar
    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)
    }

    // Nisim kontejnerin
    if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil {
        panic(err)
    }

    // Marrim loget e kontejnerit
    out, err := cli.ContainerLogs(ctx, resp.ID, types.ContainerLogsOptions{ShowStdout: true})
    if err != nil {
        panic(err)
    }
    io.Copy(os.Stdout, out)
}

Marrja e listës së kontejnerëve të nisur

Ky shembull është ekuivalent me ekzekutimin e komandës 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)
    }

    // Marrja e listës së kontejnerëve të nisur (docker ps)
    containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{})
    if err != nil {
        panic(err)
    }

    // Shfaqja e të gjithë identifikuesve të kontejnerëve
    for _, container := range containers {
        fmt.Println(container.ID)
    }
}

Ndalo të gjithë kontejnerët e nisur

Pasi të keni mësuar të krijoni dhe nisni kontejnerë, është koha të mësoni se si t'i menaxhoni ata. Shembulli në vijim do të ndalë të gjithë kontejnerët e nisur.

Mos e ekzekutoni këtë kod në prodhim. server!

paketa kryesore

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

    // Marrja e listës së konteinerëve të ndezur (docker ps)
    containers, err := cli.ContainerList(ctx, types.ContainerListOptions{})
    if err != nil {
        panic(err)
    }

    for _, c := range containers {
        fmt.Print("Stopimi i konteinerit ", c.ID[:10], "... ")
        if err := cli.ContainerStop(ctx, c.ID, nil); err != nil {
            panic(err)
        }
        fmt.Println("Sukses")
    }
}

Shfaqja e regjistrimeve të një konteineri të veçantë

Mund të punoni me konteinerë të veçantë. Në shembullin vijues shfaqen regjistrimet e konteinerit me identifikuesin e dhënë. Para se të ekzekutoni, duhet të ndryshoni identifikuesin e konteinerit për të cilin dëshironi të merrni regjistrimet.

paketa kryesore

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}
    // Ndryshoni id e konteinerit këtu
    out, err := cli.ContainerLogs(ctx, "f1064a8a4c82", options)
    if err != nil {
        panic(err)
    }
    io.Copy(os.Stdout, out)
}

Marrja e listës së imazheve

Ky shembull është ekuivalent me ekzekutimin e komandës docker image ls

paketa kryesore

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

    // Marrja e listës së imazheve
    images, err := cli.ImageList(context.Background(), types.ImageListOptions{})
    if err != nil {
        panic(err)
    }

    for _, image := range images {
        fmt.Println(image.ID)
    }
}

Tërheqje

Ky shembull është ekuivalent me ekzekutimin e komandës docker pull

paketa kryesore

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

Shkarkimi i imazhit me autentifikim të përdoruesit

Ky shembull është ekuivalent me ekzekutimin e komandës docker pull, me autentifikim.

Të dhënat e autentifikimit dërgohen në formë të qartë. Regjistrat zyrtarë të docker përdorin HTTPS,
regjistrat privat gjithashtu duhet të jenë të konfiguruar për të dërguar të dhënat duke përdorur 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)
    }

    // Krijimi i konfigurimit me të dhënat për autentikimin
    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)
}

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster