【云原生】利用 docker api 管理容器

server/2024/10/17 12:39:00/

目的

容器进行管理

方案

使用 docker 官方sdk 对docker进行操作,操作依赖docker socket

官方sdk 参考 : https://docs.docker.com/engine/api/sdk/

准备工作

为了方便调试,打开docker socket 的2375端口

部分代码

定义一个docker client ,连接 docker socket

client.go

go">package dockermgrimport ("context""github.com/docker/docker/client""log""net"
)func DockerClient(apiVersion string) *client.Client {if apiVersion == "" {apiVersion = "1.39"}dockerClient, err := client.NewClientWithOpts(//client.WithHost("tcp://192.168.124.84:2375"),client.WithDialContext(func(_ context.Context, _, _ string) (net.Conn, error) {return net.Dial("unix", "/var/run/docker.sock")}),client.WithVersion(apiVersion))if err != nil {log.Fatal(err)}ping, err := dockerClient.Ping(context.Background())//}))if err != nil {log.Fatal(err)}log.Println(ping.APIVersion)return dockerClient
}

container.go
主要用来管理容器
这里定义了一个ClientAPI的结构体以及一个ClientAPIer的接口

go">package dockermgrimport ("context""errors""github.com/docker/docker/api/types""github.com/docker/docker/api/types/container""github.com/docker/docker/api/types/filters""github.com/docker/docker/api/types/network""github.com/docker/docker/client""io""net/http""os""strings"
)var c *ClientAPItype ClientAPI struct {DockerCli *client.ClientCtx       context.Context
}type ClientAPIer interface {Stop(containerId string, timeout int) errorRestart(containerId string, timeout int) errorPullImage(imageUrl string) errorCreate(config *container.Config, hostConfig *container.HostConfig, networkingConfig *network.NetworkingConfig, containerName string) (string, error)Start(containerId string, startOpts types.ContainerStartOptions) errorEnsureImageExist(image string) (bool, error)CreateNetwork(containerName string) (string, error)ConnectNetwork(networkId string, containerId string) errorRemoveImage(imageId string, removeOpt types.ImageRemoveOptions) errorStatus(containerId string) (*types.Container, error)Inspect(containerId string) (*types.ContainerJSON, error)Stats(containerId string, stream bool) (*types.ContainerStats, error)RemoveContainer(containerId string, removeVolumes bool) errorRemoveNetwork(networkId string) errorExec(containerId string, cmd []string) errorEnsureNetworkExist(networkName string) (string, error)FindContainer(containerName string) (string, error)IsImageUsed(imageID string) (bool, error)ContainerLogs(writer http.ResponseWriter, containerId string, follow bool, since string, tail string, until string) errorExportImage(imageId string) (io.ReadCloser, error)ImportImage(savePath string, repo string, tag string) errorImageInfo(imageId string) (*types.ImageInspect, error)
}func GetContainerAPIer() ClientAPIer {return c
}func NewContainerMgr(apiVersion string) ClientAPIer {return &ClientAPI{DockerCli: DockerClient(apiVersion),Ctx:       context.Background(),}
}func (c *ClientAPI) Create(config *container.Config, hostConfig *container.HostConfig, networkConfig *network.NetworkingConfig, containerName string) (string, error) {//var networkConfig *network.NetworkingConfigrspBody, err := c.DockerCli.ContainerCreate(c.Ctx, config, hostConfig, networkConfig, nil, containerName)if err != nil {return "", err}return rspBody.ID, nil
}func (c *ClientAPI) Start(containerId string, startOpts types.ContainerStartOptions) error {err := c.DockerCli.ContainerStart(c.Ctx, containerId, startOpts)if err != nil {return err}return nil
}func (c *ClientAPI) Status(containerId string) (*types.Container, error) {var args = filters.NewArgs()args.Add("id", containerId)containerInfo, err := c.DockerCli.ContainerList(c.Ctx, types.ContainerListOptions{All:     true,Filters: args})if err != nil {return nil, err}if len(containerInfo) > 0 {return &containerInfo[0], nil}return nil, errors.New("not found container")
}func (c *ClientAPI) Inspect(containerId string) (*types.ContainerJSON, error) {containerInpsect, err := c.DockerCli.ContainerInspect(c.Ctx, containerId)if err != nil {return nil, err}return &containerInpsect, nil
}func (c *ClientAPI) Stats(containerId string, stream bool) (*types.ContainerStats, error) {containerStats, err := c.DockerCli.ContainerStats(c.Ctx, containerId, stream)if err != nil {return nil, err}return &containerStats, nil
}func (c *ClientAPI) Stop(containerId string, timeout int) error {if timeout == 0 {timeout = 10}options := container.StopOptions{Signal:  "",Timeout: &timeout,}err := c.DockerCli.ContainerStop(c.Ctx, containerId, options)if err != nil {return err}return nil
}func (c *ClientAPI) Restart(containerId string, timeout int) error {if timeout == 0 {timeout = 10}options := container.StopOptions{Signal:  "",Timeout: &timeout,}err := c.DockerCli.ContainerRestart(c.Ctx, containerId, options)if err != nil {return err}return nil
}func (c *ClientAPI) RemoveContainer(containerId string, removeVolumes bool) error {//var duration = 10 * time.Seconderr := c.DockerCli.ContainerRemove(c.Ctx, containerId, types.ContainerRemoveOptions{RemoveVolumes: removeVolumes})if err != nil {return err}return nil
}func (c *ClientAPI) Exec(containerId string, cmd []string) error {execId, err := c.DockerCli.ContainerExecCreate(c.Ctx, containerId, types.ExecConfig{Cmd: cmd,})if err != nil {return err}//err = c.DockerCli.ContainerExecStart(c.Ctx, execId.ID, types.ExecStartCheck{//	Detach: false,//	Tty:    false,//})//if err != nil {//	return err//}resp, err := c.DockerCli.ContainerExecAttach(c.Ctx, execId.ID, types.ExecStartCheck{Detach: false,Tty:    false,})defer resp.Close()io.Copy(os.Stdout, resp.Reader)if err != nil {return err}return nil
}func (c *ClientAPI) FindContainer(containerName string) (string, error) {var args = filters.NewArgs()args.Add("name", containerName)containerInfos, err := c.DockerCli.ContainerList(c.Ctx, types.ContainerListOptions{All:     true,Filters: args})if err != nil {return "", err}if len(containerInfos) > 0 {for i, ci := range containerInfos {if strings.TrimLeft(ci.Names[0], "/") == containerName {return containerInfos[i].ID, nil}}}return "", nil
}func (c *ClientAPI) ContainerLogs(writer http.ResponseWriter, containerId string, follow bool, since string, tail string, until string) error {options := types.ContainerLogsOptions{ShowStdout: true,ShowStderr: true,Since:      since,Until:      until,Timestamps: false,Follow:     follow,Tail:       tail,Details:    false,}responseBody, err := c.DockerCli.ContainerLogs(c.Ctx, containerId, options)if err != nil {return err}defer responseBody.Close()writer.Header().Add("Content-Type", "application/octet-stream")writer.WriteHeader(200)_, err = io.Copy(writer, responseBody)return err
}

