查找每个 Docker 映像的层和层大小
Posted
技术标签:
【中文标题】查找每个 Docker 映像的层和层大小【英文标题】:Finding the layers and layer sizes for each Docker image 【发布时间】:2015-06-24 03:42:33 【问题描述】:出于研究目的,我试图爬取公共 Docker 注册表 (https://registry.hub.docker.com/) 并找出 1) 平均图像有多少层和 2) 这些层的大小以了解分布情况。
但是我研究了 API 和公共库以及 github 上的详细信息,但我找不到任何方法:
检索所有公共存储库/图像(即使有数千个,我仍然需要一个起始列表来迭代) 查找图像的所有层 查找图层的大小(因此不是图像,而是单个图层)。谁能帮我找到检索这些信息的方法?
谢谢!
编辑:是否有人能够验证在 Docker 注册表中搜索“*”是否会返回所有存储库,而不仅仅是在任何地方提到“*”的任何内容? https://registry.hub.docker.com/search?q=*
【问题讨论】:
>>>找到一个图像的所有层,如果你不使用API,你可以做一个docker history myimage
,你会看到每一层的大小。更一般地,在图像上,您可以通过docker history myimage | awk 'NR>1 print $1' | xargs docker inspect --format ' ((index .ContainerConfig.Cmd ) 0) '
来查看发出了哪些命令来创建图像
这已经对第 2 步有很大帮助,尽管这需要我通过 Docker 将每个图像下载到我的本地计算机。我想这是一个选项,但前提是我找到了一种方法来检索“myimages”列表以开始(例如,步骤 1 中公共注册表中的每个图像)。我一定会探索这个选项,谢谢!
https://registry.hub.docker.com/search?q=*
为我显示了 87031 个存储库,
【参考方案1】:
查看用 golang 编写的 dive。
很棒的工具!
【讨论】:
你用什么软件来制作这个 gif? @uberrebu 也许asciinema.org .. 谷歌terminal recording
.【参考方案2】:
您可以在文件夹/var/lib/docker/aufs/layers 中找到图像的层;提供是否将存储驱动程序配置为 aufs(默认选项)
例子:
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0ca502fa6aae ubuntu "/bin/bash" 44 minutes ago Exited (0) 44 seconds ago DockerTest
现在查看使用映像“Ubuntu”创建的容器的层;转到 /var/lib/docker/aufs/layers 目录并 cat 文件以容器 ID 开头(这里是 0ca502fa6aae*)
root@viswesn-vm2:/var/lib/docker/aufs/layers# cat 0ca502fa6aaefc89f690736609b54b2f0fdebfe8452902ca383020e3b0d266f9-init
d2a0ecffe6fa4ef3de9646a75cc629bbd9da7eead7f767cb810f9808d6b3ecb6
29460ac934423a55802fcad24856827050697b4a9f33550bd93c82762fb6db8f
b670fb0c7ecd3d2c401fbfd1fa4d7a872fbada0a4b8c2516d0be18911c6b25d6
83e4dde6b9cfddf46b75a07ec8d65ad87a748b98cf27de7d5b3298c1f3455ae4
这将通过运行显示相同的结果
root@viswesn-vm2:/var/lib/docker/aufs/layers# docker history ubuntu
IMAGE CREATED CREATED BY SIZE COMMENT
d2a0ecffe6fa 13 days ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B
29460ac93442 13 days ago /bin/sh -c sed -i 's/^#\s*\ (deb.*universe\)$/ 1.895 kB
b670fb0c7ecd 13 days ago /bin/sh -c echo '#!/bin/sh' > /usr/sbin/polic 194.5 kB
83e4dde6b9cf 13 days ago /bin/sh -c #(nop) ADD file:c8f078961a543cdefa 188.2 MB
查看全层ID;使用 --no-trunc 选项作为历史命令的一部分运行。
docker history --no-trunc ubuntu
【讨论】:
在 docker 1.10 版以后不再是这种情况。docker history
命令不会提供 /var/lib/docker/aufs/layers 文件夹中所示的图像层。阅读更新here。
从 Docker 1.10 版本开始,随着内容可寻址存储的引入,图像和层现在分离了。 docker history
命令不再告诉 docker 主机上的实际层磁盘存储信息。检查这个blog【参考方案3】:
您可以先使用以下方法找到图像 ID:
$ docker images -a
然后找到图像的层和它们的大小:
$ docker history --no-trunc <Image ID>
注意:我使用的是 Docker 版本 1.13.1
$ docker -v
Docker version 1.13.1, build 092cba3
【讨论】:
【参考方案4】:在我看来,docker history <image>
就足够了。这将返回每一层的大小:
$ docker history jenkinsci-jnlp-slave:2019-1-9c
IMAGE CREATED CREATED BY SIZE COMMENT
93f48953d298 42 min ago /bin/sh -c #(nop) USER jenkins 0B
6305b07d4650 42 min ago /bin/sh -c chown jenkins:jenkins -R /home/je… 1.45GB
【讨论】:
【参考方案5】:这将检查 docker 图像并打印图层:
$ docker image inspect nginx -f '.RootFS.Layers'
[sha256:d626a8ad97a1f9c1f2c4db3814751ada64f60aed927764a3f994fcd88363b659 sha256:82b81d779f8352b20e52295afc6d0eab7e61c0ec7af96d85b8cda7800285d97d sha256:7ab428981537aa7d0c79bc1acbf208c71e57d9678f7deca4267cc03fba26b9c8]
【讨论】:
【参考方案6】:他们在这里有一个很好的答案: https://***.com/a/32455275/165865
只需在图片下方运行:
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nate/dockviz images -t
【讨论】:
嗨@bummi,对不起,我认为这个问题最初是在docker注册表中寻找解决方案,我发现我们上面提供的解决方案直接针对docker镜像层。所以我尝试补充另一种解决方案(我认为更容易)【参考方案7】:另一个工具:https://github.com/CenturyLinkLabs/dockerfile-from-image
使用 ImageLayers.io 的 GUI
【讨论】:
当前提供了堆栈跟踪。【参考方案8】:https://hub.docker.com/search?q=* 显示整个 Docker hub 中的所有图像,无法通过搜索命令获取,因为它不接受通配符。
从 v1.10 开始,您可以通过拉取图像并使用以下命令找到图像中的所有层:
docker pull ubuntu
ID=$(sudo docker inspect -f .Id ubuntu)
jq .rootfs.diff_ids /var/lib/docker/image/aufs/imagedb/content/$(echo $ID|tr ':' '/')
3) 大小可以在/var/lib/docker/image/aufs/layerdb/sha256/LAYERID/size
中找到,尽管 LAYERID != 使用上一个命令找到的 diff_ids。为此,您需要查看 /var/lib/docker/image/aufs/layerdb/sha256/LAYERID/diff
并与之前的命令输出进行比较以正确匹配正确的 diff_id 和大小。
【讨论】:
RE1) 对我不起作用似乎重定向到 hub.docker.com。 docker 检查镜像名 | jq .[].RootFS.Layers" 是更简单的方法 2)【参考方案9】:确实可以从 docker 注册表服务器查询清单或 blob 信息无需将图像拉到本地磁盘。
您可以参考Registry v2 API获取镜像清单。
GET /v2/<name>/manifests/<reference>
注意,您必须处理不同的清单版本。对于v2,您可以直接获取层的大小和blob的摘要。对于v1 manifest,您可以 HEAD blob 下载 url 以获取实际层大小。
有一个simple script用于处理上述情况,将持续维护。
【讨论】:
【参考方案10】:不完全是原始问题,而是要在不重复计算共享层的情况下找到所有图像的总和,以下是有用的(ubuntu 18):
sudo du -h -d1 /var/lib/docker/overlay2 | sort -h
【讨论】:
【参考方案11】:要查找映像的所有层并查找层的大小,您可以通过 "manifest" experimental feature 显示来自 docker hub 注册表的清单:
docker manifest inspect ubuntu
结果是一个 JSON 文件(这里只显示第一行):
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
"manifests": [
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 529,
"digest": "sha256:10cbddb6cf8568f56584ccb6c866203e68ab8e621bb87038e254f6f27f955bbe",
"platform":
"architecture": "amd64",
"os": "linux"
,
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 529,
"digest": "sha256:dd375524d7eda25a69f9f9790cd3e28855be7908e04162360dd462794035ebf7",
"platform":
"architecture": "arm",
"os": "linux",
"variant": "v7"
【讨论】:
【参考方案12】:我已经通过使用 Docker 网站上的搜索功能解决了这个问题,其中“*”是返回 200k 存储库的有效搜索,然后我抓取了每个单独的页面。 html 解析允许我提取每个页面上的所有图像名称。
【讨论】:
以上是关于查找每个 Docker 映像的层和层大小的主要内容,如果未能解决你的问题,请参考以下文章