рдЧреЛ рдореЗрдВ рдбреЙрдХрдЯрд░ рдХрдВрдЯреЗрдирд░реЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди

рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг!

рдЬрдм рдЖрдк рдЕрдкрдиреА рдмрд╛рдЗрдХ рдХреЛ рдбреЙрдХрдЯрд░ рд╣рдм рд╕реЗ рд╣реБрдХ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рд░реНрд╡рд░ рдкрд░ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ/рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЗ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдбреЙрдХрд░ рдбреЗрдорди рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдбреЙрдХрд░ рдХреНрд▓реА рдХрд╛рдо рдЖ рд╕рдХрддрд╛ рд╣реИред
рдЧреЛ рдореЗрдВ рдбреЙрдХрдЯрд░ рдХрдВрдЯреЗрдирд░реЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди

рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЧреЛ рд╕рдВрд╕реНрдХрд░рдг рдХрдо рд╕реЗ рдХрдо 1.9.4 рдЪрд╛рд╣рд┐рдП

рдпрджрд┐ рдЖрдкрдиреЗ рдЕрднреА рднреА рдореЙрдбреНрдпреВрд▓ рдкрд░ рд╕реНрд╡рд┐рдЪ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдирд┐рдореНрди рдЖрджреЗрд╢ рдХреЗ рд╕рд╛рде рдХреНрд▓реА рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:

go get github.com/docker/docker/client

рдПрдХ рдХрдВрдЯреЗрдирд░ рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реИ

рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдбреЙрдХрд░ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдВрдЯреЗрдирд░ рдХреИрд╕реЗ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рдПред рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкрд░, рдЖрдк рдХрдорд╛рдВрдб рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ 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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