āĻāĻĒāĻ¨āĻŋ āĻ¯āĻāĻ¨ āĻĄāĻāĻžāĻ° āĻšāĻžāĻŦ āĻĨā§āĻā§ āĻšā§āĻ āĻ§āĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻŦāĻž āĻ¸āĻžāĻ°ā§āĻāĻžāĻ°ā§ āĻāĻ¨āĻā§āĻāĻ¨āĻžāĻ°āĻā§āĻ˛āĻŋāĻā§ āĻ¸ā§āĻŦāĻ¯āĻŧāĻāĻā§āĻ°āĻŋāĻ¯āĻŧāĻāĻžāĻŦā§ āĻāĻĒāĻĄā§āĻ/āĻāĻžāĻ˛āĻžāĻ¨ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻ°ā§āĻāĻŋāĻ¸ā§āĻā§āĻ°āĻŋ āĻĨā§āĻā§ āĻāĻĒāĻ¨āĻžāĻ° āĻ¨āĻŋāĻā§āĻ° āĻŦāĻžāĻāĻ āĻ˛ā§āĻāĻžāĻ° āĻ¸āĻŋāĻĻā§āĻ§āĻžāĻ¨ā§āĻ¤ āĻ¨ā§āĻ¨, āĻ¤āĻāĻ¨ āĻāĻĒāĻ¨āĻŋ āĻĄāĻāĻžāĻ° āĻā§āĻ˛āĻŋāĻāĻŋāĻā§ āĻĻāĻ°āĻāĻžāĻ°ā§ āĻŦāĻ˛ā§ āĻŽāĻ¨ā§ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨, āĻ¯āĻž āĻāĻĒāĻ¨āĻžāĻ° āĻ¸āĻŋāĻ¸ā§āĻā§āĻŽā§ āĻĄāĻāĻžāĻ° āĻĄā§āĻŽāĻ¨ āĻĒāĻ°āĻŋāĻāĻžāĻ˛āĻ¨āĻž āĻāĻ°āĻ¤ā§ āĻ¸āĻšāĻžāĻ¯āĻŧāĻ¤āĻž āĻāĻ°āĻŦā§ā§ˇ
āĻāĻžāĻ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻĒāĻ¨āĻžāĻ° āĻā§ āĻāĻžāĻ°ā§āĻ¸āĻ¨ 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")
}
}
āĻāĻāĻāĻŋ āĻāĻāĻ āĻ§āĻžāĻ°āĻ āĻāĻ¨ā§āĻ¯ āĻ˛āĻ āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻ¨ āĻāĻ°āĻž āĻšāĻā§āĻā§
āĻāĻĒāĻ¨āĻŋ āĻĒā§āĻĨāĻ āĻĒāĻžāĻ¤ā§āĻ°ā§ āĻāĻžāĻ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨āĨ¤ āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻāĻŋāĻ¤ āĻāĻĻāĻžāĻšāĻ°āĻŖāĻāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻļāĻ¨āĻžāĻā§āĻ¤āĻāĻžāĻ°ā§āĻ° āĻ¸āĻžāĻĨā§ āĻāĻ¨ā§āĻā§āĻāĻ¨āĻžāĻ° āĻ˛āĻāĻā§āĻ˛āĻŋ āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻ¨ āĻāĻ°ā§āĨ¤ āĻļā§āĻ°ā§ āĻāĻ°āĻžāĻ° āĻāĻā§, āĻāĻĒāĻ¨āĻžāĻā§ āĻ¯ā§ āĻ§āĻžāĻ°āĻāĻāĻŋāĻ° āĻ˛āĻāĻā§āĻ˛āĻŋ āĻāĻĒāĻ¨āĻŋ āĻĒā§āĻ¤ā§ āĻāĻžāĻ¨ āĻ¤āĻžāĻ° āĻāĻāĻĄāĻŋ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻāĻ°āĻ¤ā§ āĻšāĻŦā§āĨ¤
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