查找每个Docker映像的层和层大小


108

出于研究目的,我正在尝试爬网公共Docker注册中心(https://registry.hub.docker.com/)并找出1)平均映像有多少层,以及2)这些层的大小以获得一个分配的想法。

但是我研究了API和公共库以及github上的详细信息,但找不到任何方法可以:

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

谁能帮助我找到一种检索此信息的方法?

谢谢!

编辑:有谁能够验证在Docker注册表中搜索“ *”是否返回所有存储库,而不仅仅是返回任何提到“ *”的内容?https://registry.hub.docker.com/search?q=*


7
>>>查找图像的所有层,如果不使用API​​,则可以执行操作docker history myimage,您将看到每个层的大小。更一般而言,在图像上,您可以docker history myimage | awk 'NR>1 {print $1}' | xargs docker inspect --format '{{ ((index .ContainerConfig.Cmd ) 0) }}'查看发出了哪些命令来创建图像
user2915097 2015年

尽管这要求我通过Docker将每个映像下载到我的本地计算机,这已经对步骤2有了很大的帮助。我想这是一个选择,但前提是我找到一种方法来检索“ myimages”列表开头(例如,步骤1中公共注册表中的每个图像)。我一定会探索这个选项的,谢谢!
user134589

https://registry.hub.docker.com/search?q=*显示了我
87031

Answers:


81

您可以在/ 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

1
从docker版本1.10开始不再是这种情况。docker history命令不会提供/ var / lib / docker / aufs / layers文件夹中所示的图像层。在此处阅读更新。
马瑞凤

9
从Docker 1.10版本开始,随着内容可寻址存储的引入,图像和图层现已分离。docker history命令不再告诉docker主机上实际的层磁盘存储信息。查看此博客
Ruifeng Ma

52

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

$ docker images -a

然后找到图像的图层及其大小:

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

注意:我使用的是Docker 1.13.1版

$ docker -v
Docker version 1.13.1, build 092cba3


28

我认为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

11

他们在这里有一个很好的答案:https : //stackoverflow.com/a/32455275/165865

只需在图片下面运行:

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

1
@bummi,您好,对不起,我认为这个问题最初是在docker注册表中寻找解决方案,我发现我们上面提供的解决方案直接针对docker映像层。因此,我尝试补充另一种解决方案(我认为这更容易)
sunnycmf

7

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

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


2
  1. https://hub.docker.com/search?q=*显示了整个Docker集线器中的所有图像,由于它不接受通配符,因此无法通过search命令获得此图像。

  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)/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。
joedragons

1
码头工人检查图像名称| jq。[]。RootFS.Layers“是执行2)的简单得多的方法
名称来自

2

从Docker注册表服务器查询清单或blob信息确实是可行的,而无需将映像拉到本地磁盘。

您可以参考Registry v2 API来获取映像清单。

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

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

有一个用于处理上述情况的简单脚本,该脚本将不断维护。


0

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

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

-4

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.