基于golang操作Docker

这篇具有很好参考价值的文章主要介绍了基于golang操作Docker。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

官方库

github.com/docker/docker

  • github.com/docker/docker/api/types
  • github.com/docker/docker/client
  • github.com/docker/docker/api/types/container
  • github.com/docker/docker/pkg/stdcopy

官方文档

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

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

docker 开启远程访问

vim /usr/lib/systemd/system/docker.service

在[Service]部分,修改ExecStart参数,在最后增加-H tcp://0.0.0.0:2375

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375
systemctl daemon-reload && systemctl restart docker
  1. 查看是否成功 curl http://localhost:2375/version

如果不能访问,可能是因为防火墙的原因,所以开放防火墙2357端口

firewall-cmd --zone=public --add-port=2375/tcp --permanent
firewall-cmd --r

Docker开启远程安全访问 请参考 https://blog.csdn.net/yuntiank/article/details/116520114

Docker 开启远程安全访问(脚本生成配置) 请参考 https://blog.csdn.net/cszzboy/article/details/123552589文章来源地址https://www.toymoban.com/news/detail-432042.html

实例

package main

import (
	"context"
	"encoding/base64"
	"encoding/json"
	"io"
	"log"
	"os"

	"github.com/docker/docker/api/types"
	"github.com/docker/docker/api/types/container"
	"github.com/docker/docker/client"
	"github.com/docker/docker/pkg/stdcopy"
)

func main(){
	case1()

	case2()

	case3()

	case4()

	case5()
}

// docker 客户端
func Client() *client.Client {
	// 获取docker镜像列表
	//cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) // 连接本地的docker

	// 连接 开启了远程访问的docker
	cli, err := client.NewClientWithOpts(client.WithHost("tcp://192.168.0.9:2375"), client.WithAPIVersionNegotiation())

	// 连接 开启了远程访问的docker, 旧方法,已经弃用
	//cli, err := client.NewClient("tcp://127.0.0.1:2375", "1.40", nil, nil)
	if err != nil {
		log.Println(err)
		os.Exit(0)
	}
	return cli
}

// docker image ls
func case1(){
	cli := Client()
	images, err := cli.ImageList(context.Background(), types.ImageListOptions{})
	if err != nil {
		log.Println(err)
		os.Exit(0)
	}
	var imagesLib []string
	for _, image := range images {
		log.Println("image = ", image)
		log.Println("_______________\n\n")
		imagesLib = append(imagesLib, image.RepoTags[0])
	}
	log.Println(imagesLib)
}

// docker ps
func case2(){
	cli := Client()
	containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{})
	if err != nil {
		panic(err)
	}

	for _, container := range containers {
		log.Print("container = ", container)
		log.Println("_______________\n\n")
		// 停止所有容器
		//if err := cli.ContainerStop(context.Background(), container.ID, nil); err != nil {
		//	panic(err)
		//}
	}
}

