各Dockerイメージのレイヤーとレイヤーサイズを見つける


107

研究目的のために、公開Dockerレジストリ(https://registry.hub.docker.com/)をクロールして、1)平均画像のレイヤー数と2)これらのレイヤーのサイズを調べて、分布のアイデア。

ただし、APIとパブリックライブラリ、およびgithubの詳細を調べましたが、次の方法を見つけることができません。

  • すべてのパブリックリポジトリ/イメージを取得します(それらが数千に及ぶ場合でも、反復するための開始リストが必要です)
  • 画像のすべてのレイヤーを見つける
  • レイヤーのサイズを見つけます(画像ではなく個々のレイヤーのサイズです)。

この情報を取得する方法を見つけるのを手伝ってくれる人はいますか?

ありがとうございました!

編集:誰かがDockerレジストリで「*」を検索すると、「*」に言及するものだけでなく、すべてのリポジトリが返されることを確認できますか?https://registry.hub.docker.com/search?q=*


7
>>>画像のすべてのレイヤーを検索します。APIを使用しない場合は、a docker history myimageを実行すると、各レイヤーのサイズが表示されます。より一般的には、イメージに対して、イメージdocker history myimage | awk 'NR>1 {print $1}' | xargs docker inspect --format '{{ ((index .ContainerConfig.Cmd ) 0) }}'を作成するために発行されたコマンドを確認することができます
user2915097

これは、すでにステップ2の優れたヘルプですが、Dockerを介してすべてのイメージをローカルマシンにダウンロードする必要があります。これはオプションだと思いますが、「myimages」のリストを取得する方法が見つかった場合のみです(たとえば、ステップ1のパブリックレジストリ内のすべての画像)。私は間違いなくこのオプションを探求します、ありがとう!
user134589

https://registry.hub.docker.com/search?q=*私に
87031

回答:


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で始まるcatを実行します(ここでは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フォルダーに表示されるように、コマンドは画像レイヤーを提供しません。ここで更新を読んでください
Ruifeng Ma 2017

9
Dockerバージョン1.10以降、コンテンツアドレス可能なストレージの導入により、イメージとレイヤーが分離されました。docker historyコマンドはもはやDockerホスト上の実際のレイヤーディスクストレージ情報を伝えません。このブログを
Ruifeng Ma

51

まず、次を使用してイメージ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 2016年

1
docker inspect imagename | jq。[]。RootFS.Layers "は、2)を実行するためのはるかに簡単な方法です
wheredidthatnamecome from

2

イメージをローカルディスクにプルせずに、DockerレジストリサーバーからマニフェストまたはBLOB情報をクエリすることは実際に可能です。

Registry v2 APIを参照して、イメージのマニフェストをフェッチできます

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

異なるマニフェストバージョンを処理する必要があることに注意してください。v2のあなたは直接層のサイズを取得することができますし、ブロブのダイジェスト。以下のためにv1のマニフェストには、実際の層のサイズを取得するためにブロブダウンロードURLを率いることができます。

継続的に維持される上記のケースを処理するための簡単なスクリプトがあります。


0

正確に元の質問ではありませんが、共有レイヤーを二重にカウントせずにすべての画像の合計を見つけるには、以下が役立ちます(ubuntu 18)。

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

-4

この問題は、DockerのWebサイトの検索機能を使用して解決しました。ここで、「*」は200kリポジトリを返す有効な検索であり、その後、個々のページをクロールしました。HTML解析により、各ページのすべての画像名を抽出できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.