为每个Docker图像查找图层和图层大小

出于研究目的,我试图抓取公共Docker注册表(https://registry.hub.docker.com/),并找出1)平均图像有多少层,2)这些层的大小,以了解分布情况。

然而,我研究了API和公共图书馆以及github上的细节,但我找不到任何方法:

  • 检索所有公共存储库/图像(即使有数千个,我仍然需要一个开始列表来迭代)
  • 找出图像的所有层
  • 找到一个图层的大小(所以不是图像,而是单个图层)。

有人能帮我找到找回这些信息的方法吗?

谢谢你!

编辑:有人能验证在Docker注册表中搜索'*'是返回所有的存储库,而不仅仅是任何地方提到'*'的东西吗?https://registry.hub.docker.com/search?q= *

183414 次浏览

你可以在/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目录,以容器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

还有一个工具:https://github.com/CenturyLinkLabs/dockerfile-from-image

使用imagelayer .io的GUI

他们在这里有一个非常好的答案: https://stackoverflow.com/a/32455275/165865 < / p >

只需运行下面的图片:

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nate/dockviz images -t

我已经通过使用Docker网站上的搜索功能解决了这个问题,其中“*”是一个有效的搜索,返回200k个存储库,然后我爬取每个单独的页面。HTML解析允许我提取每个页面上的所有图像名称。

  1. https://hub.docker.com/search?q=*显示了整个Docker中心中的所有图像,这是不可能通过搜索命令得到的,因为它不接受通配符。

  2. 从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) The size can be found in /var/lib/docker/image/aufs/layerdb/sha256/{LAYERID}/size although LAYERID != the diff_ids found with the previous command. For this you need to look at /var/lib/docker/image/aufs/layerdb/sha256/{LAYERID}/diff and compare with the previous command output to properly match the correct diff_id and size.

这将检查docker图像并打印图层:

$ docker image inspect nginx -f '\{\{.RootFS.Layers}}'
[sha256:d626a8ad97a1f9c1f2c4db3814751ada64f60aed927764a3f994fcd88363b659 sha256:82b81d779f8352b20e52295afc6d0eab7e61c0ec7af96d85b8cda7800285d97d sha256:7ab428981537aa7d0c79bc1acbf208c71e57d9678f7deca4267cc03fba26b9c8]

你可以先使用以下方法找到图像ID:

$ docker images -a

然后找到图像的图层和它们的大小:

$ docker history --no-trunc <Image ID>

注意:我使用的是Docker 1.13.1版本

$ docker -v
Docker version 1.13.1, build 092cba3

检查潜水写在golang。

.

非常棒的工具!

在我看来,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

不完全是最初的问题,但要找到所有图像的总和而不重复计算共享层,下面是有用的(ubuntu 18):

sudo du -h -d1  /var/lib/docker/overlay2 | sort -h

从docker注册服务器没有中查询清单或blob信息将映像拉到本地磁盘确实是可行的。

你可以引用注册表v2 API来获取image的manifest。

GET /v2/<name>/manifests/<reference>

注意,您必须处理不同的清单版本。对于v2,你可以直接获得层的大小和blob的摘要。对于v1清单,你可以HEAD blob下载url以获得实际的层大小。

有一个简单的脚本用于处理将持续维护的上述情况。

要查找图像的所有层并查找层的大小,您可以通过“manifest"实验功能从docker中心注册表中显示清单:

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"