ืึธื ืคื™ืจื•ื ื’ ื“ืึธืงืงืขืจ ืงืึทื ื˜ื™ื™ื ืขืจื– ืื™ืŸ Go

ื“ืึธืงื•ืžืขื ื˜ืึทื˜ื™ืึธืŸ!

ื•ื•ืขืŸ ืื™ืจ ื‘ืึทืฉืœื™ืกืŸ ืฆื• ืฉืจื™ื™ึทื‘ืŸ ื“ื™ื™ืŸ ื‘ื™ื™ืง ืฆื• ื›ืึทืคึผืŸ ื›ื•ืงืก ืคื•ืŸ ื“ื™ ื“ืึธืงืงืขืจ ื›ืึทื‘ ืึธื“ืขืจ ืคึฟื•ืŸ ื“ื™ ืจืขื’ื™ืกื˜ืจื™ ืฆื• ืื•ื™ื˜ืึธืžืึทื˜ื™ืฉ ื“ืขืจื”ื™ื™ึทื ื˜ื™ืงืŸ / ืึธื ื”ื™ื™ื‘ ืงืึทื ื˜ื™ื™ื ืขืจื– ืื•ื™ืฃ ื“ื™ ืกืขืจื•ื•ืขืจ, ืึท Docker Cli ืงืขื ืขืŸ ื–ื™ื™ืŸ ื ื•ืฆื™ืง ืฆื• ืคื™ืจืŸ ื“ื™ ื“ืึธืงืงืขืจ ื“ื™ื™ืžืึทืŸ ืื•ื™ืฃ ื“ื™ื™ืŸ ืกื™ืกื˜ืขื.
ืึธื ืคื™ืจื•ื ื’ ื“ืึธืงืงืขืจ ืงืึทื ื˜ื™ื™ื ืขืจื– ืื™ืŸ Go

ืฆื• ืึทืจื‘ืขื˜ืŸ, ืื™ืจ ื“ืึทืจืคึฟืŸ ื‘ื™ื™ึท ืžื™ื ื“ืกื˜ืขืจ 1.9.4 Go ื•ื•ืขืจืกื™ืข

ืื•ื™ื‘ ืื™ืจ ื ืึธืš ื”ืึธื‘ืŸ ื ื™ืฉื˜ ืกื•ื•ื™ื˜ืฉื˜ ืฆื• ืžืึทื“ื–ืฉื•ืœื–, ื™ื ืกื˜ืึทืœื™ืจืŸ Cli ืžื™ื˜ ื“ื™ ืคืืœื’ืขื ื“ืข ื‘ืึทืคึฟืขืœ:

go get github.com/docker/docker/client

ืคืœื™ืกื ื“ื™ืง ืึท ืงืึทื ื˜ื™ื™ื ืขืจ

ื“ื™ ืคืืœื’ืขื ื“ืข ื‘ื™ื™ืฉืคึผื™ืœ ื•ื•ื™ื™ื–ื˜ ื•ื•ื™ ืฆื• ืœื•ื™ืคืŸ ืึท ืงืึทื ื˜ื™ื™ื ืขืจ ืžื™ื˜ ื“ื™ Docker 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,
ืคึผืจื™ื•ื•ืึทื˜ ืจืขื’ื™ืกื˜ืจื™ื– ืžื•ื–ืŸ ืื•ื™ืš ื–ื™ื™ืŸ ืงืึทื ืคื™ื’ื™ืขืจื“ ืฆื• ื™ื‘ืขืจื’ืขื‘ืŸ ืžื™ื˜ ื”ื˜ื˜ืคึผืก.

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

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’