Go语言与Docker交互:版本与容器信息查询Client

文章目录

  • Go语言查看Docker容器相关信息
    • Go语言实现Docker版本信息查看
      • 编写 Go 程序获取简单的字段
      • 代码解释
      • 代码测试
      • 封装成标准格式
      • 主程序调用
    • Docker 容器信息查询
      • 代码解释
      • 代码测试
    • 整合代码,提供 CLI 交互
      • 代码解释
      • 代码测试

Go语言查看Docker容器相关信息

Go语言与Docker交互:版本与容器信息查询Client_第1张图片

在现代的软件开发和部署过程中,Docker 已经成为了一个非常重要的工具,它可以帮助我们快速、高效地打包、部署和运行应用程序。而 Go 语言作为一种高效、简洁的编程语言,其官方提供的docker/docker SDK 可以方便地与 Docker 守护进程(Docker daemon)进行交互。在本文中,我们将详细介绍如何使用 Go 语言来查看 Docker 的相关信息,包括 Docker 版本信息和容器信息。

Go语言实现Docker版本信息查看

在命令行输入docker version 可以获取到docker 自身的基本信息。

查看Docker版本信息:

[root@master goproject]# docker version 
Client: Docker Engine - Community
 Version:           26.1.4
 API version:       1.45
 Go version:        go1.21.11
 Git commit:        5650f9b
 Built:             Wed Jun  5 11:32:04 2024
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          26.1.4
  API version:      1.45 (minimum version 1.24)
  Go version:       go1.21.11
  Git commit:       de5c9cf
  Built:            Wed Jun  5 11:31:02 2024
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.33
  GitCommit:        d2d58213f83a351ca8f528a95fbd145f5654e957
 runc:
  Version:          1.1.12
  GitCommit:        v1.1.12-0-g51d5e94
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

从这个输出中,我们可以看到 Docker 客户端和服务器的版本信息、API 版本、Go 语言版本等重要信息。

编写 Go 程序获取简单的字段

下面是一个简单的 Go 程序,用于获取 Docker 版本信息中的一些简单字段:

package main

/**
 * @Description
 * @Author 是垚不是土
 * @Date 2025/6/17 13:01
 **/

import (
	"context"
	"fmt"
	"github.com/docker/docker/client"
)

func main() {
	ctx := context.Background()

	cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
	if err != nil {
		panic(err)
	}

	v, err := cli.ServerVersion(ctx)
	if err != nil {
		panic(err)
	}

	fmt.Println("Docker version:", v.Version)
	fmt.Println("Server:", v.Platform)
	fmt.Println("API version:", v.APIVersion)
	fmt.Println("Kernel version:", v.KernelVersion)
	fmt.Println("OS:", v.Os)
}

代码解释

  1. 创建上下文context.Background() 创建一个空的上下文,用于控制请求的生命周期。
  2. 创建 Docker 客户端client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) 使用环境变量配置客户端,并自动协商 API 版本。
  3. 获取 Docker 服务器版本信息cli.ServerVersion(ctx) 调用客户端的 ServerVersion 方法,获取 Docker 服务器的版本信息。
  4. 打印版本信息:使用 fmt.Println 打印 Docker 版本、服务器平台、API 版本、内核版本和操作系统信息。

代码测试

运行上述代码,输出结果如下:

Docker version: 26.1.4
Server: {Docker Engine - Community}
API version: 1.45
Kernel version: 3.10.0-1160.119.1.el7.x86_64
OS: linux

封装成标准格式

为了更好地管理和使用 Docker 版本信息,我们将其封装成一个标准的结构体,并提供一个函数来获取这些信息。

dockerInfo/version.go:

package dockerInfo

import (
	"context"
	"fmt"
	"github.com/docker/docker/client"

	"time"
)

/**
 * @Description
 * @Author 是垚不是土
 * @Date 2025/6/17 13:37
 **/

//可以再将其放在modles.go文件下
type DockerVersion struct {
	Version    string `json:"version"`
	Server     string `json:"server"`
	APIVersion string `json:"api_version"`
	Kernel     string `json:"kernel"`
	OS         string `json:"os"`
	GoVersion  string `json:"go_version"`
	Status     string `json:"status"`
}

func GetDockerVersionInfo() DockerVersion {
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()
	result := DockerVersion{
		Status: "未初始化",
	}

	cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
	if err != nil {
		result.Status = fmt.Sprintf("客户端错误:%v", err)
		return result
	}

	// 获取服务器版本信息
	v, err := cli.ServerVersion(ctx)
	if err != nil {
		result.Status = fmt.Sprintf("版本获取错误: %v", err)
		return result
	}

	serverName := ""
	if v.Platform.Name != serverName {
		serverName = v.Platform.Name
	}

	return DockerVersion{
		Version:    v.Version,
		Server:     v.Platform.Name,
		APIVersion: v.APIVersion,
		Kernel:     v.KernelVersion,
		OS:         v.Os,
		GoVersion:  v.GoVersion,
		Status:     "成功获取",
	}
	return result
}

