각 도커 이미지의 레이어 및 레이어 크기 찾기
연구 목적으로 저는 공공 도커 레지스트리(https://registry.hub.docker.com/ )를 탐색하여 1) 평균 이미지에 몇 개의 레이어가 있는지, 2) 이러한 레이어의 크기를 알아내고 분포에 대한 아이디어를 얻으려고 합니다.
하지만 저는 API와 공공 도서관뿐만 아니라 github에 대한 세부 사항을 공부했지만 다음과 같은 방법을 찾을 수 없습니다.
- 모든 공용 리포지토리/이미지 검색(수천 개인 경우에도 반복할 시작 목록이 필요함
- 이미지의 모든 레이어 찾기
- 레이어의 크기를 찾습니다(이미지가 아니라 개별 레이어의 크기).
이 정보를 검색하는 방법을 찾는 것을 도와줄 수 있는 사람이 있습니까?
편집: 도커 레지스트리에서 '*'를 검색하면 '*'를 언급하는 모든 리포지토리가 아니라 모든 리포지토리가 반환되는지 확인할 수 있는 사람이 있습니까?https://registry.hub.docker.com/search?q=\*
골랑으로 쓰여진 다이빙을 확인해보세요.
멋진 도구!
먼저 다음을 사용하여 이미지 ID를 찾을 수 있습니다.
$ docker images -a
그런 다음 이미지의 레이어와 크기를 찾습니다.
$ docker history --no-trunc <Image ID>
참고: 저는 도커 버전 1.13.1을 사용하고 있습니다.
$ docker -v
Docker version 1.13.1, build 092cba3
이미지의 계층은 /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
제생는에각,,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
도커 이미지를 검사하고 레이어를 인쇄합니다.
$ docker image inspect nginx -f '{{.RootFS.Layers}}'
[sha256:d626a8ad97a1f9c1f2c4db3814751ada64f60aed927764a3f994fcd88363b659 sha256:82b81d779f8352b20e52295afc6d0eab7e61c0ec7af96d85b8cda7800285d97d sha256:7ab428981537aa7d0c79bc1acbf208c71e57d9678f7deca4267cc03fba26b9c8]
그들은 여기에 매우 좋은 답을 가지고 있습니다: https://stackoverflow.com/a/32455275/165865 .
아래 이미지를 실행합니다.
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock nate/dockviz images -t
https://hub.docker.com/search?q=* 은 전체 도커 허브에 있는 모든 이미지를 표시합니다. 와일드카드를 사용할 수 없기 때문에 검색 명령을 통해 이 이미지를 가져올 수 없습니다.
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 ':' '/')
크기는 다음에서 확인할 수 있습니다./var/lib/docker/image/aufs/layerdb/sha256/{LAYERID}/size
!= 이전 명령에서 diff_ids를 찾았습니다.이를 위해 확인할 필요가 있습니다./var/lib/docker/image/aufs/layerdb/sha256/{LAYERID}/diff
이전 명령 출력과 비교하여 올바른 diff_id 및 크기를 적절하게 일치시킵니다.
이미지를 로컬 디스크로 가져오지 않고 도커 레지스트리 서버에서 매니페스트 또는 블롭 정보를 쿼리할 수 있습니다.
레지스트리 v2 API를 참조하여 이미지 매니페스트를 가져올 수 있습니다.
GET /v2/<name>/manifests/<reference>
다른 매니페스트 버전을 처리해야 합니다.v2의 경우 레이어의 크기와 블롭의 다이제스트를 직접 가져올 수 있습니다.v1 매니페스트의 경우 Blob 다운로드 URL을 머리글로 표시하여 실제 계층 크기를 가져올 수 있습니다.
위 사례를 처리하기 위한 간단한 스크립트가 있으며 이 스크립트는 지속적으로 유지됩니다.
하나 더 많은 도구: https://github.com/CenturyLinkLabs/dockerfile-from-image
ImageLayers.io 을 사용한 GUI
이미지의 모든 레이어를 찾고 레이어의 크기를 찾으려면 "매니페스트" 실험 기능을 통해 도커 허브 레지스트리에서 매니페스트를 표시할 수 있습니다.
docker manifest inspect ubuntu
결과는 JSON 파일입니다(여기에는 첫 번째 줄만 표시됨).
{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
"manifests": [
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 529,
"digest": "sha256:10cbddb6cf8568f56584ccb6c866203e68ab8e621bb87038e254f6f27f955bbe",
"platform": {
"architecture": "amd64",
"os": "linux"
}
},
{
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"size": 529,
"digest": "sha256:dd375524d7eda25a69f9f9790cd3e28855be7908e04162360dd462794035ebf7",
"platform": {
"architecture": "arm",
"os": "linux",
"variant": "v7"
정확히 원래 질문은 아니지만 공유 계층을 이중으로 계산하지 않고 모든 이미지의 합계를 찾는 데 다음이 유용합니다(Ubuntu 18).
sudo du -h -d1 /var/lib/docker/overlay2 | sort -h
저는 도커 웹사이트의 검색 기능을 사용하여 이 문제를 해결했습니다. 여기서 '*'는 200,000개의 저장소를 반환하는 유효한 검색이고, 각 개별 페이지를 탐색했습니다.HTML 구문 분석을 통해 각 페이지의 모든 이미지 이름을 추출할 수 있습니다.
언급URL : https://stackoverflow.com/questions/29696656/finding-the-layers-and-layer-sizes-for-each-docker-image
'programing' 카테고리의 다른 글
자바스크립트 코드를 통해 확인해도 체크박스 클릭 이벤트를 트리거하는 방법은? (0) | 2023.08.10 |
---|---|
'org. spring framework' 유형의 콩.security.oauth2.client.registration.'클라이언트 등록 리포지토리'를 찾을 수 없습니다. - Spring Security (0) | 2023.08.10 |
매개 변수가 포함된 콜백 함수를 전달하시겠습니까? (0) | 2023.08.10 |
목록의 모든 항목이 없음인지 확인하는 방법은 무엇입니까? (0) | 2023.08.10 |
엑셀 VBA의 Rnd()가 정말 이렇게 나쁜가요? (0) | 2023.08.10 |