เจ—เฉ‹ เจตเจฟเฉฑเจš เจกเฉŒเจ•เจฐ เจ•เฉฐเจŸเฉ‡เจจเจฐเจพเจ‚ เจฆเจพ เจชเฉเจฐเจฌเฉฐเจงเจจ เจ•เจฐเจจเจพ

เจฆเจธเจคเจพเจตเฉ‡เจœเจผเฉ€!

เจœเจฆเฉ‹เจ‚ เจคเฉเจธเฉ€เจ‚ เจกเฉŒเจ•เจฐ เจนเฉฑเจฌ เจคเฉ‹เจ‚ เจœเจพเจ‚ เจฐเจœเจฟเจธเจŸเจฐเฉ€ เจคเฉ‹เจ‚ เจธเจฐเจตเจฐ 'เจคเฉ‡ เจ•เฉฐเจŸเฉ‡เจจเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจ†เจŸเฉ‹เจฎเฉˆเจŸเจฟเจ• เจ…เฉฑเจชเจกเฉ‡เจŸ/เจฐเจจ เจ•เจฐเจจ เจฒเจˆ เจนเฉเฉฑเจ•เจพเจ‚ เจจเฉ‚เฉฐ เจซเฉœเจจ เจฒเจˆ เจ†เจชเจฃเฉ€ เจ–เฉเจฆ เจฆเฉ€ เจธเจพเจˆเจ•เจฒ เจฒเจฟเจ–เจฃ เจฆเจพ เจซเฉˆเจธเจฒเจพ เจ•เจฐเจฆเฉ‡ เจนเฉ‹, เจคเจพเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจกเฉŒเจ•เจฐ เจ•เจฒเฉ€ เจฒเจพเจญเจฆเจพเจ‡เจ• เจฒเฉฑเจ— เจธเจ•เจฆเฉ€ เจนเฉˆ, เจœเฉ‹ เจคเฉเจนเจพเจกเฉ‡ เจธเจฟเจธเจŸเจฎ 'เจคเฉ‡ เจกเฉŒเจ•เจฐ เจกเฉˆเจฎเจจ เจฆเจพ เจชเฉเจฐเจฌเฉฐเจงเจจ เจ•เจฐเจจ เจตเจฟเฉฑเจš เจฎเจฆเจฆ เจ•เจฐเฉ‡เจ—เฉ€เฅค
เจ—เฉ‹ เจตเจฟเฉฑเจš เจกเฉŒเจ•เจฐ เจ•เฉฐเจŸเฉ‡เจจเจฐเจพเจ‚ เจฆเจพ เจชเฉเจฐเจฌเฉฐเจงเจจ เจ•เจฐเจจเจพ

เจ•เฉฐเจฎ เจ•เจฐเจจ เจฒเจˆ เจคเฉเจนเจพเจจเฉ‚เฉฐ 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

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