如何使用 Docker Inspect 命令

docker inspect 是必不可少的 Docker 命令之一。它能让你提取各种 docker 对象的信息,知道如何使用它是每个人都应该知道的事情。inspect 的主要优势在于其格式化功能,例如您可以通过检查运行中的容器来提取其 IP 地址,并以特定方式进行格式化。Docker 使用 go-templates 来格式化输出。

在本文中,我将首先介绍 Docker inspect 命令的基础知识,然后重点介绍如何根据具体需要格式化输出。

Docker inspect是做什么的

inspect 为你提供了由 docker 管理的所有不同对象的大量元数据。不同对象的信息种类各不相同。例如,如果你检查一个卷,就会得到与创建时间、使用的卷驱动程序、在主机文件系统中的位置、标签等相关的信息;如果您要检查的是一个网络,那么您将获得子网、网关、连接的容器及其 IP 地址、标签和其他信息。为了更好地了解 inspection 为特定对象提供了哪些功能,我建议您运行这些命令,亲自体验一下。

可以检查哪些对象?

在 docker 中,对象或对象类型是由 docker 控制的所有构造。这包括以下内容容器、 镜像、 网络、 卷、 上下文(Context)、 插件、 节点(swarm)、 服务(swarm)、 密匙(swarm)和 配置(swarm)等。

使用 Docker 检查命令

使用inspect命令有两种方法。

1.	docker inspect [object] [options]
2.	docker [object_type] inspect [object] [options]

你应该一直使用第二种方法。inspect命令提供了格式化的 JSON 输出,稍后我会详细介绍。

创建卷和网络

创建unique卷
docker volume create unique
创建unique网络
docker network create unique

现在,让我们尝试使用第一种语法检查名为 unique 的对象。

docker inspect unique

在我的系统中,如您所见,inspect是检查网络,但如果我打算检查卷呢?

这就是 docker inspect 的问题所在,当你有两个名字相同的不同类型对象时,你不能直接使用 docker inspect [object_name]。要准确地检查你想要的东西,你需要使用对象的 ID,或者使用 --type=[object_type] 选项。使用--type选项后,你可以这样编写上一条命令:--type=[object_type][对象名称]。

docker inspect --type=volume unique

虽然这种方法可行,但我认为没有必要,因为我们已经有了其他语法。你可以直接使用对象特定的子命令,就像我在这里做的那样:

docker volume inspect unique

写起来少,读起来容易得多。

Docker 检查命令

在本节中,我将记录一系列常见查询,以及获取这些信息的相关检查命令。

容器查询

在示例中,我将运行一个示例 nginx 容器,所有命令都将针对这个运行中的容器执行。我用来运行该容器的命令是:

docker container run \
	--rm --name nginx \
    -p target=80,published=127.0.0.1:8081,protocol=tcp \
    -p target=80,published=[::1]:8081,protocol=tcp \
    -e ENV_VAR=somevalue \
    -e ENV_VAR2=linux \
    -v $PWD:/mnt:ro \
    -v /tmp:/tmp:ro \
    -d nginx
根据容器的名称查询id的值

您可以使用以下命令获取容器的 ID:

docker container inspect -f '{{.Id}}' [container_name]

docker  container inspect -f {{.Id}} nginx
容器的主进程

容器主进程程序基本上是 ENTRYPOINT + CMD。printf 命令将格式化输出,以提供所需的信息。

docker container inspect -f '{{printf "%s " .Path}}{{range .Args}}{{printf "%s " .}}{{end}}' [container_name|id]

docker container inspect -f '{{printf "%s " .Path}}{{range .Args}}{{printf "%s " .}}{{end}}' nginx
容器的端口绑定

以下命令会列出所有容器到主机的端口绑定。

docker container inspect -f '{{range $target, $published := .NetworkSettings.Ports}}{{range $published}}{{printf "%s -> %s:%s\n" $target .HostIp .HostPort}}{{end}}{{end}}' [container_name|id]

