使用Go进行Docker二次开发|Go主题月

简介: 众所周知,Docker是用go进行开发的,所以自然Docker官方也开放了go的Docker API库。所以我们可以简单的调用Docker API来对Docker进行二次开发,下面就做个简单的示例,使用go来查看本地的容器,和启动一个容器。

简介


众所周知,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供我们使用

目录
相关文章
|
6月前
|
Java Go 开发者
Docker容器技术简介及其与Go语言的结合点
【2月更文挑战第23天】本文首先概述了Docker容器技术的核心概念和优势,接着探讨了Go语言与Docker容器技术的结合点。通过阐述Docker的轻量级、可移植性和版本控制等特性,以及Go语言在容器化应用中的优势,本文旨在说明两者结合能够实现更高效、灵活的应用开发和部署。
|
6月前
|
测试技术 API 开发者
【Docker项目实战】在Docker环境下部署go-file文件分享工具
【2月更文挑战第15天】在Docker环境下部署go-file文件分享工具
162 1
|
1月前
|
Go Docker Python
docker的python与go镜像的制作
docker的python与go镜像的制作
30 1
|
3月前
|
安全 Go Docker
Go服务Docker Pod不断重启排查和解决
该文章分享了Go服务在Docker Pod中不断重启的问题排查过程和解决方案,识别出并发写map导致fatal error的问题,并提供了使用sync.Map或concurrent-map库作为并发安全的替代方案。
39 4
|
3月前
|
运维 Shell Go
构建 Go 应用 docker 镜像的十八种姿势
构建 Go 应用 docker 镜像的十八种姿势
|
3月前
|
Ubuntu Go Docker
[go]封装go的docker镜像
[go]封装go的docker镜像
|
5月前
|
Unix Docker 容器
使用docker 启动naocs 报错出现:standard_init_linux.go:241: exec user process caused "exec format error"
```markdown Error in Docker container startup: "standard_init_linux.go:241: exec user process caused \"exec format error\"". Occurred at 2024-06-29 09:26:19.910, followed by a failed hook with a syslog delivery error at 09:27:20.193. Seeking solutions from experts. ```
|
6月前
|
Kubernetes Cloud Native Go
Golang深入浅出之-Go语言中的云原生开发:Kubernetes与Docker
【5月更文挑战第5天】本文探讨了Go语言在云原生开发中的应用,特别是在Kubernetes和Docker中的使用。Docker利用Go语言的性能和跨平台能力编写Dockerfile和构建镜像。Kubernetes,主要由Go语言编写,提供了方便的客户端库与集群交互。文章列举了Dockerfile编写、Kubernetes资源定义和服务发现的常见问题及解决方案,并给出了Go语言构建Docker镜像和与Kubernetes交互的代码示例。通过掌握这些技巧,开发者能更高效地进行云原生应用开发。
184 1
|
Linux Go Docker
Go 语言怎么使用 Docker 部署项目?
Go 语言怎么使用 Docker 部署项目?
248 0
|
6月前
|
Kubernetes Go 开发者
Go语言与Docker容器结合的实践应用与案例分析
【2月更文挑战第23天】本文通过分析实际案例,探讨了Go语言与Docker容器技术结合的实践应用。通过详细阐述Go语言在容器化环境中的开发优势,以及Docker容器技术在Go应用部署中的重要作用,本文旨在为读者提供Go语言与Docker容器结合的具体实现方法和实际应用场景。