主程序调用

main.go:

package main

/**
 * @Description
 * @Author 是垚不是土
 * @Date 2025/6/17 13:01
 **/

import (
	dockerv "docker/dockerInfo"
	"fmt"
)

func main() {
	versionInfo := dockerv.GetDockerVersionInfo()
	if versionInfo.Status != "成功获取" {
		fmt.Println("获取失败", versionInfo.Status)
	}

	//当Docker版本存在(当Docker存在)
	if versionInfo.Version != "" {
		fmt.Println("Docker版本信息:")
		fmt.Println("--------------------------------")
		fmt.Println("Docker版本:", versionInfo.Version)
		fmt.Println("服务平台:", versionInfo.Server)
		fmt.Println("API版本:", versionInfo.APIVersion)
		fmt.Println("内核版本:", versionInfo.Kernel)
		fmt.Println("Go语言版本:", versionInfo.GoVersion)
		fmt.Println("操作系统:", versionInfo.OS)
		fmt.Println("--------------------------------")
	}
}

查看测试信息:

Docker版本信息:
--------------------------------
Docker版本: 26.1.4
服务平台: Docker Engine - Community
API版本: 1.45
内核版本: 3.10.0-1160.119.1.el7.x86_64
Go语言版本: go1.21.11
操作系统: linux
--------------------------------

灰常完美奥~

Docker 容器信息查询

除了查看 Docker 版本信息,我们还可以查看 Docker 容器的信息。下面是一个简单的程序,用于查询 Docker 容器的基本信息。

dockerInfo/stats.go:

package dockerInfo

import (
	"context"
	"fmt"
	"github.com/docker/docker/api/types/container"
	"github.com/docker/docker/client"
)

func GetContainersStats() {
	//获取ctx
	ctx := context.Background()

	//获取cli客户端
	cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
	if err != nil {
		panic(err)
	}

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

	for _, container := range containers {
		fmt.Println("----------------容器信息---------------")
		fmt.Println("容器Name:", container.Names)
		fmt.Println("容器ID:", container.ID)
		fmt.Println("镜像Name:", container.Image)
		fmt.Println("镜像ID:", container.ImageID)
		fmt.Println("当前运行状态:", container.Status)
		fmt.Println("容器Port:", container.Ports)
		fmt.Println("容器Command:", container.Command)
		fmt.Println("-------------------------------------")
	}
}

代码解释

  1. 创建上下文context.Background() 创建一个空的上下文,用于控制请求的生命周期。
  2. 创建 Docker 客户端client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) 使用环境变量配置客户端,并自动协商 API 版本。
  3. 获取容器列表cli.ContainerList(ctx, container.ListOptions{}) 调用客户端的 ContainerList 方法,获取所有容器的列表。
  4. 遍历容器列表:使用 for 循环遍历容器列表,打印每个容器的名称、ID、镜像名称、镜像 ID、当前运行状态、端口映射和命令等信息。

代码测试

----------------容器信息---------------
容器Name: [/docker-api-1]
容器ID: fb32f561bb2c41f1e61aea0dd18085c9f5ab309c56b639399ba9fbcdbd9341ef
镜像Name: langgenius/dify-api:1.4.0
镜像ID: sha256:bbb5b197a907d46c18ea1e4bb6a4818bb1cce1bc3a52553ac66d75c98af78ae1
当前运行状态: Up 7 hours
容器Port: [{ 5001 0 tcp}]
容器Command: /bin/bash /entrypoint.sh
-------------------------------------
......

到这里,查看Docker的基本信息我们就可以做一个整合了哦,让用户查看CLI进行查看相应的信息。

整合代码,提供 CLI 交互

为了方便用户查看 Docker 的基本信息,我们将上述代码进行整合,并提供一个简单的命令行界面(CLI),让用户可以选择要查看的信息。

main.go:

package main

/**
 * @Description
 * @Author 是垚不是土
 * @Date 2025/6/17 13:01
 **/

import (
	"bufio" // 用于读取输入
	dockerv "docker/dockerInfo"
	"fmt"     // 用于输入输出格式化
	"os"      // 用于操作系统交互
	"strings" // 用于字符串处理
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	for {
		// 打印菜单选项
		fmt.Println("\nDocker信息查看")
		fmt.Println("1. 获取Docker版本信息")
		fmt.Println("2. 查询容器信息")
		fmt.Println("3. 退出系统")
		fmt.Print("请选择操作编号:")
		scanner.Scan()
		input := strings.TrimSpace(scanner.Text())

		switch input {
		case "1":
			dockerv.GetDockerVersionInfo()
		case "2":
			dockerv.GetContainersStats()
		case "3":
			fmt.Println("感谢使用,再见!")
			return
		default:
			fmt.Println("无效的输入,请重新输入")
		}
	}

}