// 运行一个容器
// docker run
func case3(){
	cli := Client()
	// 拉镜像
	reader, err := cli.ImagePull(context.Background(), "docker.io/library/alpine", types.ImagePullOptions{})
	if err != nil {
		panic(err)
	}

	defer reader.Close()
	io.Copy(os.Stdout, reader)


	/*
	container.Config:
		Hostname        string              // 主机名
		Domainname      string              // 域名
		User            string              // 将在容器内运行命令的用户,还支持User:group
		AttachStdin     bool                // 附加标准输入,实现用户交互
		AttachStdout    bool                // 附加标准输出
		AttachStderr    bool                // 附加标准误差
		ExposedPorts    nat.PortSet         `json:",omitempty"` //暴露端口列表
		Tty             bool                // 将标准流附加到Tty,如果Tty未关闭,则包括stdin。
		OpenStdin       bool                // Open stdin
		StdinOnce       bool                // 如果为true,请在连接的1个客户端断开连接后关闭stdin。
		Env             []string            // 要在容器中设置的环境变量列表
		Cmd             strslice.StrSlice   // 启动容器时要运行的命令
		Healthcheck     *HealthConfig       `json:",omitempty"` // Healthcheck描述了如何检查容器是否健康
		ArgsEscaped     bool                `json:",omitempty"` // True,如果命令已转义(意味着将其视为命令行)(特定于Windows)。
		Image           string              // 操作传递的镜像的名称(例如,可以是符号)
		Volumes         map[string]struct{} // 用于容器的卷(装载)列表
		WorkingDir      string              // 将启动命令中的当前目录(PWD)
		Entrypoint      strslice.StrSlice   // 启动容器时要运行的入口点
		NetworkDisabled bool                `json:",omitempty"` // 已禁用网络
		MacAddress      string              `json:",omitempty"` // 容器的Mac地址
		OnBuild         []string            // image Dockerfile上定义的OnBuild元数据
		Labels          map[string]string   // 设置到此容器的标签列表
		StopSignal      string              `json:",omitempty"` // 停止容器的信号
		StopTimeout     *int                `json:",omitempty"` // 停止容器的超时(秒)
		Shell           strslice.StrSlice   `json:",omitempty"` // Shell表示RUN的Shell形式,CMD,ENTRYPOINT
	 */

	/*
	container.HostConfig:
		Binds           []string      // 此容器的卷绑定列表
		ContainerIDFile string        // 写入containerId的文件(路径)
		LogConfig       LogConfig     // 此容器的日志配置
		NetworkMode     NetworkMode   // 用于容器的网络模式
		PortBindings    nat.PortMap   // 暴露端口(容器)和主机之间的端口映射
		RestartPolicy   RestartPolicy // 用于容器的重新启动策略
		AutoRemove      bool          // 退出时自动删除容器
		VolumeDriver    string        // 用于装载卷的卷驱动程序的名称
		VolumesFrom     []string      // 从其他容器获取的卷列表

		// Applicable to UNIX platforms
		CapAdd          strslice.StrSlice // 要添加到容器的内核功能列表
		CapDrop         strslice.StrSlice // 要从容器中删除的内核功能列表
		CgroupnsMode    CgroupnsMode      // 用于容器的Cgroup命名空间模式
		DNS             []string          `json:"Dns"`        // 要查找的DNS服务器列表
		DNSOptions      []string          `json:"DnsOptions"` // 要查找的DNS选项列表
		DNSSearch       []string          `json:"DnsSearch"`  // 要查找的DNS搜索列表
		ExtraHosts      []string          // 额外主机列表
		GroupAdd        []string          // 容器进程将作为其运行的其他组的列表
		IpcMode         IpcMode           // 用于容器的IPC命名空间
		Cgroup          CgroupSpec        // 用于容器的Cgroup
		Links           []string          // 链接列表(名称:alias form)
		OomScoreAdj     int               // OOM-killing的容器偏好
		PidMode         PidMode           // 用于容器的PID命名空间
		Privileged      bool              // 容器是否处于特权模式
		PublishAllPorts bool              // docker是否应该发布容器的所有暴露端口
		ReadonlyRootfs  bool              // 容器根文件系统是只读的吗
		SecurityOpt     []string          // 用于自定义MLS系统(如SELinux)标签的字符串值列表。
		StorageOpt      map[string]string `json:",omitempty"` // 每个容器的存储驱动程序选项。
		Tmpfs           map[string]string `json:",omitempty"` // 用于集装箱的tmpfs(支架)列表
		UTSMode         UTSMode           // 用于容器的UTS命名空间
		UsernsMode      UsernsMode        // 用于容器的用户命名空间
		ShmSize         int64             // shm内存使用总量
		Sysctls         map[string]string `json:",omitempty"` // 用于容器的命名空间sysctl列表
		Runtime         string            `json:",omitempty"` // 与此容器一起使用的运行时

		// Applicable to Windows
		ConsoleSize [2]uint   // 初始控制台尺寸(高度、宽度)
		Isolation   Isolation // 容器的隔离技术(例如默认、hyperv)

		// 包含容器的资源(cgroup、ulimit)
		Resources

		// 安装容器使用的规格
		Mounts []mount.Mount `json:",omitempty"`

		// MaskedPaths是容器内要屏蔽的路径列表(这将覆盖默认路径集)
		MaskedPaths []string

		// ReadonlyPaths是要在容器内设置为只读的路径列表(这将覆盖默认路径集)
		ReadonlyPaths []string

		// 在容器内运行自定义init,如果为null,则使用守护进程的配置设置
		Init *bool `json:",omitempty"`
	 */

	/*
	network.NetworkingConfig:
		EndpointsConfig map[string]*EndpointSettings // 为每个连接网络配置端点
	 */

	/*
	specs.Platform:
		// 架构字段指定CPU架构,例如
		// `amd64` or `ppc64`.
		Architecture string `json:"architecture"`

		// 操作系统指定操作系统,例如“linux”或“windows”。
		OS string `json:"os"`

		// OSVersion是一个可选字段,用于指定操作系统
		// 版本,例如在Windows“10.0.14393.1066”上。
		OSVersion string `json:"os.version,omitempty"`

		// OSFeatures是一个可选字段,用于指定字符串数组,
		// 每个都列出了所需的操作系统功能(例如在Windows“win32k”上).
		OSFeatures []string `json:"os.features,omitempty"`

		// 变量是一个可选字段,用于指定CPU的变量
		// 示例“v7”用于在体系结构为“arm”时指定ARMv7。
		Variant string `json:"variant,omitempty"`
	 */

	// 创建容器
	resp, err := cli.ContainerCreate(context.Background(), &container.Config{
		Image: "alpine",
		Cmd:   []string{"echo", "hello world"},
		Tty:   false,
	}, nil, nil, nil, "")
	if err != nil {
		panic(err)
	}

	// 启动容器
	if err := cli.ContainerStart(context.Background(), resp.ID, types.ContainerStartOptions{}); err != nil {
		panic(err)
	}

	// 监听容器状态
	statusCh, errCh := cli.ContainerWait(context.Background(), resp.ID, container.WaitConditionNotRunning)
	select {
	case err := <-errCh:
		if err != nil {
			panic(err)
		}
	case <-statusCh:
	}

	// 获取容器日志
	out, err := cli.ContainerLogs(context.Background(), resp.ID, types.ContainerLogsOptions{ShowStdout: true})
	if err != nil {
		panic(err)
	}

	stdcopy.StdCopy(os.Stdout, os.Stderr, out)
}

