iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Docker API如何在Golang中使用
  • 249
分享到

Docker API如何在Golang中使用

2023-06-14 10:06:26 249人浏览 安东尼
摘要

Docker api如何在golang中使用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。安装 SDK通过下面的命令就可以安装 SDK 了:Go get G

Docker api如何在golang中使用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

安装 SDK

通过下面的命令就可以安装 SDK 了:

Go get GitHub.com/docker/docker/client

管理本地的 Docker

该部分会介绍如何使用 Golang + Docker API 进行管理本地的 Docker。

运行容器

第一个例子将展示如何运行容器,相当于 docker run docker.io/library/alpine echo "hello world":

package mainimport ( "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, client.WithAPIVersionNegotiation()) if err != nil { panic(err) } 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)}

后台运行容器

还可以在后台运行容器,相当于 docker run -d bfirsh/reticulate-splines:

package mainimport ( "context" "fmt" "io" "os" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container" "github.com/docker/docker/client")func main() { ctx := context.Background() cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) if err != nil { panic(err) } imageName := "bfirsh/reticulate-splines" out, err := cli.ImagePull(ctx, imageName, types.ImagePullOptions{}) if err != nil { panic(err) } io.Copy(os.Stdout, out) resp, err := cli.ContainerCreate(ctx, &container.Config{ Image: imageName, }, nil, nil, "") if err != nil { panic(err) } if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil { panic(err) } fmt.Println(resp.ID)}

查看容器列表

列出正在运行的容器,就像使用 docker ps 一样:

package mainimport ( "context" "fmt" "github.com/docker/docker/api/types" "github.com/docker/docker/client")func main() { ctx := context.Background() cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) if err != nil {  panic(err) } containers, err := cli.ContainerList(ctx, types.ContainerListOptions{}) if err != nil {  panic(err) } for _, container := range containers {  fmt.Println(container.ID) }}

如果是 docker ps -a,我们可以通过修改 types.ContainerListOptions 中的 All 属性达到这个目的:

// type ContainerListOptions struct {// Quiet bool// Size bool// All  bool// Latest bool// Since string// Before string// Limit int// Filters filters.Args// }options := types.ContainerListOptions{ All: true,}containers, err := cli.ContainerList(ctx, options)if err != nil { panic(err)}

停止所有运行中的容器

通过上面的例子,我们可以获取容器的列表,所以在这个案例中,我们可以去停止所有正在运行的容器。

注意:不要在生产服务器上运行下面的代码。

package mainimport ( "context" "fmt" "github.com/docker/docker/api/types" "github.com/docker/docker/client")func main() { ctx := context.Background() cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) if err != nil {  panic(err) } containers, err := cli.ContainerList(ctx, types.ContainerListOptions{}) if err != nil {  panic(err) } for _, container := range containers {  fmt.Print("Stopping container ", container.ID[:10], "... ")  if err := cli.ContainerStop(ctx, container.ID, nil); err != nil {   panic(err)  }  fmt.Println("Success") }}

获取指定容器的日志

通过指定容器的 ID,我们可以获取对应 ID 的容器的日志:

package mainimport ( "context" "io" "os" "github.com/docker/docker/api/types" "github.com/docker/docker/client")func main() { ctx := context.Background() cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) if err != nil {  panic(err) } options := types.ContainerLogsOptions{ShowStdout: true} out, err := cli.ContainerLogs(ctx, "f1064a8a4c82", options) if err != nil {  panic(err) } io.Copy(os.Stdout, out)}

查看镜像列表

获取本地所有的镜像,相当于 docker image ls 或 docker images:

package mainimport ( "context" "fmt" "github.com/docker/docker/api/types" "github.com/docker/docker/client")func main() { ctx := context.Background() cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) if err != nil {  panic(err) } images, err := cli.ImageList(ctx, types.ImageListOptions{}) if err != nil {  panic(err) } for _, image := range images {  fmt.Println(image.ID) }}

拉取镜像

拉取指定镜像,相当于 docker pull alpine:

package mainimport ( "context" "io" "os" "github.com/docker/docker/api/types" "github.com/docker/docker/client")func main() { ctx := context.Background() cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) if err != nil {  panic(err) } out, err := cli.ImagePull(ctx, "alpine", types.ImagePullOptions{}) if err != nil {  panic(err) } defer out.Close() io.Copy(os.Stdout, out)}

