프로그래밍/도커

도커 Images size total은 실제 용량과 같을까?

Hwan2 2023. 3. 30. 23:52
반응형

https://hwan-shell.tistory.com/370

 

도커의 Image layer

이 글을 작성하게 된 계기는 Container를 띄울 때 Container에 생성한 파일과 디렉토리들이 어디에 저장되고 관리되는지 궁금해서 찾다가 작성하게 되었습니다. 우리는 Docker를 사용할 때 아무생각 없

hwan-shell.tistory.com

 

도커에서는 Image layer라는 개념을 통해 공통된 Image layer를 공유합니다.

$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
hwani        1         3801c0b7b8a8   7 minutes ago   999MB
hwani        2         3801c0b7b8a8   7 minutes ago   999MB
node         latest    0e0ab07dbedd   6 days ago      999MB

이렇게 이미지가 3개여도 실제 차지하는 용량은 3GB가 아닐 수 있습니다.

 

이를 확인해보기 위해 다음과 같은 테스트를 해봅니다.

Dockerfile

#Dockerfile

FROM node:latest

WORKDIR /app

COPY sort.js /app

ENTRYPOINT ["node"]
CMD ["sort.js"]

Javascript

function mergeSort(arr) {
    if (arr.length < 2) return arr;
    const mid = Math.floor(arr.length / 2);
    const left = arr.slice(0, mid);
    const right = arr.slice(mid);
    return merge(mergeSort(left), mergeSort(right));
}

function merge(left, right) {
    const result = [];
    while (left.length && right.length) {
        if (left[0] <= right[0]) {
            result.push(left.shift());
        } else {
            result.push(right.shift());
        }
    }
    while (left.length) result.push(left.shift());
    while (right.length) result.push(right.shift());
    return result;
}

arr = [5, 10, 1, 2, 5, 3, 19];
sortArray = mergeSort(arr);

console.log(sortArray);

 

이 두 파일을 같은 디렉토리에 저장 후 Docker build를 진행해줍니다.

$ docker build -t hwani:1 .
$ docker build -t hwani:2 .

그러면 도커 이미지 파일이 2개가 생성됩니다.

그리고 Images 명령어로 확인해보면 node 이미지까지 총 3개가 나오는걸 확인할 수 있습니다.

$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
hwani        1         3801c0b7b8a8   7 minutes ago   999MB
hwani        2         3801c0b7b8a8   7 minutes ago   999MB
node         latest    0e0ab07dbedd   6 days ago      999MB

 

하지만 실제 Images가 차지하고 있는걸 확인해보면 다음과 같습니다.

$ docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          2         0         998.8MB   998.8MB (100%)
Containers      22        0         2.375kB   2.375kB (100%)
Local Volumes   28        28        233.8MB   0B (0%)
Build Cache     0         0         0B        0B

 

이상하게 3개로 나와야 할 것 같은데 2개로 나옵니다. 그리고 사이즈도 1GB밖에 안됩니다.

그 이유는 Image layer를 공유하고 있기 때문입니다.

 

기본 Base image인 node image에 간단한 javascript를 추가만 했기 때문에 용량의 변동은 크게 없지만,

새로운 layer가 추가되었고 그것을 다시 image로 만들었기 때문에,

실제 용량 증가는 기존 node image에서 크게 벗어나지 않습니다.

즉, hwani:1, hwani:2 이미지는 node 이미지를 서로 공유하여 사용하고 있는 것입니다.

 

그럼 docker system df했을 때 image가 2개인 이유는 뭘까요?

바로 hwani:1 이미지와 hwani:2 이미지가 동일하기 때문입니다.

 

따라서 이미지 이름만 달라졌지, 속에 있는 내용은 동일하기 때문에, 서로 같은 layer의 이미지를 공유하고 있는 것입니다.

 

결론은 docker images 했을 때 여러 이미지가 나오면서 용량이 많이 쌓인 것 같아 보이지만,

실제론 그렇지 않다는 것입니다.

 

실제 용량을 확인해보시려면 docker system df 를 하시기 바랍니다!!

반응형