리셋 되지 말자

docker image 실제 크기 본문

Docker

docker image 실제 크기

kyeongjun-dev 2022. 2. 10. 18:18

도커 이미지 크기와 실제 file system 에서의 크기

 

df vs du

linux에서 남은 용량을 확인하기 위해 du나 df명령어를 사용할 수 있다. 이때, 위에처럼서로 남은 용량의 크기가 다르다. 이는 df와 du가 디스크 용량을 계산하는 방식이 다르기 때문이라고 한다. 각자 방식은 아래와 같다. (출처)

  • df : 파일시스템의 디스크 블럭들을 조회
  • du : 파일트리를 따라 이동하면서 stat()라는 시스템 호출을 이용하여 얻은 각각의 디렉토리, 심링크 및 파일에 할당된 블럭의 수를 더하여 계산

도커 이미지 다운로드 및 용량 변화 체크

python:3.8 이미지를 다운받고, 용량 변화를 체크한다.

 

다운받은 이미지의 크기가 885MB 라고 표시된다.

 

df는 5981에서 6896으로 915MB가 증가했다. du는 5904에서 6804으로 900MB가 증가했다.


docker 루트 디렉토리 확인

python:3.8 이미지를 다운로드 받은 후의 /var/lib/docker 디렉토리의 용량이 902MB 임을 확인할 수 있다.

 

도커의 공식문서 또는 docker info 명령어를 사용해 Docker Root Dir을 확인하면 /var/lib/docker 임을 확인할 수 있다.

 

python:3.8 이미지를 삭제하고 나면, /var/lib/docker 디렉토리 용량이 1MB로 줄어든것을 확인할 수 있다. 그렇다면 docker image를 다운로드 받으면 모든 파일이 /var/lib/docker 디렉토리에 저장되는 것인가? 라는 의문이 든다.


도커 이미지 다운로드 전, 후 확인

[root@ip-192-168-0-59 ~]# du -c / > before.txt

python:3.8 이미지를 삭제한 상태에서 du 명령어의 결과를 저장한다.

 

[root@ip-192-168-0-59 ~]# du -c / > after.txt

python:3.8 이미지를 다운로드 받은 상태에서 du 명령어의 결과를 저장한다.

 

[root@ip-192-168-0-59 ~]# diff before.txt after.txt > result.txt

before.txt 파일과 after.txt 파일의 변경된 내용을 result.txt에 저장한다.


result.txt 파일 분석

< 6047248       /
< 6047248       total                                                                                                                                               
---                                                                                                                                                                 
> 6971776       /                                                                                                                                                   
> 6971776       total

root 디렉토리의 용량은 924,528KB 증가했다. 이 중에서 before, after, result.txt 파일의 용량을 제외하면 증가량은 922,968KB가 된다.

 

< 381360        /var
---
> 1304328       /var

/var 용량은 922,968KB(약 922968 kB = 901.3359375 MB) 증가했다.

 

< 252   /var/lib/docker
< 30376 /var/lib
---
> 923216        /var/lib/docker
> 953344        /var/lib

/var/lib는 922,968KB가 증가했다. 여기까지 분석하면 /var/lib 의 용량만 증가했음을 확인할 수 있다.
/var/lib/docker는 922,964KB가 증가했다. 여기까지 분석하면 4KB 차이가 생긴다. 그럼 이 4KB는 어디에 생기는가?

 

< 0     /var/lib/containerd/io.containerd.content.v1.content/blobs/sha256
< 0     /var/lib/containerd/io.containerd.content.v1.content/blobs
< 0     /var/lib/containerd/io.containerd.content.v1.content
---
> 4     /var/lib/containerd/io.containerd.content.v1.content/blobs/sha256
> 4     /var/lib/containerd/io.containerd.content.v1.content/blobs
> 4     /var/lib/containerd/io.containerd.content.v1.content
8495c8521
< 88    /var/lib/containerd
---
> 92    /var/lib/containerd
8502c8528,12189

/var/lib/containerd가 4KB 증가한 것을 확인할 수 있다. 정확히는 /var/lib/containerd/io.containerd.content.v1.content/blobs/sha256 이 4KB 증가했다.


 

ubuntu:18.04 이미지를 추가로 다운로드

ubuntu:18.04 이미지를 다운로드 받은 후, /var/lib/containerd는 8, /var/lib/docker는 68104KB 증가했다.

 

root 디렉토리(/)의 용량은 68,112KB 증가했다.


TMI

[root@ip-192-168-0-59 sha256]# cat 5fca29485c9d818999ac73b464a074485165634097f0571fe60995b7dede40ae 
{
   "schemaVersion": 2,
   "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
   "config": {
      "mediaType": "application/vnd.docker.container.image.v1+json",
      "size": 8577,
      "digest": "sha256:2359cdffa276ad2bc06877b37fb8d28316c6f72273e9762f81141f16f569e49b"
   },
   "layers": [
      {
         "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
         "size": 54917164,
         "digest": "sha256:0c6b8ff8c37e92eb1ca65ed8917e818927d5bf318b6f18896049b5d9afc28343"
      },
      {
         "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
         "size": 5152685,
         "digest": "sha256:412caad352a3ecbb29c080379407ae0761e7b9b454f7239cbfd1d1da25e06b29"
      },
      {
         "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
         "size": 10871783,
         "digest": "sha256:e6d3e61f7a504fa66d7275123969e9917570188650eb84b2280a726b996040f6"
      },
      {
         "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
         "size": 54567492,
         "digest": "sha256:461bb1d8c517c7f9fc0f1df66c9dc34c85a23421c1e1c540b2e28cbb258e75f5"
      },
      {
         "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
         "size": 196529197,
         "digest": "sha256:808edda3c2e855dc13af758b35cefbcc417ad1ab4fead7f72234b09aeda893a0"
      },
      {
         "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
         "size": 6290717,
         "digest": "sha256:724cfd2dc19be12b837643ea67bd5ad7a6fd98049a88f02ec70eca30fa03a5a1"
      },
      {
         "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
         "size": 9022752,
         "digest": "sha256:97883a2e318ebe4f446ed8de9b4fa23dd4f6c63a4a80d53d62a929d89ca1d824"
      },
      {
         "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
         "size": 235,
         "digest": "sha256:08bbfb2bdff709c0f1ece89e51a8a9a38f2ed535e053d87a1d8f9c55297e0e1f"
      },
      {
         "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
         "size": 2352921,
         "digest": "sha256:3ded81a913fd89d733c1eb9a26ff8c56a24108cabb896bab35396137696a13fe"
      }
   ]
}

python:3.8 이미지를 다운받았을 때, /var/lib/containerd/io.containerd.content.v1.content/blobs/sha256 의 용량이 4KB 증가하는데, 해당 위치에 생성된 파일의 내용이다. 이는 해당 이미지를 이루는 레이어에 대한 manifest 파일이라고 한다.

 

[root@ip-192-168-0-59 sha256]# docker image inspect 2359cdffa276 | grep 5fca2948
            "395389474517.dkr.ecr.ap-northeast-2.amazonaws.com/python@sha256:5fca29485c9d818999ac73b464a074485165634097f0571fe60995b7dede40ae"

해당 파일의 이름은 repo에 저장되있던 이미지의 hash id 값이다.


Comments