ืืืฉืจ ืืชื ืืืืื ืืืชืื ืืืคื ืืื ืืฉืื ืืชืคืืกืช ืืืื ืืืจืื ื- Docker ืื ืืืจืืฉืื ืืื ืืขืืื/ืืืคืขืื ืืืืืืืืช ืงืื ืืืื ืจืื ืืฉืจืช, ืืืชืื ืฉืชืืฆื ืืช ื- Docker Cli ืฉืืืืฉื, ืฉืืขืืืจ ืื ืื ืืช ืืืืื Docker ืืืขืจืืช ืฉืื.
ืืื ืืขืืื ืชืืืงืง ืืืจืกืช Go ืื ื ืืืื ื-1.9.4
ืื ืขืืืื ืื ืขืืจืช ืืืืืืืื, ืืชืงื ืืช 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,
ืืฉ ืืืืืืจ ืื ืจืืฉืื ืคืจืื ืืืขืืจืช ื ืชืื ืื ืืืืฆืขืืช 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