āĻāĻĒāύāĻŋ āϝāĻāύ āĻĄāĻāĻžāϰ āĻšāĻžāĻŦ āĻĨā§āĻā§ āĻšā§āĻ āϧāϰāĻžāϰ āĻāύā§āϝ āĻŦāĻž āϏāĻžāϰā§āĻāĻžāϰ⧠āĻāύāĻā§āĻāύāĻžāϰāĻā§āϞāĻŋāĻā§ āϏā§āĻŦāϝāĻŧāĻāĻā§āϰāĻŋāϝāĻŧāĻāĻžāĻŦā§ āĻāĻĒāĻĄā§āĻ/āĻāĻžāϞāĻžāύā§āϰ āĻāύā§āϝ āϰā§āĻāĻŋāϏā§āĻā§āϰāĻŋ āĻĨā§āĻā§ āĻāĻĒāύāĻžāϰ āύāĻŋāĻā§āϰ āĻŦāĻžāĻāĻ āϞā§āĻāĻžāϰ āϏāĻŋāĻĻā§āϧāĻžāύā§āϤ āύā§āύ, āϤāĻāύ āĻāĻĒāύāĻŋ āĻĄāĻāĻžāϰ āĻā§āϞāĻŋāĻāĻŋāĻā§ āĻĻāϰāĻāĻžāϰ⧠āĻŦāϞ⧠āĻŽāύ⧠āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ, āϝāĻž āĻāĻĒāύāĻžāϰ āϏāĻŋāϏā§āĻā§āĻŽā§ āĻĄāĻāĻžāϰ āĻĄā§āĻŽāύ āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰāϤ⧠āϏāĻšāĻžāϝāĻŧāϤāĻž āĻāϰāĻŦā§ā§ˇ

āĻāĻžāĻ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻĒāύāĻžāϰ āĻā§ āĻāĻžāϰā§āϏāύ 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
