Go-เดฏเดฟเตฝ เดกเต‹เด•เตเด•เตผ เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเตเด•เตพ เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเด•เตเด•เตเดจเตเดจเต

เดชเตเดฐเดฎเดพเดฃเต€เด•เดฐเดฃเด‚!

เดธเต†เตผเดตเดฑเดฟเดฒเต† เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเตเด•เตพ เดธเตเดตเดฏเดฎเต‡เดต เด…เดชเตโ€Œเดกเต‡เดฑเตเดฑเต/เดฑเตบ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเดพเดฏเดฟ เดกเต‹เด•เตเด•เตผ เดนเดฌเตเดฌเดฟเตฝ เดจเดฟเดจเตเดจเต‹ เดฐเดœเดฟเดธเตเดŸเตเดฐเดฟเดฏเดฟเตฝ เดจเดฟเดจเตเดจเต‹ เด•เตŠเดณเตเดคเตเดคเตเด•เตพ เดชเดฟเดŸเดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เดณเตเดŸเต† เดธเตเดตเดจเตเดคเด‚ เดฌเตˆเด•เตเด•เต เดŽเดดเตเดคเดพเตป เดจเดฟเด™เตเด™เตพ เดคเต€เดฐเตเดฎเดพเดจเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ, เดกเต‹เด•เตเด•เตผ เด•เตเดฒเดฟ เด‰เดชเดฏเต‹เด—เดชเตเดฐเดฆเดฎเดพเดฃเต†เดจเตเดจเต เดจเดฟเด™เตเด™เตพ เด•เดฃเตเดŸเต†เดคเตเดคเดฟเดฏเต‡เด•เตเด•เดพเด‚, เด‡เดคเต เดจเดฟเด™เตเด™เดณเตเดŸเต† เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเดฒเต† เดกเต‹เด•เตเด•เตผ เดกเต†เดฎเตบ เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเด•เตเด•เดพเตป เดธเดนเดพเดฏเดฟเด•เตเด•เตเด‚.
Go-เดฏเดฟเตฝ เดกเต‹เด•เตเด•เตผ เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเตเด•เตพ เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเด•เตเด•เตเดจเตเดจเต

เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เตพเด•เตเด•เต 1.9.4-เตฝ เด•เตเดฑเดฏเดพเดคเตเดค Go เดชเดคเดฟเดชเตเดชเต เด†เดตเดถเตเดฏเดฎเดพเดฃเต

เดจเดฟเด™เตเด™เตพ เด‡เดชเตเดชเต‹เดดเตเด‚ เดฎเตŠเดกเตเดฏเต‚เดณเตเด•เดณเดฟเดฒเต‡เด•เตเด•เต เดฎเดพเดฑเดฟเดฏเดฟเดŸเตเดŸเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เด•เดฎเดพเตปเดกเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต 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")
    }
}

เด’เดฐเตŠเดฑเตเดฑ เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเดฟเดจเดพเดฏเดฟ เดฒเต‹เด—เตเด•เตพ เดชเตเดฐเดฆเตผเดถเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต

เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดตเตเดฏเด•เตเดคเดฟเด—เดค เด•เดฃเตเดŸเต†เดฏเตเดจเดฑเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเด‚. เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เด‰เดฆเดพเดนเดฐเดฃเด‚ เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเดŸ เดเดกเตปเตเดฑเดฟเดซเดฏเตผ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด•เดฃเตเดŸเต†เดฏเตเดจเตผ เดฒเต‹เด—เตเด•เตพ เดชเตเดฐเดฆเตผเดถเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต. เด†เดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดฎเตเดฎเตเดชเต, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดฒเดญเดฟเด•เตเด•เดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจ เดฒเต‹เด—เตเด•เดณเตเดŸเต† เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเดฟเตปเตเดฑเต† เดเดกเดฟ เดฎเดพเดฑเตเดฑเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต.

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

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•