Mitantana kaontenera Docker ao amin'ny Go

Documentation!

Rehefa manapa-kevitra ny hanoratra ny bisikiletanao manokana ianao amin'ny fisamborana hook avy amin'ny docker hub na avy amin'ny rejisitra mba hanavao / hampandehanana ireo container amin'ny server, dia mety ho hitanao fa ilaina ny Docker Cli, izay hanampy amin'ny fitantanana ny daemon Docker amin'ny rafitrao.
Mitantana kaontenera Docker ao amin'ny Go

Mba hiasa dia mila Go version tsy latsaky ny 1.9.4

Raha mbola tsy nivadika ho modules ianao dia apetraho Cli miaraka amin'ity baiko manaraka ity:

go get github.com/docker/docker/client

Mandeha kaontenera

Ity ohatra manaraka ity dia mampiseho ny fomba fampandehanana kaontenera mampiasa ny Docker API. Amin'ny andalana baiko dia azonao ampiasaina ny baiko docker run, nefa afaka miatrika mora foana io asa io isika eo amin’ny fanompoana.
Ity ohatra ity dia mitovy amin'ny fampandehanana ny baiko 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)
}

Mahazo lisitry ny kaontenera mihazakazaka

Ity ohatra ity dia mitovy amin'ny fampandehanana ny baiko 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)
    }
}

Atsaharo ny kaontenera mandeha rehetra

Rehefa avy nianatra ny fomba famoronana sy fampandehanana kaontenera ianao dia izao no fotoana hianarana ny fomba fitantanana azy ireo. Ity ohatra manaraka ity dia hampiato ny kaontenera mandeha rehetra.

Aza atao amin'ny mpizara famokarana ity kaody ity!

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

Fampisehoana diary ho an'ny kaontenera tokana

Afaka miasa miaraka amin'ny kaontenera tsirairay ianao. Ity ohatra manaraka ity dia mampiseho diarin'ny kaontenera miaraka amin'ny famantarana voatondro. Alohan'ny hanombohanao dia mila manova ny ID ny kaontenera izay ny log tianao horaisina.

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

Mahazo lisitry ny sary

Ity ohatra ity dia mitovy amin'ny fampandehanana ny baiko 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)
    }
}

Sintony

Ity ohatra ity dia mitovy amin'ny fampandehanana ny baiko 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)
}

Misintona sary miaraka amin'ny fanamarinan'ny mpampiasa

Ity ohatra ity dia mitovy amin'ny fampandehanana ny baiko docker pull, miaraka amin'ny fanamarinana.

Ny angona fanamarinana dia alefa amin'ny lahatsoratra mazava. Ny rejisitry ny docker ofisialy dia mampiasa HTTPS,
Tsy maintsy amboarina koa ny rejistra manokana mba hamindra angona amin'ny alΓ lan'ny 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)
}

Source: www.habr.com

Add a comment