在现代的软件开发和部署过程中,Docker 已经成为了一个非常重要的工具,它可以帮助我们快速、高效地打包、部署和运行应用程序。而 Go 语言作为一种高效、简洁的编程语言,其官方提供的docker/docker
SDK 可以方便地与 Docker 守护进程(Docker daemon)进行交互。在本文中,我们将详细介绍如何使用 Go 语言来查看 Docker 的相关信息,包括 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 程序,用于获取 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)
}
context.Background()
创建一个空的上下文,用于控制请求的生命周期。client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
使用环境变量配置客户端,并自动协商 API 版本。cli.ServerVersion(ctx)
调用客户端的 ServerVersion
方法,获取 Docker 服务器的版本信息。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 容器的基本信息。
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("-------------------------------------")
}
}
context.Background()
创建一个空的上下文,用于控制请求的生命周期。client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
使用环境变量配置客户端,并自动协商 API 版本。cli.ContainerList(ctx, container.ListOptions{})
调用客户端的 ContainerList
方法,获取所有容器的列表。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进行查看相应的信息。
为了方便用户查看 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("无效的输入,请重新输入")
}
}
}
bufio.NewScanner(os.Stdin)
创建一个扫描器,用于读取用户的输入。fmt.Println
打印菜单选项,让用户选择要查看的信息。scanner.Scan()
读取用户输入的一行文本,并使用 strings.TrimSpace
去除首尾空格。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 版本信息和容器信息的功能,并提供了一个简单的命令行界面,方便用户进行交互。希望这篇文章对你有所帮助!
那么,债见!