// docker pull
// 通过身份验证拉取图像
func case4(){
	cli := Client()
	authConfig := types.AuthConfig{
		Username: "username",
		Password: "password",
	}
	encodedJSON, err := json.Marshal(authConfig)
	if err != nil {
		panic(err)
	}
	authStr := base64.URLEncoding.EncodeToString(encodedJSON)

	out, err := cli.ImagePull(context.Background(), "alpine", types.ImagePullOptions{RegistryAuth: authStr})
	if err != nil {
		panic(err)
	}

	defer out.Close()
	io.Copy(os.Stdout, out)
}

// docker push
func case5(){
	cli := Client()
	createResp, err := cli.ContainerCreate(context.Background(), &container.Config{
		Image: "alpine",
		Cmd:   []string{"touch", "/helloworld"},
	}, nil, nil, nil, "")
	if err != nil {
		panic(err)
	}

	if err := cli.ContainerStart(context.Background(), createResp.ID, types.ContainerStartOptions{}); err != nil {
		panic(err)
	}

	statusCh, errCh := cli.ContainerWait(context.Background(), createResp.ID, container.WaitConditionNotRunning)
	select {
	case err := <-errCh:
		if err != nil {
			panic(err)
		}
	case <-statusCh:
	}

	commitResp, err := cli.ContainerCommit(context.Background(), createResp.ID, types.ContainerCommitOptions{Reference: "helloworld"})
	if err != nil {
		panic(err)
	}

	log.Println(commitResp.ID)
}

// 远程 ssh连接
// 如果有报错 exec /usr/lib/ssh/ssh-askpass : No such file or directory error.
// 安装 ssh-askpass
//		sudo apt-get autoremove openssh-client
//		sudo apt-get install openssh-client openssh-sftp-server openssh-server ssh
//		sudo apt-get install ssh-askpass
func case6(){
	helper, err := connhelper.GetConnectionHelper("ssh://root@192.168.0.192:22")
	if err != nil {
		log.Println(err)
		return
	}
	httpClient := &http.Client{
		Transport: &http.Transport{
			DialContext: helper.Dialer,
		},
	}
	cl, err := client.NewClientWithOpts(
		client.WithHTTPClient(httpClient),
		client.WithHost(helper.Host),
		client.WithDialContext(helper.Dialer),
	)
	if err != nil {
		log.Println("Unable to create docker client")
		panic(err)
	}

	log.Println(cl.ImageList(context.Background(), types.ImageListOptions{}))
}


