2015-04-17 125 views
31

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

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

  • 检索所有公共库/图像(即使这些成千上万的我还需要一个起始列表来遍历)
  • 找到图像的所有图层
  • 找到一个图层的大小(所以不是一个图像,但为单个图层)。

任何人都可以帮助我找到一种方法来检索这些信息吗?

谢谢!

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

+5

>>>查找图像的所有图层,如果您不使用该API,则可以执行“docker history myimage”,您将看到每个图层的大小。更一般地说,在图像上,你可以做'docker history myimage | awk'NR> 1 {print $ 1}'| xargs docker inspect --format'{{((index.ContainerConfig.Cmd)0)}}''看看发出了什么命令来创建映像 – user2915097

+0

这对第2步已经是很大的帮助,虽然这需要我每次下载通过Docker镜像到我的本地机器。我想这是一个选择,但只有当我找到一种方法来检索'myimages'列表(如步骤1中的公共注册表中的每个图像)。我一定会探索这个选项,谢谢! – user134589

+0

'https://registry.hub.docker.com/search?q = *'为我显示87031存储库, – user2915097

回答

36

您可以在/ 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中/泊坞窗/ AUFS /层目录和猫的文件与容器ID开始(这里是0ca502fa6aae *)

[email protected]:/var/lib/docker/aufs/layers# cat 0ca502fa6aaefc89f690736609b54b2f0fdebfe8452902ca383020e3b0d266f9-init 
d2a0ecffe6fa4ef3de9646a75cc629bbd9da7eead7f767cb810f9808d6b3ecb6 
29460ac934423a55802fcad24856827050697b4a9f33550bd93c82762fb6db8f 
b670fb0c7ecd3d2c401fbfd1fa4d7a872fbada0a4b8c2516d0be18911c6b25d6 
83e4dde6b9cfddf46b75a07ec8d65ad87a748b98cf27de7d5b3298c1f3455ae4 

这将通过运行

[email protected]:/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;作为history命令的一部分使用--no-trunc选项运行。

docker history --no-trunc ubuntu 
+0

码头版本1.10以上不再是这种情况。 'docker history'命令不会给出图像层,如/ var/lib/docker/aufs/layers文件夹中所示。阅读更新[这里](https://docs.docker.com/engine/userguide/storagedriver/imagesandcontainers/#copying-makes-containers-efficient)。 –

+0

由于Docker版本1.10,引入了内容寻址存储,现在图像和图层是分开的。 “docker history”命令不再告诉docker主机上的实际层磁盘存储信息。检查这[博客](http://windsock.io/explaining-docker-image-ids/) –

5

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

只需运行以下图片:

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

+1

Hi @bummi,对不起,我认为这个问题最初是在码头注册表中寻找解决方案,我发现我们上面提供的解决方案直接到码头图像的层。所以我尝试补充另一个解决方案(我认为更容易) – sunnycmf

0

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

+0

:D但不是真正的认真答案... –

2
  1. https://hub.docker.com/search?q=*显示整个泊坞枢纽的所有图像,这是不可能通过搜索命令来获取这是它不接受通配符。

  2. 至于1.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和大小。

+0

RE1)没有为我工作似乎重定向到hub.docker.com。 – joedragons

+0

docker inspect imagename | jq。[]。RootFS.Layers“更容易做2) – wheredidthatnamecomefrom