
如何把 Moby Go SDK 集成到自己的 Go 应用中创建并管理容器【免费下载链接】mobyThe Moby Project - a collaborative project for the container ecosystem to assemble container-based systems项目地址: https://gitcode.com/GitHub_Trending/mo/moby如果你要在自己的 Go 程序里完成创建容器、启动、检查状态、停止、删除这条完整链路Moby 仓库中的client模块可以直接复用它是docker命令行连接 daemon 所用的同一个 Go 客户端文档说明你的应用可以借助它完成命令行能做的任何操作包括运行容器、拉取或推送镜像等见 client/README.md。前提是你的机器上已有一个运行中的 Docker Engine daemonGo 工具链为 1.24 及以上——client模块自己的 go.mod 声明go 1.24。前提条件一个可访问的 daemon。Linux 上默认走本地 Unix socketWindows 上默认走命名管道要连接其他位置的 daemon 时通过环境变量DOCKER_HOST指定client/envvars.go。一个新的 Go 模块。引入模块路径为github.com/moby/moby/clientREADME 示例中的 import 路径go get github.com/moby/moby/client初始化客户端并连接 daemon创建客户端统一使用client.New通过Opt选项配置。最常用的组合是client.FromEnv它等价于同时启用WithTLSClientConfigFromEnv()、WithHostFromEnv()和WithAPIVersionFromEnv()依次读取这些环境变量见 client/client_options.goDOCKER_HOST覆盖默认 daemon 地址DOCKER_API_VERSION固定 API 版本格式MAJOR.MINOR例如1.19文档注明应只用于调试目的因为它可能把客户端设置到不兼容或无效的版本上DOCKER_CERT_PATHTLS 证书目录ca.pem、cert.pem、key.pemDOCKER_TLS_VERIFY控制 TLS 证书校验。apiClient, err : client.New( client.FromEnv, client.WithUserAgent(my-application/1.0.0), ) if err ! nil { log.Fatal(err) } defer apiClient.Close()WithUserAgent用于自定义 User-Agent 头Close()会关闭空闲连接长生命周期进程应确保调用。关于 API 版本客户端默认启用版本协商在第一个请求时执行之后不再重复client/client.go。当前客户端支持的最高版本MaxAPIVersion为1.56最低版本MinAPIVersion为1.40如果 daemon 报告的版本低于1.40协商会报错提示该 API 版本不受此客户端支持。需要固定版本时用client.WithAPIVersion(1.52)格式major.minor它会同时禁用自动协商连接远程 daemon 也可以用client.WithHost(tcp://host:port)直接指定地址。创建容器创建容器调用ContainerCreate参数是ContainerCreateOptions定义见 client/container_create_opts.go 同目录ctx : context.Background() created, err : apiClient.ContainerCreate(ctx, client.ContainerCreateOptions{ Image: my-image:tag, // 替换为 daemon 上可用的镜像引用 Name: example-app, // 容器名可省略 }) if err ! nil { log.Fatal(err) } containerID : created.ID注意两个来自实现的行为约束镜像是必填项ContainerCreateOptions.Image只是Config.Image的快捷方式两者只能设置其一同时设置会返回参数错误返回值ContainerCreateResult只有ID和Warnings两个字段后续所有操作都用ID。如果需要设置环境变量、命令、工作目录等填Config字段即可类型为api/types/container包中的container.Config其字段包括Env、Cmd、Entrypoint、WorkingDir、User、Labels、ExposedPorts等见 api/types/container/config.go。启动并验证容器启动用ContainerStartif _, err : apiClient.ContainerStart(ctx, containerID, client.ContainerStartOptions{}); err ! nil { log.Fatal(err) }验证方式参考 client/README.md 中的示例程序调用ContainerList列出容器逐条打印 ID、状态和镜像等价于docker ps --allresult, err : apiClient.ContainerList(ctx, client.ContainerListOptions{ All: true, }) if err ! nil { log.Fatal(err) } fmt.Printf(%s %-22s %s\n, ID, STATUS, IMAGE) for _, ctr : range result.Items { fmt.Printf(%s %-22s %s\n, ctr.ID, ctr.Status, ctr.Image) }ContainerListOptions.All: true表示同时列出停止和运行中的容器。如果只需要查单个容器的完整信息用ContainerInspect它返回container.InspectResponse和原始 JSON 的Raw字段Size: true会额外计算文件系统大小文档提示这是一个高开销操作不需要时不要开启。等待退出、停止与删除等待容器到达指定状态用ContainerWait支持的条件有not-runningcontainer.WaitConditionNotRunning默认值、next-exit和removed见 client/container_wait.gowaitRes : apiClient.ContainerWait(ctx, containerID, client.ContainerWaitOptions{ Condition: container.WaitConditionNotRunning, }) res, err : ... // 从 waitRes.Result / waitRes.Error 两个通道读取该方法返回Result -chan container.WaitResponse和Error -chan error两个通道允许你在调用ContainerStart之前先发起next-exit等待实现两个操作的同步。停止用ContainerStop可选参数语义在 client/container_stop.go 中有明确注释Signal不设置时默认发SIGTERMTimeout为nil时使用容器配置的超时或引擎默认值设为-1表示无限等待、不做强杀设为0表示不等待优雅退出直接强杀其他正值按秒计。timeout : 10 if _, err : apiClient.ContainerStop(ctx, containerID, client.ContainerStopOptions{Timeout: timeout}); err ! nil { log.Fatal(err) }删除用ContainerRemove文档注释为 kills and removes a container即会先终止再删除。可选项Force强制删除、RemoveVolumes同时删除关联卷、RemoveLinks同时删除链接if _, err : apiClient.ContainerRemove(ctx, containerID, client.ContainerRemoveOptions{}); err ! nil { log.Fatal(err) }限制与安全注意版本协商失败是唯一有明确文档描述的错误现象daemon 的 API 版本低于1.40时客户端不会更新版本并直接返回错误。跨版本部署时优先依赖默认协商而不是硬编码版本。client/envvars.go 中的警告必须转述给你的读者对远程 daemon API 的访问权限等同于该 daemon 所在宿主机的 root 权限。不要把 API 无保护地暴露在网络上本地访问推荐默认 socket/命名管道远程访问优先考虑ssh://连接如果必须走 TCP TLS用DOCKER_CERT_PATH配置证书并保持DOCKER_TLS_VERIFY开启校验关闭校验仅建议用于测试。ContainerListOptions中的Latest、Since、Before字段已标记 DeprecatedLatest不起作用应改用Limit: 1Since/Before自 API 1.24 起不再受支持应改用 filter。完整链路create → start → inspect → wait → stop → remove对应的源码入口分别是 container_create.go、container_start.go、container_inspect.go、container_wait.go、container_stop.go、container_remove.go。需要覆盖更多操作时客户端还实现了镜像、网络、卷、swarm、日志、exec 等完整 API 面方法签名可以按同一模式在这些文件中查阅。【免费下载链接】mobyThe Moby Project - a collaborative project for the container ecosystem to assemble container-based systems项目地址: https://gitcode.com/GitHub_Trending/mo/moby创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考