각 Docker 이미지에 대한 레이어 및 레이어 크기 찾기


111

연구 목적으로 공개 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

Docker를 통해 모든 이미지를 로컬 머신에 다운로드해야하지만 이는 이미 2 단계에 큰 도움이됩니다. 옵션이라고 생각하지만 시작할 'myimages'목록을 검색하는 방법을 찾은 경우에만 해당됩니다 (예 : 1 단계에서 공용 레지스트리의 모든 이미지). 이 옵션을 확실히 살펴 보겠습니다. 감사합니다!
user134589 apr

https://registry.hub.docker.com/search?q=*나를 위해 쇼 87,031 저장소,
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 / layers 디렉토리로 이동하여 파일이 컨테이너 ID로 시작합니다 (여기서는 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를 보려면 history 명령의 일부로 --no-trunc 옵션으로 실행합니다.

docker history --no-trunc ubuntu

2
Docker 버전 1.10 이상에서는 더 이상 그렇지 않습니다. docker history명령은 / var / lib / docker / aufs / layers 폴더에 표시된 이미지 레이어를 제공하지 않습니다. 여기 에서 업데이트를 읽으 십시오 .
Ruifeng Ma

10
Docker 버전 1.10부터 콘텐츠 주소 지정 가능 저장소가 도입되면서 이미지와 레이어가 분리되었습니다. docker history명령은 더 이상 도커 호스트의 실제 레이어 디스크 스토리지 정보를 알려주지 않습니다. 이 확인 블로그
서풍 엄마

54

먼저 다음을 사용하여 이미지 ID를 찾을 수 있습니다.

$ 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}/sizeLAYERID! = 이전 명령에서 찾은 diff_ids 에서 찾을 수 있습니다 . 이를 위해 /var/lib/docker/image/aufs/layerdb/sha256/{LAYERID}/diff올바른 diff_id 및 크기를 올바르게 일치시키기 위해 이전 명령 출력 을보고 비교 해야합니다 .


RE1) 나를 위해 작동하지 않았는데 hub.docker.com으로 리디렉션되는 것 같습니다.
joedragons

1
도커 검사 이미지 이름 | jq. []. RootFS.Layers "는 훨씬 더 간단한 방법입니다. 2)
wheredidthatnamecome from

2

실제로 이미지를 로컬 디스크로 가져 오지 않고 도커 레지스트리 서버에서 매니페스트 또는 blob 정보를 쿼리 할 수 ​​있습니다 .

레지스트리 v2 API 를 참조하여 이미지 매니페스트를 가져올 수 있습니다 .

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

다른 매니페스트 버전을 처리해야합니다. 들어 v2를 직접 레이어의 크기를 얻을 수 있으며, 방울의 소화. 들어 V1 매니페스트 , 당신은 실제 레이어 크기를 얻기 위해 BLOB 다운로드 URL을 HEAD 수 있습니다.

간단한 스크립트 지속적으로 유지 될 경우 위의 처리는.


0

원래 질문은 아니지만 공유 레이어를 이중으로 계산하지 않고 모든 이미지의 합계를 찾으려면 다음이 유용합니다 (ubuntu 18).

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

-4

Docker 웹 사이트에서 검색 기능을 사용하여이 문제를 해결했습니다. 여기서 '*'는 200k 저장소를 반환하는 유효한 검색이고 각 개별 페이지를 크롤링했습니다. HTML 구문 분석을 통해 각 페이지의 모든 이미지 이름을 추출 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.