拉取私有镜像

除了公开的镜像,我们平时还会用到一些私有镜像,可以是 DockerHub 上私有镜像,也可以是自托管的镜像仓库,比如 harbor。这个时候,我们需要提供对应的凭证才可以拉取镜像。

值得注意的是:在使用 Docker API 的 Go SDK 时,凭证是以明文的方式进行传输的,所以如果是自建的镜像仓库,请务必使用 https

package mainimport ( "context" "encoding/base64" "encoding/JSON" "io" "os" "github.com/docker/docker/api/types" "github.com/docker/docker/client")func main() { ctx := context.Background() cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) if err != nil {  panic(err) } authConfig := types.AuthConfig{  Username: "username",  PassWord: "password", } encodedjsON, err := json.Marshal(authConfig) if err != nil {  panic(err) } authStr := base64.URLEncoding.EncodeToString(encodedJSON) out, err := cli.ImagePull(ctx, "alpine", types.ImagePullOptions{ReGIStryAuth: authStr}) if err != nil {  panic(err) } defer out.Close() io.Copy(os.Stdout, out)}

保存容器成镜像

我们可以将一个已有的容器通过 commit 保存成一个镜像:

package mainimport ( "context" "fmt" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container" "github.com/docker/docker/client")func main() { ctx := context.Background() cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) if err != nil {  panic(err) } createResp, err := cli.ContainerCreate(ctx, &container.Config{  Image: "alpine",  Cmd: []string{"touch", "/helloworld"}, }, nil, nil, "") if err != nil {  panic(err) } if err := cli.ContainerStart(ctx, createResp.ID, types.ContainerStartOptions{}); err != nil {  panic(err) } statusCh, errCh := cli.ContainerWait(ctx, createResp.ID, container.WaitConditionNotRunning) select { case err := <-errCh:  if err != nil {   panic(err)  } case <-statusCh: } commitResp, err := cli.ContainerCommit(ctx, createResp.ID, types.ContainerCommitOptions{Reference: "helloworld"}) if err != nil {  panic(err) } fmt.Println(commitResp.ID)}

管理远程的 Docker

当然,除了可以管理本地的 Docker, 我们同样也可以通过使用 Golang + Docker API 管理远程的 Docker。

远程连接

默认 Docker 是通过非网络的 Unix 套接字运行的,只能够进行本地通信(/var/run/docker.sock),是不能够直接远程连接 Docker 的。
我们需要编辑配置文件 /etc/docker/daemon.json,并修改以下内容(把 192.168.59.3 改成你自己的 IP 地址),然后重启 Docker:

# vi /etc/docker/daemon.json{ "hosts": [ "tcp://192.168.59.3:2375", "unix:///var/run/docker.sock" ]}systemctl restart docker

修改 client

创建 client 的时候需要指定远程 Docker 的地址,这样就可以像管理本地 Docker 一样管理远程的 Docker 了:

cli, err = client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation(), client.WithHost("tcp://192.168.59.3:2375"))

看完上述内容,你们掌握Docker API如何在Golang中使用的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网GO频道,感谢各位的阅读!

您可能感兴趣的文档:

--结束END--

本文标题: Docker API如何在Golang中使用