docker container inspect -f '{{range $target, $published := .NetworkSettings.Ports}}{{range $published}}{{printf "%s -> %s:%s\n" $target .HostIp .HostPort}}{{end}}{{end}}' nginx

还可以使用docker container port container_name|id 查看端口号映射情况。

列出容器的ip地址列表

一个容器可以连接多个网络,您可以使用这条命令打印所有 IP 地址,而不是打印其中的一个。

docker container inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' [container_name|id]

docker container inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx
列出容器的环境变量

可以列出容器的环境变量

docker container inspect -f '{{range .Config.Env}}{{printf "%s\n" .}}{{end}}' [container_name|id]

docker container inspect -f '{{range .Config.Env}}{{printf "%s\n" .}}{{end}}' nginx
列出卷/绑定挂载以及模式

下面的命令以如下格式打印卷的绑定挂载:"[源] -> [目的地],模式: [模式]"。

docker container inspect -f '{{range .Mounts}}{{printf "%s -> %s, mode: %s\n" .Source .Destination .Mode}}{{end}}' [container_name|id]

卷的查询

除了要知道主机位置(在 data-dir/volumes 中)外,检查卷的方法并不多。你可以通过以下命令获取该信息

docker volume inspect -f '{{.Mountpoint}}' [volume_name|id]

docker volume inspect -f '{{.Mountpoint}}' unique

网络查询

我个人发现自己经常会进行两种查询,一种是了解网络子网和连接到该网络的所有容器以及与之相关的 IP。

获取子网

要获取子网,请使用以下命令:

docker network inspect -f '{{range .IPAM.Config}}{{.Subnet}}{{end}}' [network_name|id]

列出连接的容器及其 IP 地址

docker network inspect -f '{{range .Containers}}{{printf "%s -> %s\n" .Name .IPv4Address}}{{end}}' [network_name|id]

将容器nginx添加到unique网络

docker network connect unique nginx
docker network inspect -f '{{range .Containers}}{{printf "%s -> %s\n" .Name .IPv4Address}}{{end}}' unique

格式化 Docker inspect 命令的输出结果

inspect 为输出提供了一个 JSON 数组,你可以用类似 jq 的东西对其进行过滤。因此,如果你对 jq 有经验,不妨直接使用它。jq 的问题在于,大多数 Linux 发行版都没有预装 jq,而 docker .inspect 的默认格式化机制已经存在,而且非常强大。

在内部,JSON 使用各种 Go 数据结构表示。这就是为什么 go 模板实际上使用 go 数据类型。因为我不想解释这些数据结构是什么,所以我不使用这些术语,而是使用 JSON 术语,以便更容易理解。

提取简单字段

下面是一个 JSON 对象

比方说,你想提取 key mary 相关联的信息。要做到这一点,需要使用点[.]符号,即在键前加上一个点,然后递归地为任何嵌套键添加键。这与 jq 相同。因此,这里的 .mary 将是 43。

在这种情况下,.mary.jane 将是 43,同样,.mary.soyas 将是 56。go-templates 也可以使用类似的语法。要格式化输出,需要将模板传递给 inspection 子命令的 -f 或 --format选项。来看下以下卷检查的输出结果。

如果您想知道挂载点,可以使用以下命令

docker volume inspect -f '{{.Mountpoint}}' unique

你可能注意到了这里的大括号,它们就像是块,表达式封装在这些块中。

现在我们来试试嵌套。检查网络,查找 IPAM 部分。

通过观察,你可以很容易地找出这个网络的驱动程序。但与其这样查找,不如从整个 JSON 输出中格式化出来。注意,驱动程序键嵌套在 IPAM 中。因此,提取驱动程序的点表达式是 .IPAM.Driver。查看实际操作:

