173

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

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

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

谁能帮我找到一种方法来检索这些信息?

谢谢!

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

4

12 回答 12

124

查看用golang编写的潜水。

很棒的工具!

于 2018-12-07T14:51:31.387 回答
97

您可以在文件夹 /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
于 2015-07-23T11:43:20.443 回答
94

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

$ docker images -a

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

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

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

$ docker -v
Docker version 1.13.1, build 092cba3
于 2018-05-15T19:29:40.673 回答
47

在我看来,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
于 2019-01-09T10:53:36.003 回答
12

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

$ docker image inspect nginx -f '{{.RootFS.Layers}}'
[sha256:d626a8ad97a1f9c1f2c4db3814751ada64f60aed927764a3f994fcd88363b659 sha256:82b81d779f8352b20e52295afc6d0eab7e61c0ec7af96d85b8cda7800285d97d sha256:7ab428981537aa7d0c79bc1acbf208c71e57d9678f7deca4267cc03fba26b9c8]
于 2018-05-15T19:04:57.717 回答
11

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

只需运行以下图像:

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nate/dockviz images -t
于 2016-01-15T06:29:24.377 回答
2
  1. https://hub.docker.com/search?q=*显示整个 Docker hub 中的所有图像,由于它不接受通配符,因此无法通过搜索命令获取此信息。

  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 ':' '/')
    

/var/lib/docker/image/aufs/layerdb/sha256/{LAYERID}/size3)虽然 LAYERID != 使用上一条命令找到的 diff_ids ,但可以找到大小。为此,您需要查看/var/lib/docker/image/aufs/layerdb/sha256/{LAYERID}/diff并与之前的命令输出进行比较,以正确匹配正确的 diff_id 和大小。

于 2016-03-14T10:53:43.383 回答
2

另一种工具:https ://github.com/CenturyLinkLabs/dockerfile-from-image

使用 ImageLayers.io 的 GUI

于 2015-07-29T02:00:22.110 回答
2

确实可以从 docker 注册表服务器查询清单或 blob 信息,而无需将图像拉到本地磁盘。

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

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

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

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

于 2020-04-29T03:59:25.183 回答
0

不完全是原始问题,而是要在不重复计算共享层的情况下找到所有图像的总和,以下是有用的(ubuntu 18):

sudo du -h -d1  /var/lib/docker/overlay2 | sort -h
于 2020-02-07T23:45:22.663 回答
0

要查找图像的所有层并查找层的大小,您可以通过“清单”实验功能从 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"
于 2021-09-10T20:25:56.167 回答
-4

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

于 2016-01-19T08:40:13.277 回答