Ermitteln der Ebenen und Ebenengrößen für jedes Docker-Bild

107

Zu Forschungszwecken versuche ich, die öffentliche Docker-Registrierung zu crawlen ( https://registry.hub.docker.com/ ) zu crawlen und herauszufinden, 1) wie viele Ebenen ein durchschnittliches Bild hat und 2) wie groß diese Ebenen sind, um eine zu erhalten Idee der Verteilung.

Ich habe jedoch die API und die öffentlichen Bibliotheken sowie die Details zum Github studiert, kann aber keine Methode finden, um:

  • Rufen Sie alle öffentlichen Repositorys / Bilder ab (selbst wenn dies Tausende sind, benötige ich noch eine Startliste, um sie zu durchlaufen).
  • Finde alle Ebenen eines Bildes
  • Finden Sie die Größe für eine Ebene (also nicht für ein Bild, sondern für die einzelne Ebene).

Kann mir jemand helfen, einen Weg zu finden, um diese Informationen abzurufen?

Danke dir!

BEARBEITEN: Kann jemand überprüfen, ob bei der Suche nach '*' in der Docker-Registrierung alle Repositorys zurückgegeben werden und nicht nur irgendetwas, das irgendwo '*' erwähnt? https://registry.hub.docker.com/search?q=*

user134589
quelle
7
>>> Finde alle Ebenen eines Bildes. Wenn du die API nicht verwendest, kannst du eine machen docker history myimageund du wirst die Größe jeder Ebene sehen. Allgemeiner können Sie auf einem Bild docker history myimage | awk 'NR>1 {print $1}' | xargs docker inspect --format '{{ ((index .ContainerConfig.Cmd ) 0) }}'sehen, welche Befehle zum Erstellen des Bildes ausgegeben wurden
user2915097
Dies ist bereits eine große Hilfe für Schritt 2, obwohl ich dafür jedes Bild über Docker auf meinen lokalen Computer herunterladen muss. Ich denke, das ist eine Option, aber nur, wenn ich eine Möglichkeit finde, zunächst eine Liste von 'myimages' abzurufen (z. B. jedes Bild in der öffentlichen Registrierung in Schritt 1). Ich werde diese Option auf jeden Fall untersuchen, danke!
user134589
https://registry.hub.docker.com/search?q=*zeigt für mich 87031 Repositories,
user2915097

Antworten:

81

Sie finden die Ebenen der Bilder im Ordner / var / lib / docker / aufs / Ebenen. Geben Sie an, ob Sie den Speichertreiber als aufs konfiguriert haben (Standardoption).

Beispiel:

 docker ps -a
 CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
 0ca502fa6aae        ubuntu              "/bin/bash"         44 minutes ago      Exited (0) 44 seconds ago                       DockerTest

Zeigen Sie nun die Ebenen der Container an, die mit dem Image "Ubuntu" erstellt wurden. Gehen Sie zum Verzeichnis / var / lib / docker / aufs / layer und katzen Sie, dass die Datei mit der Container-ID beginnt (hier ist es 0ca502fa6aae *).

 root@viswesn-vm2:/var/lib/docker/aufs/layers# cat    0ca502fa6aaefc89f690736609b54b2f0fdebfe8452902ca383020e3b0d266f9-init 
 d2a0ecffe6fa4ef3de9646a75cc629bbd9da7eead7f767cb810f9808d6b3ecb6
 29460ac934423a55802fcad24856827050697b4a9f33550bd93c82762fb6db8f
 b670fb0c7ecd3d2c401fbfd1fa4d7a872fbada0a4b8c2516d0be18911c6b25d6
 83e4dde6b9cfddf46b75a07ec8d65ad87a748b98cf27de7d5b3298c1f3455ae4

Dies zeigt das Ergebnis derselben durch Ausführen

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 

Anzeigen der vollständigen Ebenen-ID; Führen Sie die Option --no-trunc als Teil des Verlaufsbefehls aus.

docker history --no-trunc ubuntu
Viswesn
quelle
1
Dies ist ab Docker Version 1.10 nicht mehr der Fall. docker historyDer Befehl gibt die Bildebenen nicht an, wie im Ordner / var / lib / docker / aufs / layer angezeigt. Lesen Sie das Update hier .
Ruifeng Ma
9
Seit Docker Version 1.10 werden mit der Einführung des inhaltsadressierbaren Speichers Bilder und Ebenen getrennt. docker historyDer Befehl teilt nicht mehr die tatsächlichen Speicherinformationen der Layer-Festplatte auf dem Docker-Host mit. Überprüfen Sie diesen Blog
Ruifeng Ma
51

Sie finden die Bild-ID zunächst mit:

$ docker images -a

Suchen Sie dann die Bildebenen und ihre Größen:

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

Hinweis: Ich verwende Docker Version 1.13.1

$ docker -v
Docker version 1.13.1, build 092cba3
Yuci
quelle
47

Schauen Sie sich tauchen in golang geschrieben.

Super Werkzeug!

Levon
quelle
27

Meiner Meinung nach docker history <image>ist ausreichend. Dies gibt die Größe jeder Ebene zurück:

$ 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
030
quelle
11

Sie haben hier eine sehr gute Antwort: https://stackoverflow.com/a/32455275/165865

Führen Sie einfach die folgenden Bilder aus:

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nate/dockviz images -t
sunnycmf
quelle
1
Hallo @bummi, tut mir leid, ich denke, diese Frage sucht zunächst nach einer Lösung in der Docker-Registrierung, und ich habe diese Lösung gefunden, die wir oben direkt für die Ebenen des Docker-Images bereitgestellt haben.
Also
7

Dadurch wird das Docker-Bild überprüft und die Ebenen gedruckt:

$ docker image inspect nginx -f '{{.RootFS.Layers}}'
[sha256:d626a8ad97a1f9c1f2c4db3814751ada64f60aed927764a3f994fcd88363b659 sha256:82b81d779f8352b20e52295afc6d0eab7e61c0ec7af96d85b8cda7800285d97d sha256:7ab428981537aa7d0c79bc1acbf208c71e57d9678f7deca4267cc03fba26b9c8]
lvthillo
quelle
2
  1. https://hub.docker.com/search?q=* zeigt alle Bilder im gesamten Docker-Hub an. Dies kann nicht über den Suchbefehl abgerufen werden, da keine Platzhalter akzeptiert werden.

  2. Ab Version 1.10 können Sie alle Ebenen in einem Bild finden, indem Sie es ziehen und die folgenden Befehle verwenden:

    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) Die Größe kann in gefunden werden, /var/lib/docker/image/aufs/layerdb/sha256/{LAYERID}/sizeobwohl LAYERID! = Die diff_ids, die mit dem vorherigen Befehl gefunden wurden. Dazu müssen Sie /var/lib/docker/image/aufs/layerdb/sha256/{LAYERID}/diffdie vorherige Befehlsausgabe betrachten und mit ihr vergleichen, um die richtige diff_id und Größe richtig abzugleichen.

