Docker 提供了包含操作Docker daemon API接口的SDK,目前有GO版本和python版本。通过SDKs你可以很容易的构建出你的Docker 应用。如果你对Go和python都不熟悉的话,可以直接调用Docker Engine API(通过http方式)。
官网上面说通过以下命令可以安装golang版本的SDK:
go get github.com/docker/docker/client
然而,我通过这种方式安装SDK,并没有成功。后来发现这个开源项目好像改了名称了,现在叫moby。贴一张github截图吧
第一句话,大意是“Moby是由Docker创建的一个开源项目,旨在启用和加速软件容器化”。从这里可以看出它真的改名了!
所以,安装SDK的命令换成下面的语句,试一试:
go get github.com/moby/moby
这里将整个moby项目都down下来,应为后面开发项目的时候可能用到。
package main
import (
"context"
"io"
"os"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/container"
"github.com/docker/docker/client"
"github.com/docker/docker/pkg/stdcopy"
)
func main() {
ctx := context.Background()
cli, err := client.NewClientWithOpts(client.FromEnv)
if err != nil {
panic(err)
}
cli.NegotiateAPIVersion(ctx)
reader, err := cli.ImagePull(ctx, "docker.io/library/alpine", types.ImagePullOptions{})
if err != nil {
panic(err)
}
io.Copy(os.Stdout, reader)
resp, err := cli.ContainerCreate(ctx, &container.Config{
Image: "alpine",
Cmd: []string{"echo", "hello world"},
}, nil, nil, "")
if err != nil {
panic(err)
}
if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil {
panic(err)
}
statusCh, errCh := cli.ContainerWait(ctx, resp.ID, container.WaitConditionNotRunning)
select {
case err := <-errCh:
if err != nil {
panic(err)
}
case <-statusCh:
}
out, err := cli.ContainerLogs(ctx, resp.ID, types.ContainerLogsOptions{ShowStdout: true})
if err != nil {
panic(err)
}
stdcopy.StdCopy(os.Stdout, os.Stderr, out)
}
如果你用goland编辑器的话,会报错,提示docker文件夹不存在。这里不能直接使用官网示例啦,别忘了这个项目已经改名为moby。所以,我们应该在导入包名的时候把名称做对应变更。如下:
"github.com/moby/moby/api/types"
"github.com/moby/moby/api/types/container"
"github.com/moby/moby/client"
"github.com/moby/moby/pkg/stdcopy"
这样改了以后,又报错:
没办法呀,我只有更改源码目录名称了。下载下来的源码目录为"github.com/moby/moby",我将它更改为"github.com/docker/docker"。代码就用官方示例代码,不做任何更改!OK,这次终于编译通过了,真是好事多磨啊。
好了,完事开头难,我们走过了这一关后,就可以任意掉用SDKs的接口,来实现我们应用的需求啦。