到了这里,关于基于golang操作Docker的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于Docker官方php:7.1.33-fpm镜像构建支持67个常见模组的php7.1.33镜像

    实践说明:基于RHEL7(CentOS7.9)部署docker环境(23.0.1、24.0.2),所构建的php7.1.33镜像应用于RHEL7-9(如AlmaLinux9.1),但因为docker的特性,适用场景是不限于此的。 文档形成时期:2017-2023年 因系统或软件版本不同,构建部署可能略有差异,但本文未做细分,对稍有经验者应不存在明显障

    2024年01月22日
    浏览(53)
  • 基于 Docker 搭建 Hadoop 分布式及 Docker 基本操作使用

    Docker的整个生命周期有三部分组成:镜像(image)+容器(container)+仓库(repository)简单来讲,镜像是文件,容器是进程容器是基于镜像创建的,即容器中的进程依赖于镜像中的文件,在Docker的生命周期中,最核心的两个部分,一个是镜像 (Images),一个是容器 (Containers)。 镜像

    2024年02月11日
    浏览(58)
  • docker镜像仓库hub.docker.com无法访问

    文章主要内容: 介绍dockerhub为什么无法访问 解决办法 最近许多群友都询问为什么无法访问Docker镜像仓库,于是我也尝试去访问,结果果然无法访问。 大家的第一反应就是给墙了,通过ping检测红的很可怕。 实际上是DNS被污染了,导致很多用户都无法访问。至于什么是DNS污染

    2024年02月07日
    浏览(53)
  • 【基于Docker-Compose安装ELK日志系统完整操作步骤】

    ELK是三个开源软件的缩写,分别是Elasticsearch、Logstash、Kibana,一般情况下会结合FileBeat使用 。 Elasticsearch :是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。 Kibana :是一款开源

    2024年02月10日
    浏览(52)
  • docker基础操作与进阶 - 搭建基于pm2的node环境

    最近遇到一台机器需要部署两个不同版本node的情况,首先就想起了docker,想必还有其他类似环境问题的情况,需要进行项目隔离,而docker正是用来解决这个问题的。 docker的优势就在于环境隔离,相当于可以在一台机器上切割成若干个子机器,而各个子机器之前互不影响,另

    2024年02月11日
    浏览(44)
  • docker镜像仓库hub.docker.com无法访问-解决办法

    目录 docker镜像仓库hub.docker.com无法访问-解决办法 1 个人镜像站点 2 dockerhub为什么无法访问 2.1 查看dockerhub实际IP 2.2 ping检测 3 镜像加速 3.1 使用国内镜像加速 3.1.1 docker配置: 3.1.2 containerd配置: 3.2 使用博主个人镜像仓库 3.2.1 目前有如下镜像仓库,后续会陆续增加 3.2.2 使用方

    2024年02月09日
    浏览(48)
  • Docker容器的官方镜像仓库

    镜像仓库分类 公有仓库 私有仓库 官方镜像仓库属于公有仓库 网址: hub.docker.com        网站名称:dockerhub 注册邮箱 创建仓库 创建自己的仓库 登录仓库  web界面登录 linux命令行登录  直接docker login 输入用户名和密码 这个自己创建的存储库一般只有pull时才会登录 push上传

    2024年02月08日
    浏览(53)
  • docker 部署oracle(官方镜像)

    docker部署oracle,网上都说官方镜像下载慢。而且使用的都是阿里的registry。我试了下官方镜像,半个多小时pull完。也没多慢啊!下面就来说说安装和配置过程: 1、拉去镜像: 2、查看镜像: 3、创建并运行容器: 4、登录到容器: 或者sudo docker ps -a 查看容器id讲oracle11g替换成

    2024年02月15日
    浏览(38)
  • 翻译docker官方文档(残缺版)

    The order of Dockerfile instructions matters. A Docker build consists of a series of ordered build instructions. Each instruction in a Dockerfile roughly translates to an image layer. The following diagram illustrates how a Dockerfile translates into a stack of layers in a container image. Dockerfile指令的顺序很重要。Docker构建由一系列有序的构

    2024年02月07日
    浏览(43)
  • Docker:官方拉取限制问题

    问题:如docker pull等docker命令受限制 toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading:Understanding Your Docker Hub Rate Limit | Docker 2020 年 11 月 20 日,Docker Hub 基于个人 IP 地址对匿名和免费认证的用户进行了镜像拉取次数的限制。 对于匿名用户

    2024年02月09日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包