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

使用 Golang 玩转 Docker API Docker 提供了一个与 Docker 守护进程交互的 API (称为Docker Engine API),我们可以使用官方提供的 Go 语言的 SDK 进行构建和扩展 Docker 应用程序和解决方案。 安装 SDK 通过下面的命令就可以安装 SDK 了: go get github.com/docker/docker/client 管理本地的 Docker 该部分会介绍如何使用 Golang + Docker API 进行管理本地的 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 main

import (
	"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 main

import (
	"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 main

import (
	"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 打包成 tar
	dockerfile := []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 / 边缘计算环境中的动态部署

在优快云学Golang云原生(Docker容器) 值得注意的是,在创建命名空间隔离的网络时,需要确保该网络的名称在宿主机上是唯一的。包来创建和管理 Docker 容器,并通过不同类型的网络驱动来实现容器之间的通信。需要注意的是,在创建 overlay 网络时,我们需要指定一个 IPAM 配置来管理容器的 IP 地址分配。通过这种方式,容器就可以在一个独立的命名空间内运行,与主机和其他容器隔离开来。需要注意的是,在运行具有长期运行服务(例如 Web 服务器)的 Docker 容器时,请务必确保正确设置健康检查和自动重启策略以确保高可用性。 阅读详情

相关推荐

Docker基础教程(223)Docker Remote API之容器API:玩转Docker容器API:让你的容器乖乖听话的魔法手册

Docker Remote API是一个RESTful接口,允许开发者通过HTTP请求直接与Docker守护进程交互。本文深度解析容器API的核心功能,涵盖容器生命周期管理(创建、启动、停止、删除)、日志获取和状态监控,并附Go语言完整示例。掌握API不仅提升自动化效率,更需注意安全风险,避免未授权访问导致**容器逃逸。

jxf_jxfcsdn的博客 700

go docker sdk使用第一章----入门

golang docker sdk 需要和安装的docker api version相兼容。一般我们只需要注意docker api version就可以了.查看本地docker api version拉取docker client sdkgo 代码中得创一个docker client。后面和docker 所有操作都走这个client,你甚至能创几个来自不同机器的client,在程序内控制几台机器的docker。

A_super_C的博客 1109

基于新张量核范数的TRPCA:多维数据低秩稀疏分解的理论与实践

本文深入探讨了基于新张量核范数的TRPCA(张量鲁棒主成分分析)技术。该技术通过t-product运算和新定义的张量核范数,能有效从多维数据(如视频、彩色图像)中分离低秩背景与稀疏前景/噪声。文章结合理论、核心算法(ADMM、t-SVT)及图像恢复、视频背景建模等实战案例,展示了其在处理复杂多维数据分解任务中的强大优势。

weixin_29173777的博客 269

golang使用docker的sdk进行构建镜像,拉取镜像,上传镜像等操作

文章目录一、golang操作docker操作镜像二 、删除镜像为标签 none:none 的操作 一、golang操作docker操作镜像 最近,由于业务上面的需要,需要构建镜像,在查了一些资料之后,将构建镜像、push镜像、pull镜像总结了一下,尤其在构建镜像的时候我们需要注意的点比较多,下面直接放代码 // 1.Docker docker client type Docker struct { *client.Client } // 2.init docker client func NewDoc

Azj12345的博客 6380

FreeCAD MCP实战:用AI自然语言驱动CAD建模与自动化

在计算机辅助设计(CAD)领域,参数化建模和自动化脚本是提升设计效率的核心技术。其原理在于通过程序化指令控制三维模型的创建与修改,从而将设计意图转化为精确的几何实体。这种技术价值在于显著降低重复性操作成本,实现快速原型迭代和设计探索。在应用场景上,它尤其适用于需要频繁调整尺寸、生成系列化零件或执行规则化建模任务的工程与产品设计。本文聚焦的FreeCAD MCP项目,正是这一理念的先进实践。它通过集成Model Context Protocol(MCP),构建了一个连接Claude AI与FreeCAD的智能

weixin_26913055的博客 723

计算机视觉三大顶会(ICCV/CVPR/ECCV)投稿指南与趋势解析

本文详细解析计算机视觉三大顶会(ICCV/CVPR/ECCV)的投稿指南与最新趋势。从基础认知到实战经验,涵盖时间线管理、选题策略、论文写作技巧及实验设计要点,帮助研究者提升投稿成功率。特别关注2024年技术融合、评估维度和伦理要求等前沿趋势,为计算机视觉领域的研究者提供实用建议。

weixin_29165725的博客 1834

Golang使用Docker client api接口

Golang使用Docker client api接口

skh2015java的博客 3542

六自由度机器人(机械臂)运动学建模及运动规划系列(四)——轨迹规划

本篇介绍了六轴机器人关节空间以及笛卡尔空间轨迹规划的简单方法,并给出了一种几何解法,以简化规划过程,并提供了简单的Matlab轨迹规划函数介绍。

weixin_47849087的博客 5万+

go语言之docker命令行操作

其中,docker login命令用于登录到Registry,docker tag命令用于给镜像打上标签,以便更易于识别和管理,docker push命令用于将镜像上传到Registry中。docker run命令用于启动一个新的容器,并运行在其中指定的命令。其中,-d选项表示在后台运行容器,--name选项指定容器的名称,-p选项指定将容器的80端口映射到主机的8080端口上。在使用Docker SDK包之前,需要先创建一个Docker客户端对象,该对象用于执行Docker命令行操作。

SMILY12138的博客 1375

反激电源及其变压器计算与绕制

本内容以一个宽电压输入 24V3A 输出的 72W 反激电源为例来计算电路的各个参数和器件选型,包含反激变压器的计算与绕制方法。

让你爱上电路设计 1933

LightGBM之LGBMRegressor()参数详解以及调参

LightGBMLight Gradient Boosting Machine)是一种梯度提升框架,它使用决策树作为基学习器。LightGBM 可以说是在 XGBoost 上做的优化。LightGBM 为高效并行计算而生,它的 Light 体现在以下几个点上:更快的训练速度更低的内存使用支持单机多线程,多机并行计算,以及 GPU 训练能够处理大规模数据。

我走的每一步都算数 3747

go调用docker远程API(二)-docker API 的容器操作

1 获取容器列表 2 查看指定容器信息 3. 查看容器日志 4 创建容器 4.1 简单使用 4.2 端口映射 4.3 挂载本机目录/文件 5. 启动容器 6 停止容器 7 删除(已停止的)容器 8 进入容器执行命令

架构+开发+运维 2525

手把手教你学Simulink--基础储能管理场景实例:基于Simulink的扩展卡尔曼滤波(EKF)SOC估计算法仿真

本文介绍了基于Simulink的扩展卡尔曼滤波(EKF)在电池SOC估算中的应用。通过Thevenin等效电路建立非线性电池模型,详细阐述了EKF的状态预测和更新过程。在Simulink中搭建了完整的仿真系统,包括电池模型、EKF核心算法模块和误差分析模块。通过脉冲放电和变电流充放电两种工况测试,验证了EKF算法在短期误差(<0.8%)、长期累积误差(<1.5%)和动态响应时间(30ms)方面的优越性能,相比传统安时积分法显著提高了估算精度。文章还提出了自适应EKF、多模型融合等进阶优化方向,为

MHD0815的博客 99

Docker SDK使用(一)---Golang实现pull镜像创建容器等操作

一、基本情况介绍二、Golang代码及配置三、G 一、基本情况介绍 本文章涉及代码已经上传到我的github: 开发环境:window10 64位 开发工具:IntelliJ IDEA 2019.2.3 x64 部署操作系统:Centos7 Golang版本:1.13 Docker版本:18.06.3-ce Docker SDK官方指导如下 https://docs.docker.com/engine/api/sdk/ 官方示例如下 https://docs.docker.com/engine/api/.

reachyu的博客 3081

控制科学与工程(自动化)保研经验【4】——浙大篇

控制科学与工程(自动化)保研经验【4】——浙大篇

Control Everything 1万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

go基于docker SDK,前端页面动态显示容器日志

go基于docker SDK,前端页面动态显示容器日志 需要用到的包 github.com/gin-gonic/gin nhooyr.io/websocket github.com/docker/docker/client 文件目录 ├── docker │ ├── conn.go │ └── conn_test.go ├── go.mod ├── go.sum ├── html │ └── index.html └── main.go 静态页面 代码展示 <!DOCTYPE html

小人物也有大梦想 3611

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Docker SDK使用(二)---Golang实现docker run docker

环境信息Docker ADocker A run Docker B 环境信息 开发环境:window10 64位 开发工具:IntelliJ IDEA 2019.2.3 x64 部署操作系统:Centos7 Golang版本:1.13 Docker版本:18.06.3-ce        接上篇《Docker SDK使用(一)—Golang实现pull镜像创建容器等》。      &nb.

reachyu的博客 1640

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

golang中对于docker sdk的使用

本文涉及到使用golang docker sdk 进行 pull、exec、push、import等常见操作的教程,对官方文档缺失的示例进行了补充。 docker sdk 官方文档:https://docs.docker.com/engine/api/sdk/examples/ docker client 初始化 docker client 有多种初始化方法, 本文使用从env中读取的方式。 client, _ := client.NewClientWithOpts(client.FromEnv, clie

Extreme的博客 2802

告别Docker SDK:用Go构建Containerd gRPC客户端的完整指南

containerd 是一个功能强大的容器运行时和镜像生成工具,用于管理容器化应用程序的生命周期。本指南将带你了解如何使用 Go 语言构建 containerd gRPC 客户端,摆脱对 Docker SDK 的依赖,更高效地与 containerd 进行交互。 ## 为什么选择 containerd gRPC 客户端? containerd 作为容器化应用程序管理的核心工具,提供了高效、稳定

gitblog_00985的博客 766

2024年最全【Golang】golang使用三方SDK操作容器指南_go 引入外部sdk(1),2024年最新字节Golang面试必问

配置创建Docker 容器的结构体,具体字段的含义和用途如下:1.Hostname: 容器的主机名。2.Domainname: 容器的域名。3.User: 执行容器内命令的用户,也支持指定用户和用户组。4.: 是否连接标准输入,使得用户可以与容器进行交互。5.: 是否连接标准输出。6.: 是否连接标准错误输出。7.: 用于指定容器暴露的端口,是一个类型的字段。8.Tty: 是否将标准流连接到 tty(终端),包括标准输入(如果它没有关闭的话)。9.OpenStdin: 是否打开标准输入。

2401_84920041的博客 965

go Docker Http Api && SDK 调用

1.修改配置文件 设置api端口 vi /lib/systemd/system/docker.service [Service] ExecStart=/usr/bin/dockerd -H unix://var/run/docker.sock -H tcp://0.0.0.0:2375 设置保存 重启docker systemctl daemon-reload systemctl restart...

qq_17668519的博客 2807

使用Docker的API及SDK

Docker的API介绍使用

SongyangJi 3043

Go语言与Docker交互:版本与容器信息查询Client

在现代的软件开发和部署过程中,Docker 已经成为了一个非常重要的工具,它可以帮助我们快速、高效地打包、部署和运行应用程序。而 Go 语言作为一种高效、简洁的编程语言,其官方提供的`docker/docker` SDK 可以方便地与 Docker 守护进程(Docker daemon)进行交互。在本文中,我们将详细介绍如何使用 Go 语言来查看 Docker 的相关信息,包括 Docker 版本信息和容器信息。

2401_83649605的博客 1181

WDK学习笔记_docker容器客户端_fabric-go-sdk

文章目录摘要一、pandas是什么?二、使用步骤总结 摘要 一、pandas是什么? 容器内创建通道: peer channel create -o orderer.trace.com:7050 --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/trace.com/msp/tlscacerts/tlsca.trace.com-cert.pem -c mycha

sunningzhzh的博客 4662

MetaTube SDK Go Docker部署指南:从开发到生产环境的最佳实践

MetaTube SDK Go是一个强大的元数据抓取和处理框架,专为视频内容管理而设计。本文将为您提供完整的MetaTube SDK Go Docker部署指南,涵盖从基础安装到生产环境优化的全流程。无论您是开发人员还是系统管理员,都能通过这份终极指南快速掌握MetaTube的容器化部署技巧。 ## 📦 项目概述与核心功能 MetaTube SDK Go是一个基于Go语言开发的元数据管理SD

gitblog_00125的博客 464

Win系统使用docker部署go的gin框架简单应用

本文内容:在已经使用docker toolbox在win环境下安装好了docker,以及go的sdk的基础上,如何使用docker部署go的gin框架简单应用 在使用docker toolbox安装docker,涉及到Docker环境的初始化时候,会在VirtualBox中创建名字为【default】的linux虚拟机,会用到名为boot2docker.iso的镜像。然而一般下载时候自带的这个镜...

Foehn_revol的博客 1308
上一篇: RabbitMQ 在实际开发中的应用场景与实现方案
下一篇: Kubernetes 架构
Cxzzzzzzzzzz
博客等级 码龄4年 229粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值