golang远程操作docker api方式

 更新时间:2025年12月05日 10:22:03   作者:野猪佩挤  
文章介绍了Docker监听并处理三种socket形式的API请求:unix、tcp和fd,默认情况下,Docker已经开启了unix socket,并且只有root用户或docker用户组成员才有权限访问,用户可以通过编辑docker守护进程的配置文件,添加tcp参数来开放远程API访问

golang远程操作docker api

Docker 可以监听并处理 3 种 socket 形式的 API 请求,分别是unix(unix 域协议)、tcp(tcp 协议)和fd。

一般来说,在安装好 docker 后,默认就已经开启了unix socket,并且我们在执行需要有root权限或者docker用户组成员才有权限访问。例如:

curl --unix-socket /var/run/docker.sock  http://docker/version

添加远程 API 访问接口

编辑 docker 守护进程的配置文件/lib/systemd/system/docker.service,找到运行主命令的那一行,其内容大致为"ExecStart=/usr/bin/dockerd -H fd:// … "的那一行,给dockerd命令加参数-H tcp://0.0.0.0:2375,意思是在 2375 端口开放 API 访问。

例如在我的设备上,配置文件相应的那一行原本为

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

添加参数后变为

ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375  --containerd=/run/containerd/containerd.sock

重新加载

systemctl daemon-reload          # 重新加载守护进程配置
systemctl restart docker.service # 重启 docker 服务

测试

comp@Linux system % docker -H tcp://192.168.64.7:2375 version
Client:
 Cloud integration: v1.0.22
 Version:           20.10.11
 API version:       1.41
 Go version:        go1.16.10
 Git commit:        dea9396
 Built:             Thu Nov 18 00:36:09 2021
 OS/Arch:           darwin/arm64
 Context:           default
 Experimental:      true

测试可以访问

comp@Linux system % docker -H tcp://192.168.64.7:2375 images 
REPOSITORY       TAG       IMAGE ID       CREATED       SIZE
gossh            v01       fa111aaaec47   8 days ago    35.6MB
<none>           <none>    670ae487e585   8 days ago    35.6MB
nginx            latest    eeb9db34b331   8 days ago    134MB
httpd            latest    1c2ff9e4eb7d   2 weeks ago   136MB
arm64v8/alpine   latest    8e1d7573f448   6 weeks ago   5.33MB
alpine           latest    8e1d7573f448   6 weeks ago   5.33MB

go 获取启动的容器

package main

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

	cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation(),
		client.WithHost("tcp://192.168.64.7:2375"))
	if err != nil {
		panic(err)
	}

	containers, err := cli.ContainerList(ctx, types.ContainerListOptions{})
	if err != nil {
		panic(err)
	}

	for _, container := range containers {
		fmt.Println(container.Names, container.Image, container.Ports, container.Status,
			container.ImageID)

	}

}

启动一个容器

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, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation(),
		client.WithHost("tcp://192.168.64.7:2375"))
	//cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
	if err != nil {
		panic(err)
	}

	imageName := "httpd:latest"

	out, err := cli.ImagePull(ctx, imageName, types.ImagePullOptions{})
	if err != nil {
		panic(err)
	}
	defer out.Close()
	io.Copy(os.Stdout, out)

	resp, err := cli.ContainerCreate(ctx, &container.Config{
		Image: imageName,
	}, nil, nil, nil, "")
	if err != nil {
		panic(err)
	}

	if err := cli.ContainerStart(ctx, resp.ID, types.ContainerStartOptions{}); err != nil {
		panic(err)
	}

	fmt.Println(resp.ID)
}

拉取镜像

package main

import (
	"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(),
		client.WithHost("tcp://192.168.64.7:2375"))
	//cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
	if err != nil {
		panic(err)
	}

	out, err := cli.ImagePull(ctx, "httpd:latest", types.ImagePullOptions{})
	if err != nil {
		panic(err)
	}

	defer out.Close()

	io.Copy(os.Stdout, out)
}

官网参考

https://docs.docker.com/engine/api/sdk/examples/

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 详解Go语言中空结构体的惯用法

    详解Go语言中空结构体的惯用法

    空结构体在 Go 编程中有着广泛的应用,本文将详细探讨空结构体的几种典型用法,并解释为何它们在特定场景下非常有用,希望对大家有所帮助
    2024-11-11
  • golang 删除切片的某个元素及剔除切片内的零值方式

    golang 删除切片的某个元素及剔除切片内的零值方式

    这篇文章主要介绍了golang 删除切片的某个元素及剔除切片内的零值方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Go语言中iota的具体使用

    Go语言中iota的具体使用

    Go语言中,iota是一个用于生成一系列相关常量值的常量生成器,常应用于枚举、位操作等场景,广泛用于定义HTTP状态码、权限控制等,本文就来介绍一下iota的具体使用,感兴趣的可以了解一下
    2024-11-11
  • Go语言循环遍历含有中文的字符串的方法小结

    Go语言循环遍历含有中文的字符串的方法小结

    这篇文章主要介绍了Go语言循环遍历含有中文的字符串的几种方法,文章通过代码示例讲解的非常详细,具有一定的参考价值,感兴趣的小伙伴跟着小编一起来看看吧
    2023-07-07
  • Go语言中的Panic和Recover,从原理到实践

    Go语言中的Panic和Recover,从原理到实践

    本文详细介绍了Go语言中的Panic和Recover机制,包括它们的基本概念、用法、最佳实践以及实战应用,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2026-04-04
  • 聊聊golang的defer的使用

    聊聊golang的defer的使用

    这篇文章主要介绍了聊聊golang的defer的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Go表达式引擎expr基础用法实战指南

    Go表达式引擎expr基础用法实战指南

    expr是一个高性能的 Go 表达式引擎,它允许你在代码中安全地执行动态生成的表达式,本文给大家介绍Go表达式引擎expr基础用法实战指南,感兴趣的朋友跟随小编一起看看吧
    2025-10-10
  • golang中iota的用法小结

    golang中iota的用法小结

    iota是Go语言中的一个预定义标识符,用于表示const声明块中每个常量的偏移值,本文主要介绍了golang中iota的用法小结,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03
  • golang快速实现网页截图的方法

    golang快速实现网页截图的方法

    这篇文章主要介绍了golang快速实现网页截图的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 一文带你搞懂Go如何读写Excel文件

    一文带你搞懂Go如何读写Excel文件

    Excelize是一个用纯Go语言编写的库,提供了一组函数,可以对XLAM / XLSM / XLSX / XLTM / XLTX文件进行读写。支持读写由Microsoft Excel™2007及以后版本生成的电子表格文档。本文就将用它实现读写Excel文件操作,感兴趣的可以学习一下
    2022-11-11

最新评论