Piet
quelle
RE1) Hat bei mir nicht funktioniert scheint auf hub.docker.com umzuleiten.
Joedragons
1
Docker inspizieren Bildname | jq. []. RootFS.Layers "ist viel einfacher zu tun 2)
Name vom
2

Es ist in der Tat möglich, die Manifest- oder Blob-Informationen vom Docker-Registrierungsserver ohne abzufragen das Image auf die lokale Festplatte zu ziehen.

Sie können auf die Registry v2-API verweisen, um das Bildmanifest abzurufen.

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

Beachten Sie, dass Sie mit verschiedenen Manifestversionen umgehen müssen. Für v2 können Sie direkt die Größe der Schicht und den Digest des Blobs ermitteln. Für v1 manifest können Sie die Blob-Download-URL HEADEN, um die tatsächliche Ebenengröße zu erhalten.

Es gibt ein einfaches Skript für die Behandlung der oben genannten Fälle, das kontinuierlich gepflegt wird.

Kane
quelle
0

Nicht genau die ursprüngliche Frage, aber um die Gesamtsumme aller Bilder zu ermitteln, ohne gemeinsam genutzte Ebenen doppelt zu zählen, ist Folgendes hilfreich (Ubuntu 18):

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

Ich habe dieses Problem mithilfe der Suchfunktion auf der Docker-Website gelöst, wobei '*' eine gültige Suche ist, die 200.000 Repositorys zurückgibt, und dann jede einzelne Seite gecrawlt habe. Durch HTML-Analyse kann ich alle Bildnamen auf jeder Seite extrahieren.

Piet
quelle