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语言中的作用域和变量隐藏,文中的示例代码讲解详细,对我们学习Go语言有一定的帮助,感兴趣的小伙伴可以了解一下
    2022-04-04
  • Go Slice扩容的这些坑你踩过哪些

    Go Slice扩容的这些坑你踩过哪些

    这篇文章主要为大家详细介绍了Golang中对切片Slice的append操作时会遇到的踩坑经验分享,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-03-03
  • go中的protobuf和grpc使用教程

    go中的protobuf和grpc使用教程

    gRPC 是 Google 公司基于 Protobuf 开发的跨语言的开源 RPC 框架,这篇文章主要介绍了go中的protobuf和grpc使用教程,需要的朋友可以参考下
    2024-08-08
  • 使用Go开发一个文件同步小工具(附源码)

    使用Go开发一个文件同步小工具(附源码)

    这篇文章主要为大家详细介绍了如何使用Go开发一个文件同步小工具并附上源码,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-11-11
  • golang 解析word文档操作

    golang 解析word文档操作

    这篇文章主要介绍了golang 解析word文档操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • windows下使用GoLand生成proto文件的方法步骤

    windows下使用GoLand生成proto文件的方法步骤

    本文主要介绍了windows下使用GoLand生成proto文件的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Go垃圾回收提升内存管理效率优化最佳实践

    Go垃圾回收提升内存管理效率优化最佳实践

    这篇文章主要为大家介绍了Go垃圾回收提升内存管理效率优化最佳实践,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • 四种Golang实现middleware框架的方式小结

    四种Golang实现middleware框架的方式小结

    middleware是一般框架里面常用的形式,比如web框架、rpc框架等,本文为大家详细介绍了四种实现middleawre的方式,感兴趣的可以了解一下
    2024-03-03
  • Golang中多个线程和多个协程的使用区别小结

    Golang中多个线程和多个协程的使用区别小结

    本文主要介绍了Golang中多个线程和多个协程的使用区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-06-06
  • Golang+Vue轻松构建Web应用的方法步骤

    Golang+Vue轻松构建Web应用的方法步骤

    本文主要介绍了Golang+Vue轻松构建Web应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05

最新评论