도커 컨테이너의 디스크 사용량을 분석하는 방법
Docker가 12GB의 파일 시스템을 가져가는 것을 알 수 있습니다.
2.7G /var/lib/docker/vfs/dir
2.7G /var/lib/docker/vfs
2.8G /var/lib/docker/devicemapper/mnt
6.3G /var/lib/docker/devicemapper/devicemapper
9.1G /var/lib/docker/devicemapper
12G /var/lib/docker
그런데 어떻게 이게 컨테이너에 분산되어 있는지 어떻게 알 수 있을까요?
(새로운 v1.3 명령어)를 실행하여 컨테이너에 접속하려고 했습니다.
docker exec -it <container_name> bash
df - h'를 실행하여 디스크 사용량을 분석합니다.동작하고 있는 것 같지만, 「볼륨」을 사용하는 컨테이너에서는 동작하지 않습니다.
예를 들어, 저는 'mongo-data'라는 데이터 전용 컨테이너를 MongoDB에 사용합니다.
★★★★★★★★★★★★★★★를 실행했을 때,docker run -it --volumes-from mongo-data busybox , , 을 누릅니다.df -h에는 파일 되어 ./data/db 컨테이너3G를 하지만 ('mongo-data'를 했을 때) 11.3G자형du -h /data/db2.1 을 고 하다
그러면 컨테이너/볼륨 디스크 사용량을 분석하려면 어떻게 해야 할까요?또는 제 경우 'mongo-data' 컨테이너 크기는 어떻게 알 수 있습니까?
하려면 , 「」를 사용합니다.--size가 됩니다.docker ps:
docker ps --size
1.13.0 이후 Docker에는 새로운 명령어가 포함되어 있습니다.docker system df도커 디스크 사용량을 표시합니다.
$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 5 1 2.777 GB 2.647 GB (95%)
Containers 1 1 0 B 0B
Local Volumes 4 1 3.207 GB 2.261 (70%)
공간 사용에 대한 자세한 정보를 표시하려면:
$ docker system df --verbose
위의 내 댓글이 숨겨졌기 때문에 답변으로 이 글을 올렸습니다.
컨테이너 크기를 나열합니다.
du -d 2 -h /var/lib/docker/devicemapper | grep `docker inspect -f "{{.Id}}" <container_name>`
컨테이너 볼륨의 크기를 나열합니다.
docker inspect -f "{{.Volumes}}" <container_name> | sed 's/map\[//' | sed 's/]//' | tr ' ' '\n' | sed 's/.*://' | xargs sudo du -d 1 -h
편집: 실행 중인 모든 컨테이너의 크기와 볼륨을 나열합니다.
for d in `docker ps -q`; do
d_name=`docker inspect -f {{.Name}} $d`
echo "========================================================="
echo "$d_name ($d) container size:"
sudo du -d 2 -h /var/lib/docker/devicemapper | grep `docker inspect -f "{{.Id}}" $d`
echo "$d_name ($d) volumes:"
docker inspect -f "{{.Volumes}}" $d | sed 's/map\[//' | sed 's/]//' | tr ' ' '\n' | sed 's/.*://' | xargs sudo du -d 1 -h
done
메모: 도커 파일 시스템에 따라 'devicemapper'를 변경합니다(예: 'aufs').
볼륨 부분은 더 이상 작동하지 않기 때문에 누군가 문제가 있는 경우 위의 스크립트를 조금 변경합니다.
for d in `docker ps | awk '{print $1}' | tail -n +2`; do
d_name=`docker inspect -f {{.Name}} $d`
echo "========================================================="
echo "$d_name ($d) container size:"
sudo du -d 2 -h /var/lib/docker/aufs | grep `docker inspect -f "{{.Id}}" $d`
echo "$d_name ($d) volumes:"
for mount in `docker inspect -f "{{range .Mounts}} {{.Source}}:{{.Destination}}
{{end}}" $d`; do
size=`echo $mount | cut -d':' -f1 | sudo xargs du -d 0 -h`
mnt=`echo $mount | cut -d':' -f2`
echo "$size mounted on $mnt"
done
done
용 i i i i를 쓴다.docker stats $(docker ps --format={{.Names}}) --no-stream방법 : 수수 :
- CPU 사용률,
- 메모리 사용량/컨테이너에 할당된 총 메모리(도커 실행 명령을 사용하여 할당할 수 있음)
- 메모리 %
- 블록 I/O
- 순 I/O
Maxime의 소프트웨어 개선:
docker ps --size
다음과 같은 것이 표시됩니다.
+---------------+---------------+--------------------+
| CONTAINER ID | IMAGE | SIZE |
+===============+===============+====================+
| 6ca0cef8db8d | nginx | 2B (virtual 183MB) |
| 3ab1a4d8dc5a | nginx | 5B (virtual 183MB) |
+---------------+---------------+--------------------+
컨테이너를 시작할 때 컨테이너가 시작되는 이미지는 읽기 전용(가상)으로 마운트됩니다.
그 위에 쓰기 가능한 레이어가 마운트되어 컨테이너에 대한 변경 내용이 기록됩니다.
따라서 가상 크기(이 예에서는 183MB)는 동일한 이미지에서 시작하는 컨테이너 수에 관계없이 한 번만 사용됩니다. 즉, 1개의 컨테이너를 시작할 수도 있고 1,000개의 컨테이너를 시작할 수도 있습니다. 여분의 디스크 공간은 사용되지 않습니다.
는되는 총 은 다음과 같습니다
183 MB + 5B + 2B
표시된 크기에는 컨테이너에 사용되는 모든 디스크 공간이 포함되지 않습니다.
현재 포함되지 않은 것은 다음과 같습니다.
(볼륨)
(스왑)
- 체크포인트
에 의해 된 로그 되는 디스크 - 컨테이너에 의해 생성된 로그 파일에 사용되는 디스크 영역
https://github.com/docker/docker.github.io/issues/1520#issuecomment-305179362
(이 답변은 유용하지 않습니다만, 코멘트 중 일부는 유효할 수 있기 때문에 여기에 남겨 둡니다.)
docker images는 '가상 크기', 즉 모든 하위 계층을 포함한 총 크기를 표시합니다.따라서 동일한 기본 이미지를 공유하는 컨테이너가 있는 경우 이중 카운트를 수행합니다.
사용할 수 있습니다.
docker history IMAGE_ID
이미지 크기가 다양한 서브 컴포넌트 간에 어떻게 분배되는지 확인합니다.
주의해 주세요docker ps --size이 명령어를 완료하는 데 몇 분 이상 소요되므로 비용이 많이 드는 경우가 있습니다.에도 동일하게 됩니다.size=1 을 사용법
델이 정리한 대안을 소개합니다.예를 들어,du -hs★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
도커 ps --size 대신
"docker ps --size"는 호스트에서 높은 IO 로드를 생성하므로 운영 환경에서는 이러한 명령을 매분 실행할 수 없습니다.따라서 필요한 컨테이너 크기를 얻으려면 또는 보다 정확하게 시스템퍼포먼스에 미치는 영향이 적은 RW 레이어 크기를 얻기 위해 회피책을 실행해야 합니다.
이 접근 방식은 모든 컨테이너의 "장치 이름"을 수집한 다음 "df" 명령을 사용하여 컨테이너 크기를 확인합니다.이러한 "디바이스 이름"은 가 각 컨테이너에 마운트 또는 마운트되는 씬 프로비저닝된 볼륨입니다.이 크기가 기본 이미지의 모든 읽기 전용 레이어를 의미하기 때문에 한 가지 문제가 여전히 남아 있습니다.이를 해결하기 위해 사용한 컨테이너 이미지의 크기를 간단히 확인하고 디바이스/thin_volume 크기에서 추출할 수 있습니다.
모든 이미지 레이어는 디바이스 매퍼를 사용할 때 일종의 lvm 스냅샷으로 구현됩니다.유감스럽게도 스냅샷/레이어를 출력할 수 없었습니다.그렇지 않으면 단순히 "최신" 스냅샷 크기를 수집할 수 있습니다.누군가 분명히 해줬으면 좋겠어요.하지만...
일부 테스트 후, 컨테이너를 생성하면 항상 약 40MiB의 오버헤드가 발생하는 것으로 보입니다(이미지 "httpd:2.4.46-alpine"에 기반한 컨테이너로 테스트됨).
- docker run - d --name apache httpd : 2 . 4 . 46 - http // 이제 도커 검사에서 디바이스 이름을 가져와 df를 사용하여 검색합니다.
- df - T -> 90MB인 반면 "docker ps --size"의 "Virtual Size"는 50MB, 2Bytes -> 알 수 없는 오버헤드 40MB로 되어 있습니다.
- 컨테이너 내의 100MB 파일 컬/다운로드
- df - T -> 190MB인 반면 "docker ps --size"의 "Virtual Size"는 150MB, payload는 100MB -> 오버헤드 40MB로 표시됩니다.
다음 셸은 "docker ps --size" 결과와 일치하는 결과(바이트 단위)를 인쇄합니다(단, 40MB의 오버헤드에 유의하십시오).
for c in $(docker ps -q); do \
container_name=$(docker inspect -f "{{.Name}}" ${c} | sed 's/^\///g' ); \
device_n=$(docker inspect -f "{{.GraphDriver.Data.DeviceName}}" ${c} | sed 's/.*-//g'); \
device_size_kib=$(df -T | grep ${device_n} | awk '{print $4}'); \
device_size_byte=$((1024 * ${device_size_kib})); \
image_sha=$(docker inspect -f "{{.Image}}" ${c} | sed 's/.*://g' ); \
image_size_byte=$(docker image inspect -f "{{.Size}}" ${image_sha}); \
container_size_byte=$((${device_size_byte} - ${image_size_byte})); \
\
echo my_node_dm_device_size_bytes\{cname=\"${container_name}\"\} ${device_size_byte}; \
echo my_node_dm_container_size_bytes\{cname=\"${container_name}\"\} ${container_size_byte}; \
echo my_node_dm_image_size_bytes\{cname=\"${container_name}\"\} ${image_size_byte}; \
done
디바이스 매퍼에 대한 자세한 내용은http://https://test-dockerrr.readthedocs.io/en/latest/userguide/storagedriver/device-mapper-driver/ 를 참조해 주세요.
이 명령어는 도커 데몬이 사용하는 디스크 용량에 대한 정보를 표시합니다.
docker system df -v
언급URL : https://stackoverflow.com/questions/26753087/how-to-analyze-disk-usage-of-a-docker-container
'programing' 카테고리의 다른 글
| Linux용 JSON 명령줄 포맷 도구 (0) | 2023.04.01 |
|---|---|
| Flask의 jsonify를 사용할 때 datetime.date를 'yyy-mm-d' 형식으로 유지합니다. (0) | 2023.04.01 |
| Angular 요소의 지시 템플릿 고유 IDJS (0) | 2023.04.01 |
| 리액트 JSX에서 rest는 무엇을 의미합니까? (0) | 2023.04.01 |
| 모든 테이블의 모든 필드에서 특정 값 검색(Oracle) (0) | 2023.04.01 |