Znajdowanie warstw i rozmiarów warstw dla każdego obrazu platformy Docker

110

W celach badawczych próbuję przeszukać publiczny rejestr Docker ( https://registry.hub.docker.com/ ) i dowiedzieć się 1) ile warstw ma przeciętny obraz i 2) rozmiary tych warstw, aby uzyskać idea dystrybucji.

Jednak przestudiowałem API i biblioteki publiczne, a także szczegóły na githubie, ale nie mogę znaleźć żadnej metody, aby:

  • pobrać wszystkie publiczne repozytoria / obrazy (nawet jeśli są to tysiące, nadal potrzebuję listy początkowej do iteracji)
  • znajdź wszystkie warstwy obrazu
  • znajdź rozmiar warstwy (a więc nie obrazu, ale pojedynczej warstwy).

Czy ktoś może mi pomóc znaleźć sposób na odzyskanie tych informacji?

Dziękuję Ci!

EDYCJA: czy ktokolwiek jest w stanie sprawdzić, czy wyszukiwanie „*” w rejestrze Dockera zwraca wszystkie repozytoria, a nie tylko wszystko, co gdziekolwiek wspomina „*”? https://registry.hub.docker.com/search?q=*

user134589
źródło
7
>>> znajdź wszystkie warstwy obrazu, jeśli nie korzystasz z API, możesz zrobić a, docker history myimagea zobaczysz rozmiar każdej warstwy. Mówiąc bardziej ogólnie, na obrazie możesz docker history myimage | awk 'NR>1 {print $1}' | xargs docker inspect --format '{{ ((index .ContainerConfig.Cmd ) 0) }}'zobaczyć, jakie polecenia zostały wydane w celu utworzenia obrazu
user2915097
Jest to już świetna pomoc w kroku 2, chociaż wymaga to pobrania każdego obrazu przez Docker na moją maszynę lokalną. Wydaje mi się, że jest to opcja, ale tylko wtedy, gdy znajdę sposób na pobranie listy „moich obrazów” na początek (np. Każdy obraz w publicznym rejestrze w kroku 1). Na pewno zbadam tę opcję, dziękuję!
user134589
https://registry.hub.docker.com/search?q=*pokazuje mi 87031 repozytoriów,
user2915097

Odpowiedzi:

82

Warstwy obrazów można znaleźć w folderze / var / lib / docker / aufs / layer; podać, jeśli skonfigurowano sterownik pamięci masowej jako aufs (opcja domyślna)

Przykład:

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

Teraz, aby wyświetlić warstwy kontenerów, które zostały utworzone za pomocą obrazu „Ubuntu”; przejdź do katalogu / var / lib / docker / aufs / layer i cat plik zaczyna się od identyfikatora kontenera (tutaj jest to 0ca502fa6aae *)

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

To pokaże wynik tego samego, uruchamiając

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 

Aby wyświetlić pełny identyfikator warstwy; uruchom z opcją --no-trunc jako część polecenia historii.

docker history --no-trunc ubuntu
Viswesn
źródło
2
Nie dotyczy to już wersji docker 1.10 i nowszych. docker historypolecenie nie da warstw obrazu, jak pokazano w folderze / var / lib / docker / aufs / layer. Przeczytaj aktualizację tutaj .
Ruifeng Ma
10
Od wersji Docker 1.10, wraz z wprowadzeniem magazynu adresowalnego treści, obrazy i warstwy są teraz oddzielone. docker historypolecenie nie podaje już rzeczywistych informacji o pamięci dyskowej warstwy na hoście platformy Docker. Sprawdź ten blog
Ruifeng Ma
54

Możesz najpierw znaleźć identyfikator obrazu za pomocą:

$ docker images -a

Następnie znajdź warstwy obrazu i ich rozmiary:

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

Uwaga: używam Dockera w wersji 1.13.1

$ docker -v
Docker version 1.13.1, build 092cba3
Yuci
źródło
29

Moim zdaniem docker history <image>wystarczy. Zwraca rozmiar każdej warstwy:

$ 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
źródło
11

Mają tutaj bardzo dobrą odpowiedź: https://stackoverflow.com/a/32455275/165865

Po prostu uruchom poniższe obrazy:

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nate/dockviz images -t
sunnycmf
źródło
1
Cześć @bummi, przepraszam, myślę, że to pytanie początkowo szuka rozwiązania w rejestrze dockera i znalazłem to rozwiązanie, które dostarczyliśmy powyżej, bezpośrednio na warstwy obrazu dockera. więc staram się uzupełnić inne rozwiązanie (które moim zdaniem łatwiejsze)
sunnycmf
7

Spowoduje to sprawdzenie obrazu dokowanego i wydrukowanie warstw:

$ docker image inspect nginx -f '{{.RootFS.Layers}}'
[sha256:d626a8ad97a1f9c1f2c4db3814751ada64f60aed927764a3f994fcd88363b659 sha256:82b81d779f8352b20e52295afc6d0eab7e61c0ec7af96d85b8cda7800285d97d sha256:7ab428981537aa7d0c79bc1acbf208c71e57d9678f7deca4267cc03fba26b9c8]
lvthillo
źródło
2
  1. https://hub.docker.com/search?q=* pokazuje wszystkie obrazy w całym centrum Docker, nie można tego uzyskać za pomocą polecenia wyszukiwania, ponieważ nie akceptuje symboli wieloznacznych.

  2. Od wersji 1.10 wszystkie warstwy obrazu można znaleźć, pociągając go i używając następujących poleceń:

    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) Rozmiar można znaleźć w /var/lib/docker/image/aufs/layerdb/sha256/{LAYERID}/sizechociaż LAYERID! = The diff_ids znalezione w poprzednim poleceniu. W tym celu należy spojrzeć /var/lib/docker/image/aufs/layerdb/sha256/{LAYERID}/diffi porównać z wynikami poprzedniego polecenia, aby poprawnie dopasować poprawny identyfikator diff_id i rozmiar.

Piet
źródło
RE1) Nie działa dla mnie wydaje się przekierowywać do hub.docker.com.
joedragons
1
docker sprawdza nazwę zdjęcia | jq. []. RootFS.Layers "to znacznie prostszy sposób 2)
wheredidthatnamecod
2

Wykonywanie zapytań dotyczących manifestu lub informacji o obiekcie BLOB z serwera rejestru platformy Docker bez ściągania obrazu na dysk lokalny jest rzeczywiście wykonalne .

Możesz odwołać się do interfejsu API Registry v2, aby pobrać manifest obrazu.

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

Uwaga, musisz obsługiwać różne wersje manifestu. W przypadku wersji 2 można bezpośrednio uzyskać rozmiar warstwy i podsumowanie obiektu blob. W przypadku manifestu w wersji 1 można HEAD adres URL pobierania obiektu BLOB, aby uzyskać rzeczywisty rozmiar warstwy.

Istnieje prosty skrypt do obsługi powyższych przypadków, który będzie stale rozwijany.

Kane
źródło
0

Niezupełnie pierwotne pytanie, ale aby znaleźć sumę wszystkich obrazów bez podwójnego liczenia wspólnych warstw, przydatne jest następujące (ubuntu 18):

sudo du -h -d1  /var/lib/docker/overlay2 | sort -h
Oliver
źródło
-4

Rozwiązałem ten problem, używając funkcji wyszukiwania w witrynie Dockera, gdzie „*” jest prawidłowym wyszukiwaniem, które zwraca 200 tys. Repozytoriów, a następnie przeszukałem każdą indywidualną stronę. Analiza HTML pozwala mi wyodrębnić wszystkie nazwy obrazów na każdej stronie.

Piet
źródło