Docker
图像
检查

检查 Docker 镜像

本文涵盖了关于验证Docker镜像的四个关键点。 为了验证一个Docker镜像,我们将使用以下三个命令。

  • docker image ls
  • docker image inspect
  • docker image history

基于这3个命令,我将总结如何验证镜像内容信息、版本钩子、标签、名称、层、容量、容器镜像、Dockerfile等。

1. 验证Docker镜像的命令

1.1. 获取一般信息的ls命令

让我们从查看docker镜像内容的最常用的`ls'命令开始,它可以让你大致了解你想要的docker镜像里有什么。

其基本形式是

$ docker image ls [OPTIONS] [REPOSITORY[:TAG]]

一般来说,你会得到一个当前存储在docker环境中的所有镜像的列表,[REPOSITORY[:TAG]]部分可以用来查看特定docker镜像的内容。

例如,如果你指定一个镜像的名称(仓库名称)和标签(版本),像这样

docker image ls nginx:latest

你将得到以下信息。从一开始,这就是图像名称和标签信息,一个唯一的ID,创建时间,以及图像大小。

repository tag image id created size
nginx last f9c14fe76d50 4 days ago 143MB

旧的Docker命令docker images做同样的事情,但我们建议使用更新的、更有组织的命令。

1.2. inspect命令来获取特定镜像的更多信息。

我们在第1.1节中看到的ls命令返回五条信息:图像的名称、标签、ID、创建时间和容量。 inspect命令打印出关于一个特定图像的所有细节,包括这些。

默认的格式是

inspect docker image [OPTIONS] IMAGE [IMAGE...]

当你运行该命令时,它会以JSON格式输出大量的信息,这可能需要花费一些时间来滚动浏览。 Docker提供了--format选项,这样当你只需要特定的信息时,你就不必一直打印这种大量的数据。 这个选项使用Go模板语法,允许你有选择地只打印你想要的信息。

关于使用"--格式 "选项的更多信息,请参阅[Docker容器检查--第1.2节](/docker/container/inspect#1.2)。

在下面的章节中,我们将使用lsinspect命令以及--format选项,只打印我们想要的信息。

2. 验证Docker镜像的内容

让我们看看如何检查镜像的名称、版本/标签、层数和大小,这些都是Docker用户经常问到的问题。

2.1. 检查镜像名称

Docker镜像是尚未被实例化为容器的对象。 因此,它们没有名字,而存储库的名字可以被称为镜像的名字。 存储库名称是该镜像的Docker Hub存储库的名称,Ubuntu和Nginx等商业服务被称为官方镜像。

你可以通过查看docker image ls命令返回的列表中的REPOSITORY条目,看到当前存储在Docker环境中的所有镜像的名称。

2.2. 检查镜像的版本/标签

要检查一个docker镜像的版本或标签,可以先使用ls命令。你可以检查镜像列表中的TAG条目。

或者,你也可以检查inspect命令输出中的RepoTags条目。你可以通过发出以下命令来实现这一目的

$ docker image inspect --format '{ {.RepoTags} }' nginx
[nginx:latest]
 
$ docker image inspect --format '{ {.RepoTags} }' mariadb:10.6
[mariadb:10.6]'

2.3. 识别镜像层

Docker镜像由许多层组成。 每个层都包含特定的任务,不同的镜像可能会重复使用同一个层。 因此,你如何组织你的层会对你的Docker镜像的大小和它的表现速度产生影响。

Docker并没有提供具体的层信息。 然而,你可以根据两个命令的内容做一些猜测:inspecthistory。 使用第三方工具可以更详细地确定实际层的内容。

首先,你可以使用inspect命令来查看图像中包含的层的哈希值。 在输出中,在RootFS条目中寻找Layers条目。如果你只想看哈希值,你可以使用以下命令。

$ docker image inspect --format '{ {.RootFS.Layers} }' nginx
[sha256:8cbe4b54fa88d8fc0198ea0cc3a5432aea41573e6a0ee26eca8c79f9fbfa40e3 sha256:4b8862fe7056d8a3c2c0910eb38ebb8fc08785eaa1f9f53b2043bf7ca8adbafb sha256:e60266289ce4a890aaf52b93228090998e28220aef04f128704141864992dd15 sha256:7daac92f43be84ad9675f94875c1a00357b975d6c58b11d17104e0a0e04da370 sha256:5e099cf3f3c83c449b8c062f944ac025c9bf2dd7ec255837c53430021f5a1517 sha256:4fd83434130318dede62defafcc5853d03dae8636eccfa1b9dcd385d92e3ff19]

Docker不提供使用哈希值检索特定层的内容的能力,例如,只是为了看到共享同一层的图像。

你可以通过使用docker image history命令查看哪些层组成了一个镜像,以及它们运行了哪些命令。 这些命令是基于Dockerfile的,所以它们没有被映射到特定的层。

运行该命令的结果如下,你可以添加--no-trunc选项,以获得不被省略的更详细的信息。

$ docker image history nginx:latest
IMAGE          CREATED      CREATED BY                                      SIZE      COMMENT
f9c14fe76d50   5 days ago   /bin/sh -c #(nop)  CMD ["nginx" "-g" "daemon…   0B
<missing>      5 days ago   /bin/sh -c #(nop)  STOPSIGNAL SIGQUIT           0B
<missing>      5 days ago   /bin/sh -c #(nop)  EXPOSE 80                    0B
<missing>      5 days ago   /bin/sh -c #(nop)  ENTRYPOINT ["/docker-entr…   0B
<missing>      5 days ago   /bin/sh -c #(nop) COPY file:e57eef017a414ca7…   4.62kB
<missing>      5 days ago   /bin/sh -c #(nop) COPY file:36429cfeeb299f99…   3.01kB
<missing>      5 days ago   /bin/sh -c #(nop) COPY file:5c18272734349488…   2.12kB
<missing>      5 days ago   /bin/sh -c #(nop) COPY file:7b307b62e82255f0…   1.62kB
<missing>      5 days ago   /bin/sh -c set -x     && addgroup --system -…   62MB
<missing>      5 days ago   /bin/sh -c #(nop)  ENV PKG_RELEASE=1~bullseye   0B
<missing>      5 days ago   /bin/sh -c #(nop)  ENV NJS_VERSION=0.7.12       0B
<missing>      5 days ago   /bin/sh -c #(nop)  ENV NGINX_VERSION=1.25.0     0B
<missing>      6 days ago   /bin/sh -c #(nop)  LABEL maintainer=NGINX Do…   0B
<missing>      7 days ago   /bin/sh -c #(nop)  CMD ["bash"]                 0B
<missing>      7 days ago   /bin/sh -c #(nop) ADD file:88252a7f118b4d6f5…   80.5MB

对于你用Docker的内置功能看不到的东西、 使用第三方工具如Dive (opens in a new tab)是一个好主意。 Dive会分析你的镜像,并告诉你每一层包含什么以及如何优化它。 我们将在一个新的帖子中介绍这个,以及其他做类似事情的工具。

2.4. 检查图像的大小

图像大小由ls命令很好地显示。你可以用SIZE项来检查它、 或者如果你只想知道容量值,你可以使用以下命令。

$ docker image ls --format '{ {.Size} }' nginx:latest
l43MB

inspect命令的内容将给你以字节为单位的容量,你可以检查Size条目。

$ docker image inspect --format '{ {.Size} }' nginx
142560184

3. 检查特定容器中的图像

你可以用container ls命令查看特定容器中的图像名称。

$ docker container ls --all
CONTAINER ID   IMAGE          COMMAND   ...
55d8d5e95e61   mariadb:10.6   "docker-entrypoint.s…"

或者,你可以在运行 container inspect命令的结果的 Config.Image部分找到更多细节,包括环境变量。

$ docker container inspect --format '{ {.Config.Image} }' 55d8mariadb:10.6

4. 检查镜像的dockerfile

Docker镜像是基于 Dockerfile创建的,已经创建的镜像并不存储关于 Dockerfile的信息。 我们可以通过我们在Section 2.'3中讨论的history命令在一定程度上推断出Dockerfile的内容,但是有一些命令不存在于历史中,例如ADDCOPY

因此,如果你的镜像可以在Docker Hub上搜索,你应该搜索内容,如果是自定义镜像,你也应该分享Dockerfile

5. 总结

在这篇文章中,我们总结了如何基于三个命令检查镜像内容信息:lsinspecthistory,以及如何检查标签、名称、层、容量、容器镜像和Dockerfile的版本钩。 我希望当你需要检查图像内容时,你会发现这很有用。

copyright for docker image inspect

© 2023 All rights reserved.