Encontrar las capas y los tamaños de capa para cada imagen de Docker

108

Para fines de investigación, estoy tratando de rastrear el registro público de Docker ( https://registry.hub.docker.com/ ) y averiguar 1) cuántas capas tiene una imagen promedio y 2) los tamaños de estas capas para obtener una idea de la distribución.

Sin embargo, estudié la API y las bibliotecas públicas, así como los detalles en github, pero no puedo encontrar ningún método para:

  • recuperar todos los repositorios / imágenes públicos (incluso si son miles, todavía necesito una lista de inicio para recorrer)
  • encontrar todas las capas de una imagen
  • encuentre el tamaño de una capa (por lo tanto, no una imagen sino para la capa individual).

¿Alguien puede ayudarme a encontrar una manera de recuperar esta información?

¡Gracias!

EDITAR: ¿alguien puede verificar que la búsqueda de '*' en el registro de Docker devuelve todos los repositorios y no solo cualquier cosa que mencione '*' en cualquier lugar? https://registry.hub.docker.com/search?q=*

user134589
fuente
7
>>> encuentra todas las capas de una imagen, si no usas la API, puedes hacer una docker history myimagey verás el tamaño de cada capa. De manera más general, en una imagen, puede hacer docker history myimage | awk 'NR>1 {print $1}' | xargs docker inspect --format '{{ ((index .ContainerConfig.Cmd ) 0) }}'para ver qué comandos se emitieron para crear la imagen
user2915097
Esto ya es de gran ayuda para el paso 2, aunque eso requiere que descargue cada imagen a través de Docker en mi máquina local. Supongo que es una opción, pero solo si encuentro una manera de recuperar una lista de 'myimages' para comenzar (por ejemplo, cada imagen en el registro público en el paso 1). Definitivamente exploraré esta opción, ¡gracias!
user134589
https://registry.hub.docker.com/search?q=*muestra para mí 87031 repositorios,
user2915097

Respuestas:

81

Puede encontrar las capas de las imágenes en la carpeta / var / lib / docker / aufs / layer; proporcione si configuró el controlador de almacenamiento como aufs (opción predeterminada)

Ejemplo:

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

Ahora para ver las capas de los contenedores que fueron creados con la imagen "Ubuntu"; vaya al directorio / var / lib / docker / aufs / layer y cat, el archivo comienza con el ID del contenedor (aquí es 0ca502fa6aae *)

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

Esto mostrará el resultado de la misma ejecutando

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 

Para ver el ID de capa completo; ejecutar con la opción --no-trunc como parte del comando de historial.

docker history --no-trunc ubuntu
Viswesn
fuente
1
Este ya no es el caso con la versión 1.10 de Docker en adelante. docker historyEl comando no dará las capas de imagen como se muestra en la carpeta / var / lib / docker / aufs / layer. Lea la actualización aquí .
Ruifeng Ma
9
Desde la versión 1.10 de Docker, con la introducción del almacenamiento direccionable de contenido, las imágenes y las capas ahora están separadas. docker historyEl comando ya no indica la información de almacenamiento en disco de la capa real en el host de la ventana acoplable. Consulte este blog
Ruifeng Ma
52

Primero puede encontrar la identificación de la imagen usando:

$ docker images -a

Luego, busque las capas de la imagen y sus tamaños:

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

Nota: estoy usando la versión 1.13.1 de Docker

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

Echa un vistazo a dive escrito en golang.

¡Impresionante herramienta!

Levon
fuente
28

En mi opinión, docker history <image>es suficiente. Esto devuelve el tamaño de cada capa:

$ 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
fuente
11

Tienen una muy buena respuesta aquí: https://stackoverflow.com/a/32455275/165865

Simplemente ejecute debajo de las imágenes:

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nate/dockviz images -t
sunnycmf
fuente
1
Hola @bummi, lo siento, creo que esta pregunta inicialmente está buscando una solución en el registro de la ventana acoplable, y encontré la solución que proporcionamos anteriormente directamente en las capas de la imagen de la ventana acoplable. así que trato de complementar otra solución (que yo creo más fácil)
sunnycmf
7

Esto inspeccionará la imagen de la ventana acoplable e imprimirá las capas:

$ docker image inspect nginx -f '{{.RootFS.Layers}}'
[sha256:d626a8ad97a1f9c1f2c4db3814751ada64f60aed927764a3f994fcd88363b659 sha256:82b81d779f8352b20e52295afc6d0eab7e61c0ec7af96d85b8cda7800285d97d sha256:7ab428981537aa7d0c79bc1acbf208c71e57d9678f7deca4267cc03fba26b9c8]
lvthillo
fuente
2
  1. https://hub.docker.com/search?q=* muestra todas las imágenes en todo el hub de Docker, no es posible obtener esto a través del comando de búsqueda ya que no acepta comodines.

  2. A partir de la v1.10, puede encontrar todas las capas en una imagen tirando de ella y usando estos comandos:

    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) El tamaño se puede encontrar en /var/lib/docker/image/aufs/layerdb/sha256/{LAYERID}/sizeaunque LAYERID! = Los diff_ids encontrados con el comando anterior. Para esto, debe mirar /var/lib/docker/image/aufs/layerdb/sha256/{LAYERID}/diffy comparar con la salida del comando anterior para que coincida correctamente con el diff_id y el tamaño correctos.

Piet
fuente
RE1) No funcionó para mí, parece redirigir a hub.docker.com.
joedragons
1
Docker inspeccionar nombre de imagen | jq. []. RootFS.Layers "es una forma mucho más sencilla de hacer 2)
whereredidthatnamecomefrom
2

De hecho, es posible consultar el manifiesto o la información de blob desde el servidor de registro de Docker sin extraer la imagen al disco local.

Puede consultar la API Registry v2 para obtener el manifiesto de la imagen.

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

Tenga en cuenta que debe manejar una versión de manifiesto diferente. Para v2 , puede obtener directamente el tamaño de la capa y el resumen de blob. Para el manifiesto v1 , puede HEAD la URL de descarga de blob para obtener el tamaño real de la capa.

Existe un script simple para manejar los casos anteriores que se mantendrá continuamente.

Kane
fuente
0

No es exactamente la pregunta original, pero para encontrar la suma total de todas las imágenes sin contar dos veces las capas compartidas, lo siguiente es útil (ubuntu 18):

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

Resolví este problema usando la función de búsqueda en el sitio web de Docker donde '*' es una búsqueda válida que devuelve 200k repositorios y luego rastreé cada página individual. El análisis de HTML me permite extraer todos los nombres de imágenes en cada página.

Piet
fuente