简介
众所周知,Docker是用go
进行开发的,所以自然Docker官方也开放了go
的Docker API库。所以我们可以简单的调用Docker API来对Docker进行二次开发,下面就做个简单的示例,使用go
来查看本地的容器,和启动一个容器。
确认版本
首先要看看本地Docker版本,然后去拉取对应的go
库。如果拉取的go
库版本大于本地Docker版本的话,就会出现类似client version 1.41 is too new. Maximum supported API version is 1.40
的错误,所以一定要确保Docker API的go
库版本小于等于本地的Docker版本
// 执行命令查看docker版本 docker version
Client: Docker Engine - Community // docker版本 Version: 20.10.5 API version: 1.41 Go version: go1.13.15 Git commit: 55c4c88 Built: Tue Mar 2 20:18:05 2021 OS/Arch: linux/amd64 Context: default Experimental: true Server: Docker Engine - Community Engine: Version: 20.10.5 API version: 1.41 (minimum version 1.12) Go version: go1.13.15 Git commit: 363e9a8 Built: Tue Mar 2 20:16:00 2021 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.4.4 GitCommit: 05f951a3781f4f2c1911b05e61c160e9c30eaa8e runc: Version: 1.0.0-rc93 GitCommit: 12644e614e25b05da6fd08a38ffa0cfe1903fdec docker-init: Version: 0.19.0 GitCommit: de40ad0
可以看到我本地的Docker版本为20.10.5,所以我要拉取对应的go
库的版本
可以去go官方库查看对应支持的版本,我里拉取了**v20.10.5+incompatible**这个版本的Docker API库。
go get github.com/docker/docker@v20.10.5+incompatible
这里推荐使用
Goland
这个IDE,真的超级好用,它会自动导入对应的依赖
mod依赖
我这边用的是moudle
模式,所以对应的mod
文件内容为。
module demo go 1.16 require ( github.com/Microsoft/go-winio v0.4.16 // indirect github.com/containerd/containerd v1.4.4 // indirect github.com/docker/distribution v2.7.1+incompatible // indirect github.com/docker/docker v20.10.5+incompatible github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.4.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/gorilla/mux v1.8.0 // indirect github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 // indirect github.com/morikuni/aec v1.0.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.0.1 // indirect github.com/sirupsen/logrus v1.8.1 // indirect golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba // indirect google.golang.org/grpc v1.36.1 // indirect gotest.tools/v3 v3.0.3 // indirect ) 复制代码
代码示例
查看本地已启动的Docker容器
package main import ( "context" "fmt" "github.com/docker/docker/api/types" "github.com/docker/docker/client" ) func main() { cli, err := client.NewClientWithOpts() if err != nil { panic(err) } // 获取本地已启动的Docker容器,如果要查看全部容器,可以配置types.ContainerListOptions{}参数 containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{}) if err != nil { panic(err) } for _, container := range containers { fmt.Printf("容器ID:%s,容器名称:%s,容器状态:%s\n", container.ID[:10],container.Image,container.State) } }
输出:
容器ID:e7edbc9856,容器名称:zookeeper:3.6.2,容器状态:running 容器ID:0029fea937,容器名称:mysql:5.7,容器状态:running
启动一个容器
package main import ( "context" "github.com/docker/docker/api/types" "github.com/docker/docker/client" ) func main() { cli, err := client.NewClientWithOpts() if err != nil { panic(err) } err=cli.ContainerStart(context.Background(),"6fe3752c98d8",types.ContainerStartOptions{}) if err != nil { panic(err) } }
然后再查看本地已启动Docker容器列表,输出:
容器ID:e7edbc9856,容器名称:zookeeper:3.6.2,容器状态:running 容器ID:0029fea937,容器名称:mysql:5.7,容器状态:running 容器ID:6fe3752c98,容器名称:mysql:8.0,容器状态:running
总结
这里只是简单的展示了go
操作Docker的能力,具体还有很多玩法,我们可以用go
构建自己的Docker容器管理平台,守护容器等等。具体的可以看官方文档,官方提供了很多API供我们使用