Go เชฎเชพเช‚ เชกเซ‹เช•เชฐ เช•เชจเซเชŸเซ‡เชจเชฐเชจเซเช‚ เชธเช‚เชšเชพเชฒเชจ

เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃ!

เชœเซเชฏเชพเชฐเซ‡ เชคเชฎเซ‡ เชธเชฐเซเชตเชฐ เชชเชฐ เช•เชจเซเชŸเซ‡เชจเชฐเชจเซ‡ เช†เชชเชฎเซ‡เชณเซ‡ เช…เชชเชกเซ‡เชŸ/เชฐเชจ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชกเซ‹เช•เชฐ เชนเชฌเชฎเชพเช‚เชฅเซ€ เช…เชฅเชตเชพ เชฐเชœเชฟเชธเซเชŸเซเชฐเซ€เชฎเชพเช‚เชฅเซ€ เชนเซเช•เซเชธ เชชเช•เชกเชตเชพ เชฎเชพเชŸเซ‡ เชคเชฎเชพเชฐเซ€ เชชเซ‹เชคเชพเชจเซ€ เชฌเชพเช‡เช• เชฒเช–เชตเชพเชจเซเช‚ เชจเช•เซเช•เซ€ เช•เชฐเซ‹ เช›เซ‹, เชคเซเชฏเชพเชฐเซ‡ เชคเชฎเชจเซ‡ เชกเซ‹เช•เชฐ เช•เซเชฒเซ€ เช‰เชชเชฏเซ‹เช—เซ€ เชฒเชพเช—เซ€ เชถเช•เซ‡ เช›เซ‡, เชœเซ‡ เชคเชฎเชพเชฐเซ€ เชธเชฟเชธเซเชŸเชฎ เชชเชฐ เชกเซ‹เช•เชฐ เชกเชฟเชฎเชจเชจเซ‡ เชธเช‚เชšเชพเชฒเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเชถเซ‡.
Go เชฎเชพเช‚ เชกเซ‹เช•เชฐ เช•เชจเซเชŸเซ‡เชจเชฐเชจเซเช‚ เชธเช‚เชšเชพเชฒเชจ

เช•เชพเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชคเชฎเชพเชฐเซ‡ เช—เซ‹ เชตเชฐเซเชเชจเชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡ เชœเซ‡ 1.9.4 เช•เชฐเชคเชพ เช“เช›เซเช‚ เชจเชนเซ€เช‚ เชนเซ‹เชฏ

เชœเซ‹ เชคเชฎเซ‡ เชนเชœเซ เชชเชฃ เชฎเซ‹เชกเซเชฏเซเชฒเซ‹ เชชเชฐ เชธเซเชตเชฟเชš เช•เชฐเซเชฏเซเช‚ เชจเชฅเซ€, เชคเซ‹ เชจเซ€เชšเซ‡เชจเชพ เช†เชฆเซ‡เชถ เชธเชพเชฅเซ‡ Cli เชจเซ‡ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ‹:

go get github.com/docker/docker/client

เช•เชจเซเชŸเซ‡เชจเชฐ เชšเชฒเชพเชตเชตเซเช‚

เชจเซ€เชšเซ‡เชจเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ เชฌเชคเชพเชตเซ‡ เช›เซ‡ เช•เซ‡ เชกเซ‹เช•เชฐ 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")
    }
}

เชเช• เช•เชจเซเชŸเซ‡เชจเชฐ เชฎเชพเชŸเซ‡ เชฒเซ‹เช— เชชเซเชฐเชฆเชฐเซเชถเชฟเชค เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช

เชคเชฎเซ‡ เชตเซเชฏเช•เซเชคเชฟเช—เชค เช•เชจเซเชŸเซ‡เชจเชฐ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹. เชจเซ€เชšเซ‡เชจเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เช“เชณเช–เช•เชฐเซเชคเชพ เชธเชพเชฅเซ‡ เช•เชจเซเชŸเซ‡เชจเชฐ เชฒเซ‹เช— เชฆเชฐเซเชถเชพเชตเซ‡ เช›เซ‡. เชถเชฐเซ‚ เช•เชฐเชคเชพ เชชเชนเซ‡เชฒเชพ, เชคเชฎเชพเชฐเซ‡ เช•เชจเซเชŸเซ‡เชจเชฐเชจเซเช‚ ID เชฌเชฆเชฒเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เชœเซ‡เชจเชพ เชฒเซ‹เช— เชคเชฎเซ‡ เชชเซเชฐเชพเชชเซเชค เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ‹ เช›เซ‹.

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, เชชเซเชฐเชฎเชพเชฃเซ€เช•เชฐเชฃ เชธเชพเชฅเซ‡.

เชชเซเชฐเชฎเชพเชฃเซ€เช•เชฐเชฃ เชกเซ‡เชŸเชพ เชธเซเชชเชทเซเชŸ เชŸเซ‡เช•เซเชธเซเชŸเชฎเชพเช‚ เชฎเซ‹เช•เชฒเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชธเชคเซเชคเชพเชตเชพเชฐ เชกเซ‹เช•เชฐ เชฐเชœเชฟเชธเซเชŸเซเชฐเซ€ 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

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