代码解释

  1. 创建扫描器bufio.NewScanner(os.Stdin) 创建一个扫描器,用于读取用户的输入。
  2. 打印菜单选项:使用 fmt.Println 打印菜单选项,让用户选择要查看的信息。
  3. 读取用户输入scanner.Scan() 读取用户输入的一行文本,并使用 strings.TrimSpace 去除首尾空格。
  4. 根据用户输入执行相应的操作:使用 switch 语句根据用户输入的编号执行相应的操作,如获取 Docker 版本信息、查询容器信息或退出系统。

再次整合dockerInfo/version.go:

package dockerInfo

import (
	"context"
	"fmt"
	"github.com/docker/docker/client"
	"time"
)

/**
 * @Description
 * @Author 是垚不是土
 * @Date 2025/6/17 13:37
 **/

type DockerVersion struct {
	Version    string `json:"version"`
	Server     string `json:"server"`
	APIVersion string `json:"api_version"`
	Kernel     string `json:"kernel"`
	OS         string `json:"os"`
	GoVersion  string `json:"go_version"`
	Status     string `json:"status"`
}

func getDockerVersionInfo() DockerVersion {
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()
	result := DockerVersion{
		Status: "未初始化",
	}

	cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
	if err != nil {
		result.Status = fmt.Sprintf("客户端错误:%v", err)
		return result
	}

	// 获取服务器版本信息
	v, err := cli.ServerVersion(ctx)
	if err != nil {
		result.Status = fmt.Sprintf("版本获取错误: %v", err)
		return result
	}

	serverName := ""
	if v.Platform.Name != serverName {
		serverName = v.Platform.Name
	}

	return DockerVersion{
		Version:    v.Version,
		Server:     v.Platform.Name,
		APIVersion: v.APIVersion,
		Kernel:     v.KernelVersion,
		OS:         v.Os,
		GoVersion:  v.GoVersion,
		Status:     "成功获取",
	}
	return result
}

func GetDockerVersionInfo() {
	//获取Docker版本信息
	versionInfo := getDockerVersionInfo()
	fmt.Println("Docker版本信息:")
	fmt.Println("--------------------------------")
	fmt.Println("Docker版本:", versionInfo.Version)
	fmt.Println("服务平台:", versionInfo.Server)
	fmt.Println("API版本:", versionInfo.APIVersion)
	fmt.Println("内核版本:", versionInfo.Kernel)
	fmt.Println("Go语言版本:", versionInfo.GoVersion)
	fmt.Println("操作系统:", versionInfo.OS)
	fmt.Println("--------------------------------")
}

代码测试

这个时候我们就可以进行测试了:

Docker信息查看
1. 获取Docker版本信息
2. 查询容器信息
3. 退出系统
请选择操作编号:1
Docker版本信息:
--------------------------------
Docker版本: 26.1.4
服务平台: Docker Engine - Community
API版本: 1.45
内核版本: 3.10.0-1160.119.1.el7.x86_64
Go语言版本: go1.21.11
操作系统: linux
--------------------------------

Docker信息查看
1. 获取Docker版本信息
2. 查询容器信息
3. 退出系统
请选择操作编号:2
----------------容器信息---------------
容器Name: [/docker-nginx-1]
容器ID: 84f0f99407ecf240f38ac3af0be6ce832cc3c98eb8f466e507d907d28c000383
镜像Name: nginx:latest
镜像ID: sha256:be69f2940aaf64fdf50c9c99420cbd57e10ee655ec7204df1c407e9af63d0cc1
当前运行状态: Up 7 hours
容器Port: [{0.0.0.0 443 443 tcp} {:: 443 443 tcp} {0.0.0.0 80 80 tcp} {:: 80 80 tcp}]
$//' /docker-entrypoint.sh && chmod +x /docker-entrypoint.sh && /docker-entrypoint.sh'
-------------------------------------
----------------容器信息---------------
容器Name: [/docker-api-1]
容器ID: fb32f561bb2c41f1e61aea0dd18085c9f5ab309c56b639399ba9fbcdbd9341ef
镜像Name: langgenius/dify-api:1.4.0
镜像ID: sha256:bbb5b197a907d46c18ea1e4bb6a4818bb1cce1bc3a52553ac66d75c98af78ae1
当前运行状态: Up 7 hours
容器Port: [{ 5001 0 tcp}]
容器Command: /bin/bash /entrypoint.sh
-------------------------------------


Docker信息查看
1. 获取Docker版本信息
2. 查询容器信息
3. 退出系统
请选择操作编号:3
感谢使用,再见!

通过以上步骤,我们实现了使用 Go 语言查看 Docker 版本信息和容器信息的功能,并提供了一个简单的命令行界面,方便用户进行交互。希望这篇文章对你有所帮助!

那么,债见!

你可能感兴趣的:(Go语言开发,golang,docker,交互,容器,信息可视化)