使用Go语言通过Docker官方客户端库可实现容器全生命周期管理,首先创建客户端实例并连接Docker守护进程,接着调用ContainerList、ContainerCreate、ContainerStart等方法执行操作,结合context控制与版本固定确保稳定性。

Go语言(Golang)与Docker API交互是实现容器自动化管理的常见需求,比如创建、启动、停止、删除容器等。通过调用Docker的RESTful API,你可以完全用Go程序控制Docker守护进程,无需依赖命令行工具。
使用官方Docker Go客户端库
Docker官方提供了Go语言客户端库 github.com/docker/docker/client,它封装了对Docker Engine API的调用,是推荐的方式。
安装依赖:
go get github.com/docker/docker/client基本使用步骤:
立即学习“go语言免费学习笔记(深入)”;
- 创建一个Docker客户端实例,连接本地或远程Docker daemon
- 调用对应方法发送HTTP请求到Docker API
- 处理返回结果,如容器ID、状态信息等
示例:列出所有运行中的容器
package mainimport (
"context"
"fmt"
"github.com/docker/docker/api/types"
"github.com/docker/docker/client"
)
func main() {
cli, err := client.NewClientWithOpts(client.WithVersion("1.43"))
if err != nil {
panic(err)
}
defer cli.Close()
containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{})
if err != nil {
panic(err)
}
for _, container := range containers {
fmt.Printf("%s %s\n", container.ID[:10], container.Image)
}
}
创建并启动容器
要创建容器,需配置镜像、命令、网络、挂载等参数,然后依次调用 ContainerCreate 和 ContainerStart。
resp, err := cli.ContainerCreate(ctx, &container.Config{Image: "nginx",
Cmd: []string{"echo", "hello"},
}, nil, nil, nil, "")
if err != nil {
panic(err)
}
if err = cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil {
panic(err)
}
ContainerCreate 返回容器ID,之后可用该ID进行操作,如日志获取、状态查询、停止或删除。
查看日志与容器状态
获取容器日志:
logs, err := cli.ContainerLogs(ctx, containerID, types.ContainerLogsOptions{ShowStdout: true})if err != nil {
panic(err)
}
io.Copy(os.Stdout, logs)
查询容器状态(如运行中、退出码):
inspect, err := cli.ContainerInspect(ctx, containerID)if err != nil {
panic(err)
}
fmt.Println("Running:", inspect.State.Running)
fmt.Println("ExitCode:", inspect.State.ExitCode)
停止和删除容器
停止容器(带超时):
err = cli.ContainerStop(ctx, containerID, container.StopOptions{Timeout: nil})删除容器:
err = cli.ContainerRemove(ctx, containerID, types.ContainerRemoveOptions{RemoveVolumes: true,
})
注意:只有停止后的容器才能被删除,除非使用强制选项。
基本上就这些。通过 Docker Go 客户端,你可以完整实现容器生命周期管理。关键是理解 context 控制、结构体参数配置以及错误处理。API 版本建议固定(如 WithVersion),避免因 Docker 升级导致兼容问题。










