programing

도커 컨테이너의 디스크 사용량을 분석하는 방법

madecode 2023. 4. 1. 23:10
반응형

도커 컨테이너의 디스크 사용량을 분석하는 방법

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방법 : 수수 :

  1. CPU 사용률,
  2. 메모리 사용량/컨테이너에 할당된 총 메모리(도커 실행 명령을 사용하여 할당할 수 있음)
  3. 메모리 %
  4. 블록 I/O
  5. 순 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"에 기반한 컨테이너로 테스트됨).

  1. docker run - d --name apache httpd : 2 . 4 . 46 - http // 이제 도커 검사에서 디바이스 이름을 가져와 df를 사용하여 검색합니다.
  2. df - T -> 90MB인 반면 "docker ps --size"의 "Virtual Size"는 50MB, 2Bytes -> 알 수 없는 오버헤드 40MB로 되어 있습니다.
  3. 컨테이너 내의 100MB 파일 컬/다운로드
  4. 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

반응형