其他更多的代码内容,请参考我的github

我的Github


http://www.ppmy.cn/server/131760.html

相关文章

【Python】Python中的异常处理

【Python】Python中的异常处理 在Python中,异常处理是一种重要的编程技术,用于处理程序执行过程中可能出现的错误或异常情况。通过使用try、except、else和finally关键字,可以有效地管理这些异常,确保程序的稳定性和健壮性。 基…

《常见 HTML 标签和属性全解析》

《常见 HTML 标签和属性全解析》 在网页开发的世界里,HTML(超文本标记语言)就像是构建数字大厦的基石。它通过各种标签和属性来定义网页的结构、内容和样式。下面,让我们深入了解一些常见的 HTML 标签和属性。 一、HTML 标签 &…

Python轴承故障诊断 (八)基于EMD-CNN-GRU并行模型的故障分类

往期精彩内容: Python-凯斯西储大学(CWRU)轴承数据解读与分类处理 Pytorch-LSTM轴承故障一维信号分类(一)-CSDN博客 Pytorch-CNN轴承故障一维信号分类(二)-CSDN博客 Pytorch-Transformer轴承故障一维信号分类(三)-CSDN博客 三十多个开源…

自定义注解和组件扫描在Spring Boot中动态注册Bean(二)

在Spring Boot中,自定义注解和组件扫描是实现动态注册Bean的两种重要手段。通过它们,开发者可以灵活地管理Spring容器中的Bean,提高开发效率和代码的可维护性。本文将详细讲解自定义注解和组件扫描在Spring Boot中如何动态注册Bean。 自定义…

Linux调试器-gdb使用

目录 1.gbd的介绍 主要的功能 : 基础用法总结: 2.gdb的基础操作 1.生成调试 2.启动gdb 3.退出gdb 4.查看源码 5.运行程序 6.断点的设置与操作 1.断点的设置 2.查看断点 3.断点的禁用与启动 1.断点禁用 2.断点重启 4.断点的删除 ​编辑…

牛客小白月赛102(A,B,C,D,E)(思维,分层图,换根dp)

比赛链接 牛客小白月赛102 A题 思路 用 s e t set set检查 1 1 1~ k k k是不是全都出现过。 代码 #pragma GCC optimize("O2") #pragma GCC optimize("O3") #include <bits/stdc.h> using namespace std; #define int long long const int N …

nvm 常用命令清单

安装特定版本的 Node.js nvm install <version> 例如&#xff1a;安装 Node.js 20.15.0 nvm install 20.15.0 列出所有可安装的 Node.js 版本 nvm ls-remote 卸载某个 Node.js 版本 nvm uninstall <version> 例如&#xff1a;卸载 Node.js 20.15.0 nvm un…

底层框架和工具链

整体说明 一图胜千言&#xff0c;看看吧。 数据表导出 数据配置表导出算是一种无法绕开的基础设施吧。 大致使用 核心模块 项目由2个模块组成&#xff0c;一个是核心模块&#xff0c;另一个是图形化模块。 这里展示的是核心模块中的代码结构。 数据类型的相关截图。 图…