如何使用 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程序员研修院 

  • 27
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

面朝大海,春不暖,花不开

您的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值