- 安装 Docker SDK for Go
要在 Go 中操作 Docker,我们需要安装 Docker SDK for Go。可以在 Golang 官方网站(https://golang.org/) 上下载 SDK,也可以使用以下命令在终端中下载 SDK:
go get -u github.com/docker/docker/client
- 创建 Docker API 客户端
正如在 SDK 文档中所述,我们需要创建一个 Docker API 客户端才能与 Docker 交互。 我们可以使用以下代码创建一个 Docker API 客户端:
package main
import (
"context"
"fmt"
"github.com/docker/docker/api/types"
"github.com/docker/docker/client"
)
func main() {
cli, err := client.NewClientWithOpts(client.WithVersion("1.41"))
if err != nil {
panic(err)
}
ctx := context.Background()
info, err := cli.Info(ctx)
if err != nil {
panic(err)
}
fmt.Printf("Docker info: %+v\n", info)
}
在这个示例中,我们创建了一个 Docker 客户端,并向其发送了一个 Info
请求,以获取有关 Docker 的信息。我们使用了 context
包来取消请求,以避免在程序结束时出现问题。
- 操作 Docker 容器
使用 Docker SDK for Go,我们可以很容易地操作 Docker 容器。下面是一个例子,创建一个 Docker 容器:
package main
import (
"context"
"fmt"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/container"
"github.com/docker/docker/client"
"github.com/docker/go-connections/nat"
)
func main() {
ctx := context.Background()
cli, err := client.NewEnvClient()
if err != nil {
panic(err)
}
config := &container.Config{
Image: "nginx:latest",
ExposedPorts: nat.PortSet{
"80/tcp": struct{}{},
},
}
hostConfig := &container.HostConfig{
PortBindings: nat.PortMap{
"80/tcp": []nat.PortBinding{
{
HostIP: "0.0.0.0",
HostPort: "80",
},
},
},
}
resp, err := cli.ContainerCreate(ctx, config, hostConfig, nil, "")
if err != nil {
panic(err)
}
if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil {
panic(err)
}
fmt.Println(resp.ID)
}
在此示例中,我们使用 Docker SDK for Go 创建了一个 Nginx 容器,并将其暴露在主机端口 80 上。我们使用了 ContainerCreate
和 ContainerStart
方法。前者用于创建 Docker 容器,而后者用于启动它。
- 操作 Docker 镜像
在 Docker SDK for Go 中,有多种方法可以操作 Docker 镜像。下面是一个示例,从 Docker Hub 中拉取一个镜像:
package main
import (
"context"
"fmt"
"io/ioutil"
"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)
}
out, err := cli.ImagePull(ctx, "nginx:latest", types.ImagePullOptions{})
if err != nil {
panic(err)
}
defer out.Close()
body, _ := ioutil.ReadAll(out)
fmt.Println(string(body))
}
在此示例中,我们使用 ImagePull
方法从 Docker Hub 中拉取了一个 Nginx 镜像。在此之后,我们可以使用 ImageInspectWithRaw
方法获取有关此镜像的信息。
总之,使用 Docker SDK for Go 可以更轻松地与 Docker 进行交互。在这篇文章中,我们介绍了如何创建 Docker API客户端以及如何操作 Docker 容器和镜像。