Определение слоев и размеров слоев для каждого образа Docker


112

В исследовательских целях я пытаюсь просканировать общедоступный реестр Docker ( https://registry.hub.docker.com/ ) и выяснить: 1) сколько слоев в среднем образе и 2) размеры этих слоев, чтобы получить идея распределения.

Однако я изучил API и публичные библиотеки, а также подробную информацию о github, но я не могу найти никакого метода, чтобы:

  • получить все общедоступные репозитории / изображения (даже если их тысячи, мне все еще нужен начальный список для перебора)
  • найти все слои изображения
  • найти размер слоя (то есть не изображения, а отдельного слоя).

Может ли кто-нибудь помочь мне найти способ получить эту информацию?

Спасибо!

РЕДАКТИРОВАТЬ: может ли кто-нибудь проверить, что поиск «*» в реестре Docker возвращает все репозитории, а не только что-либо, где упоминается «*»? https://registry.hub.docker.com/search?q=*


7
>>> Найдите все слои изображения. Если вы не используете API, вы можете сделать это, docker history myimageи вы увидите размер каждого слоя. В более общем плане, на изображении вы можете docker history myimage | awk 'NR>1 {print $1}' | xargs docker inspect --format '{{ ((index .ContainerConfig.Cmd ) 0) }}'увидеть, какие команды были
введены

Это уже отличный помощник для шага 2, хотя для этого мне необходимо загрузить каждый образ через Docker на мою локальную машину. Я предполагаю, что это вариант, но только если я найду способ получить список «myimages» для начала (например, каждое изображение в общедоступном реестре на шаге 1). Я обязательно изучу этот вариант, спасибо!
user134589

https://registry.hub.docker.com/search?q=*показывает мне 87031 репозиториев,
user2915097

Ответы:


82

Вы можете найти слои изображений в папке / 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 / sizes и укажите, что файл начинается с идентификатора контейнера (здесь это 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 

Чтобы просмотреть полный идентификатор слоя; запустить с параметром --no-trunc как часть команды history.

docker history --no-trunc ubuntu

2
Это больше не относится к docker версии 1.10 и новее. docker historyкоманда не будет отображать слои изображения, как показано в папке / var / lib / docker / aufs / sizes. Прочтите обновление здесь .
Жуйфэн Ма

10
Начиная с версии Docker 1.10, с введением адресуемого хранилища контента изображения и слои теперь разделены. docker historyКоманда больше не сообщает фактическую информацию о дисковом хранилище слоя на хосте докеров. Проверьте этот блог
Ruifeng Ma


54

Сначала вы можете найти идентификатор изображения, используя:

$ docker images -a

Затем найдите слои изображения и их размеры:

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

Примечание: я использую Docker версии 1.13.1.

$ docker -v
Docker version 1.13.1, build 092cba3

29

На мой взгляд, 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, извините, я думаю, что изначально этот вопрос ищет решение в реестре докеров, и я нашел это решение, которое мы предоставили выше, прямо для слоев образа докера. поэтому я пытаюсь дополнить другое решение (которое, как мне кажется, проще)
sunnycmf

7

Это проверит изображение докера и распечатает слои:

$ docker image inspect nginx -f '{{.RootFS.Layers}}'
[sha256:d626a8ad97a1f9c1f2c4db3814751ada64f60aed927764a3f994fcd88363b659 sha256:82b81d779f8352b20e52295afc6d0eab7e61c0ec7af96d85b8cda7800285d97d sha256:7ab428981537aa7d0c79bc1acbf208c71e57d9678f7deca4267cc03fba26b9c8]


2
  1. https://hub.docker.com/search?q=* показывает все изображения во всем Docker-хабе, это невозможно получить с помощью команды поиска, так как он не принимает подстановочные знаки.

  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

1
докер проверить имя изображения | jq. []. RootFS.Layers "- гораздо более простой способ сделать 2)
откуда это имя появилось

2

Действительно, можно запросить информацию о манифесте или большом двоичном объекте с сервера реестра докеров, не выгружая образ на локальный диск.

Вы можете обратиться к API реестра v2, чтобы получить манифест изображения.

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

Обратите внимание, что вам нужно обрабатывать другую версию манифеста. Для v2 вы можете напрямую получить размер слоя и дайджеста blob. Для манифеста v1 вы можете ЗАГОЛОВИТЬ URL-адрес загрузки большого двоичного объекта, чтобы получить фактический размер слоя.

Существует простой сценарий для обработки вышеуказанных случаев, который будет постоянно поддерживаться.


0

Не совсем исходный вопрос, но чтобы найти общую сумму всех изображений без двойного подсчета общих слоев, полезно следующее (ubuntu 18):

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

-4

Я решил эту проблему, используя функцию поиска на веб-сайте Docker, где «*» - это действительный поиск, который возвращает 200 тыс. Репозиториев, а затем я просканировал каждую отдельную страницу. Анализ HTML позволяет мне извлекать все имена изображений на каждой странице.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.