本文链接: https://www.lsjlt.com/news/269967.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Docker API如何在Golang中使用
    Docker API如何在Golang中使用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。安装 SDK通过下面的命令就可以安装 SDK 了:go get g...
    99+
    2023-06-14
  • 如何使用 Golang 构建 RESTful API 并部署到 Docker?
    非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
    99+
    2024-05-15
  • 使用Golang玩转Docker API的实践
    目录安装 SDK管理本地的 Docker运行容器后台运行容器查看容器列表停止所有运行中的容器获取指定容器的日志查看镜像列表拉取镜像拉取私有镜像保存容器成镜像管理远程的 Docker远...
    99+
    2024-04-02
  • 如何在Django中使用API?
    好的,以下是文章内容: Django是一个流行的Python Web框架,它提供了许多内置的功能和库,使得开发Web应用变得更加容易。其中一个内置的功能是Django的REST框架,它让我们能够轻松地创建和使用API。 本文将会介绍如何在D...
    99+
    2023-06-29
    编程算法 django api
  • 如何在Golang API中减少内存占用?
    为了减少golang api中内存占用,可以:使用内存池来避免频繁分配和释放内存。使用字节切片代替字符串,减少字节存储。释放不再使用的资源,如文件句柄和数据库连接。使用内存剖析工具找出内...
    99+
    2024-05-07
    golang 内存优化 内存占用 标准库
  • 如何在Room中使用Kotlin API
    本篇文章给大家分享的是有关如何在Room中使用Kotlin API,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。定义数据库表在我们的数据库中仅有一个表,就是保存词汇的表。Wor...
    99+
    2023-06-14
  • 如何在Java中使用NPM API?
    在Java中使用NPM API可以让开发人员更加便捷地管理和使用NPM包,而不需要离开Java开发环境。本文将介绍如何在Java中使用NPM API,并附带演示代码。 一、NPM API简介 NPM API是一个基于RESTful的API,...
    99+
    2023-09-26
    api npm 关键字
  • 如何在HTML5中使用Geolocation API
    这期内容当中小编将会给大家带来有关如何在HTML5中使用Geolocation API,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Geolocation是HTML5标准下的一个Web API,利用它可以...
    99+
    2023-06-09
  • 如何在Python中使用shell API?
    Python是一种流行的编程语言,它具有简单易学、高效灵活、可扩展性强等优点,因此越来越多的人选择使用Python来进行编程工作。在Python中,我们可以使用shell API来执行shell命令,这样就可以让Python具有更强大的功能...
    99+
    2023-10-16
    关键字 shell api
  • 如何在Golang中进行API查询
    Golang是一种相对较新的编程语言,但已成为开发人员的首选。在开发应用程序时,特别是在构建可伸缩服务时,Golang的高性能和并发性使其成为理想的选择。Golang的API查询是一项基本任务,本文将介绍如何在Golang中进行API查询。...
    99+
    2023-05-14
  • 如何在Ubuntu16.04中使用Docker Compose
    本篇内容主要讲解“如何在Ubuntu16.04中使用Docker Compose”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何在Ubuntu16.04中使用Docker Compose”吧!...
    99+
    2023-06-28
  • 如何在golang 中使用Logrus
    如何在golang 中使用Logrus?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。golang Logrus简易使用教程使用Logrus的最简单方法:package&nb...
    99+
    2023-06-15
  • 如何在PHP中使用NumPy Load API?
    在本文中,我们将介绍如何在PHP中使用NumPy Load API。NumPy是一个Python库,用于科学计算和数值分析,提供了强大的数组操作和数学函数,可以用于线性代数、傅里叶变换和随机数生成等任务。NumPy Load API是Num...
    99+
    2023-08-28
    api numpy load
  • 如何在docker中使用create命令
    这篇文章将为大家详细讲解有关如何在docker中使用create命令,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。创建容器docker create -it -...
    99+
    2023-06-14
  • 如何使用Golang进行API请求
    Golang是一门现代化的编程语言,而且它在后端语言领域中越来越受欢迎。它的优点包括高效的并发处理、内存安全性和垃圾收集机制。在本文中,我们将探讨如何使用Golang进行API请求。首先,我们需要从安装Golang开始。Golang便携式安...
    99+
    2023-05-14
  • 如何在golang中使用cobra库
    如何在golang中使用cobra库?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。cobra  是 go 语言的一个库,可以用于编写命令行工具。通常我...
    99+
    2023-06-15
  • 如何在Golang中使用模板
    Golang使用模板的步骤:1、用go get命令安装模板引擎;2、创建一个包含占位符的文本文件;3、使用Parse()方法解析模板;4、使用Execute()方法渲染模板;5、模板变量的解析;6、如果模板需要包含子模板,可以进行模板嵌套;...
    99+
    2023-12-12
    Golang
  • 如何在Golang中使用协程
    这篇文章将为大家详细讲解有关如何在Golang中使用协程,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。什么是golanggolang 是Google开发的一种静态强类型、编译型、并发型,并具...
    99+
    2023-06-14
  • 如何在 Golang 中使用事务?
    非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
    99+
    2024-05-14
  • 如何在PHP中使用实时Path API?
    当今的Web应用程序需要实时地获取和处理数据,Path API是一种强大的工具,它可以帮助开发人员轻松地实现实时数据处理功能。在本文中,我们将介绍如何在PHP中使用实时Path API。 Path API是一个可以与实时数据进行交互的API...
    99+
    2023-07-09
    实时 path api
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作