当前位置: 首页 > news >正文

使用 Go SDK 玩转 Docker:从容器到多架构构建


使用 Go SDK 玩转 Docker:从容器到多架构构建

Docker 提供了丰富的命令行工具,但在某些场景下(如平台开发、CI/CD 系统、自动化工具),我们更希望直接在代码里调用 Docker API。Go SDK 是官方推荐的方式,可以直接通过 Go 语言管理 Docker 容器、镜像和构建流程。

本文将带你使用 Go SDK(github.com/docker/docker/client)实现几个典型的功能,并展示如何进行多架构镜像构建。


1. 环境准备

go mod init docker-sdk-demo
go get github.com/docker/docker/client
go get github.com/docker/docker/api/types
go get github.com/docker/docker/api/types/container
go get github.com/docker/docker/api/types/strslice

2. 创建并运行容器

最简单的例子就是拉取镜像并运行一个容器。

package mainimport ("context""fmt""github.com/docker/docker/api/types/container""github.com/docker/docker/client"
)func main() {ctx := context.Background()cli, _ := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())// 创建容器resp, err := cli.ContainerCreate(ctx, &container.Config{Image: "alpine",Cmd:   []string{"echo", "Hello from Docker SDK"},}, nil, nil, nil, "my-alpine")if err != nil {panic(err)}// 启动容器if err := cli.ContainerStart(ctx, resp.ID, container.StartOptions{}); err != nil {panic(err)}fmt.Println("容器已启动:", resp.ID[:10])
}

运行结果会打印一行 Hello from Docker SDK


3. 执行命令并获取日志

除了运行一次性命令,还可以通过 SDK 捕获容器日志。

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, _ := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())resp, _ := cli.ContainerCreate(ctx, &container.Config{Image: "alpine",Cmd:   []string{"sh", "-c", "echo hello && sleep 2 && echo world"},}, nil, nil, nil, "")cli.ContainerStart(ctx, resp.ID, container.StartOptions{})// 获取日志out, _ := cli.ContainerLogs(ctx, resp.ID, types.ContainerLogsOptions{ShowStdout: true, Follow: true})io.Copy(os.Stdout, out)
}

输出将会是:

hello
world

4. 构建镜像(单架构)

我们先来实现一个基本的镜像构建。

Dockerfile:

FROM alpine
CMD ["echo", "Hello from custom image"]

Go 代码:

package mainimport ("archive/tar""bytes""context""os""github.com/docker/docker/api/types""github.com/docker/docker/client"
)func main() {ctx := context.Background()cli, _ := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())// 将 Dockerfile 打包成 tardockerfile := []byte(`FROM alpine
CMD ["echo", "Hello from custom image"]`)buf := new(bytes.Buffer)tw := tar.NewWriter(buf)tw.WriteHeader(&tar.Header{Name: "Dockerfile",Size: int64(len(dockerfile)),})tw.Write(dockerfile)tw.Close()// 构建镜像buildResp, _ := cli.ImageBuild(ctx, buf, types.ImageBuildOptions{Tags:       []string{"myimage:latest"},Dockerfile: "Dockerfile",Remove:     true,})defer buildResp.Body.Close()io.Copy(os.Stdout, buildResp.Body)
}

运行后就能得到 myimage:latest


5. 推送镜像到仓库

要推送到 Docker Hub 或 GitHub Packages,需要登录信息。

import ("encoding/base64""encoding/json"
)authConfig := types.AuthConfig{Username: "myuser",Password: "mypassword",
}
encodedJSON, _ := json.Marshal(authConfig)
authStr := base64.URLEncoding.EncodeToString(encodedJSON)// 推送镜像
pushResp, _ := cli.ImagePush(ctx, "myuser/myimage:latest", types.ImagePushOptions{RegistryAuth: authStr,
})
defer pushResp.Close()
io.Copy(os.Stdout, pushResp)

6. 多架构构建

Docker 官方推荐使用 buildx 进行多架构构建。但在 SDK 中同样可以指定平台。

import "github.com/docker/docker/api/types/versions"options := types.ImageBuildOptions{Tags:     []string{"myuser/myimage:multi"},Platform: "linux/amd64,linux/arm64", // 多架构
}

不过 Go SDK 直接支持单平台构建,要实现多平台通常需要借助 docker buildx bake 或者 buildkitd。一种可行做法是:

  • 在 SDK 中分平台循环构建
  • 推送到远端 registry
  • 通过 docker manifest create 合并为多架构镜像

示例:

platforms := []string{"linux/amd64", "linux/arm64"}for _, p := range platforms {buildResp, _ := cli.ImageBuild(ctx, buf, types.ImageBuildOptions{Tags:     []string{"myuser/myimage:" + p},Platform: p,Remove:   true,})io.Copy(os.Stdout, buildResp.Body)
}

然后再用命令行或 SDK 调用 docker manifest API 将这些镜像合并成一个 multi-arch 镜像。


总结

通过 Go SDK,我们实现了:

  1. 创建和运行容器
  2. 捕获日志
  3. 构建和推送镜像
  4. 多架构构建流程

适合场景:

  • 内部 CI/CD 系统
  • 自动化构建平台
  • IoT / 边缘计算环境中的动态部署

http://www.dtcms.com/a/414758.html

相关文章:

  • 原生微信小程序开发基础知识总结架构逻辑
  • 树莓派实现的自动垃圾(纸团)回收机器人
  • 【ROS2学习笔记】节点篇:节点概述
  • Java面试宝典:网络协议与Netty二
  • 自然语言处理(01)
  • 如何利用模板 + 继承的方式,形成动态多态的效果呢?
  • UE_ContrlRig
  • 江苏省城乡住房建设厅网站网站建设及维护流程图
  • ubuntu18.04安装五笔字型的方法
  • 上市公司网站建设要求成都丁香人才网官网专区
  • AI 原生应用:内容创作从 “手工作坊” 到 “智能工厂” 的革命
  • AIGC实战——交互式生成对抗网络(iGAN)
  • Scikit-learn Python机器学习 - 聚类分析算法 - DBSCAN(基于密度的噪声应用空间聚类)
  • PyTorch 实战:CIFAR-10 图像分类与网络优化
  • STM32H743-ARM例程10-WWDG
  • STM32H743-ARM例程9-IWDG看门狗
  • 什么是 mmdet3d
  • 建设银行嘉兴分行网站首页胶州网站建设dch100
  • Metal - 9. 深入剖析 3D 场景
  • 3DVG的当前面临的挑战和问题
  • 无代码企业网站开发网站建设管理和维护
  • 【C++】string类的常见接口的使用
  • 网站建设制作设计营销公司杭州亚马逊雨林探险作文
  • 东莞圆心科技网站开发哪里有做网站系统
  • 网站定位要点 有哪些方面大航母网站建设费用
  • iServer 启动端口冲突
  • 大连网站建设佳熙科技湖南专业seo优化公司
  • 单词配对记忆游戏小程序V1.1.0-“太空霓虹“视觉升级版
  • 如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘onnxruntime’ 问题
  • 设备租赁结算软件有哪些