背景介绍

项目开发中,需要通过golang实现一个微服务,对docker进行一些定制化的操作流程。

安装依赖

核心依赖:"github.com/docker/docker/client"
这是docker的官方golang客户端,可以在golang程序中调用和操纵docker,相比通过命令行调用,具有更安全、更强大的效果。

使用方法

建立客户端

cli, err := client.NewEnvClient()
复制代码

我将其纳入了我的dockerController对象的属性中,后续通过dockerController对象操作:

ctrl := &dockerController{
	cli:    cli,
	logger: logger,
	conf:   conf,
}
复制代码

查询容器列表

containers, err := d.cli.ContainerList(context.Background(), types.ContainerListOptions{
	All: true,
})
复制代码

几乎每个方法,都有一个对应的选项结构体,可以自由设定其选项。如types.ContainerListOptions,设定All: true,则会列举出全部状态的容器(否则只会列举出正在运行的容器)。

拉取镜像

authConfig := types.AuthConfig{Username: d.conf.DockerUsername, Password: d.conf.DockerPassword}
encodedJSON, err := jsoniter.Marshal(authConfig)
if err != nil {
	d.logger.WithError(err).Error("序列化失败")
	return err
}
authStr := base64.URLEncoding.EncodeToString(encodedJSON)
resp, err := d.cli.ImagePull(context.Background(), ref, types.ImagePullOptions{
	RegistryAuth: authStr,
})
复制代码

删除镜像

_, err := d.cli.ImageRemove(context.Background(), id, types.ImageRemoveOptions{
	Force: true,
})
复制代码

创建容器

resp, err := d.cli.ContainerCreate(context.Background(), containerConfig, hostConfig, nil, app.ID.Hex())
复制代码

containerConfig和hostConfig有很多很多的选项,这里就不展开一个个描述了,具体可以参考官方文档,也可以找实际的docker容器,inspect一下看看,如图: 手动运行docker命令,比如docker run -p 80:80 -v /data:/data -d nginx:latest的时候,我们可能不会去在意各个参数最终是落到什么地方的。
但是通过api操作docker时,要求我们对docker容器的数据结构有一个比较清晰的认识,这样才能实现文件映射、端口映射等各个选项的操作。
比如端口映射,我们需要在Config的ExposedPorts中设置暴露的端口的字典(类型:nat.PortSet),还需要在HostConfig的PortBindings中设定内网端口的映射字典(类型:nat.PortMap)。