对象或列表循环( range

JSON 对象就像 Bash 中的关联数组或哈希值,其中键是字符串,值可以是任何数据类型。为了让你更容易理解,我将从一个实际例子开始。请看容器检查结果中的 .NetworkSettings.Networks 部分。它列出了容器连接到的网络,以及每个网络的 IP 地址等相关详细信息。想想看,如果有人让你告诉他容器的 IP 地址,你会怎么做?只选择一个网络和相关的 IP 没有多大意义,最好是列出与所有网络相关的所有 IP 地址。

可以通过模板语句range进行实现,range 遍历一个映射(关联数组或 JSON 对象),每次迭代提供的不是键值,而是值(这种行为是可以改变的)。因此,在这种情况下,您可以编写一个类似 {{range .NetworkSettings.Networks}} 的代码块,循环查看每个网络的值或与每个网络相关的数据,然后从中提取 IP 地址,就像从普通 JSON 结构(即 {{.IPAddress}}} 一样。需要记住的一点是,以range开头的整个模板必须以 {{end}} 结尾。

docker container inspect -f \
	'{{range .NetworkSettings.Networks}}
     {{.IPAddress}}{{end}}' nginx

在数组和对象上使用索引函数

您可以使用索引函数从 JSON 对象或数组中提取部分内容。如果结构是 JSON 对象,则使用 {{index .Field "key"}};如果结构是 JSON 数组,则使用 {{index .Field index}}。

在上一个示例中,您打印了一个容器的所有 IP 地址。比方说,您知道它连接的其中一个网络(网桥),并希望打印与该网络相关联的 IP 地址。您可以使用这样的索引函数来实现这一目的:

docker container inspect -f '{{(index .NetworkSettings.Networks "bridge").IPAddress}}' nginx

使用 json 函数

格式化后导出的数据不是 JSON 格式,而是某种 go 数据结构。但您可以使用 json 函数将其转换为 JSON 格式。JSON 对象的顶层是.。 因此,要打印该数据,可以这样做

docker network inspect -f '{{.}}' unique

你在这里看到的是一个由其他结构体的基本数据类型和映射组成的大结构体。这些数据可读性不高,在 go 之外也无法使用。不过,你可以使用 json 函数将其转换为 JSON 格式。只需在字段前加上 json 即可,就像我在这里做的那样:

docker network inspect -f '{{json .}}' unique

为了让它看起来更好一些,把它连接到 jq 上

docker network inspect -f '{{json .}}' unique | jq

以上是有关docker中使用inspect的解析,基本上常用的操作都讲解到了,希望对您有所帮助。

有关docker的基础命令,没有做讲解,如果你需要,可以学习课程:Docker 实战_在线视频教程-CSDN程序员研修院

相关推荐
Ven%6 分钟前
centos查看硬盘资源使用情况命令大全
linux·运维·centos
景天科技苑39 分钟前
【云原生开发】K8S多集群资源管理平台架构设计
云原生·容器·kubernetes·k8s·云原生开发·k8s管理系统
萨格拉斯救世主1 小时前
戴尔R930服务器增加 Intel X710-DA2双万兆光口含模块
运维·服务器
Jtti1 小时前
Windows系统服务器怎么设置远程连接?详细步骤
运维·服务器·windows
yeyuningzi1 小时前
Debian 12环境里部署nginx步骤记录
linux·运维·服务器
wclass-zhengge1 小时前
K8S篇(基本介绍)
云原生·容器·kubernetes
颜淡慕潇1 小时前
【K8S问题系列 |1 】Kubernetes 中 NodePort 类型的 Service 无法访问【已解决】
后端·云原生·容器·kubernetes·问题解决
EasyCVR2 小时前
萤石设备视频接入平台EasyCVR多品牌摄像机视频平台海康ehome平台(ISUP)接入EasyCVR不在线如何排查?
运维·服务器·网络·人工智能·ffmpeg·音视频
wowocpp3 小时前
ubuntu 22.04 硬件配置 查看 显卡
linux·运维·ubuntu
萨格拉斯救世主3 小时前
jenkins使用slave节点进行node打包报错问题处理
运维·jenkins