도커 Images size total은 실제 용량과 같을까?
https://hwan-shell.tistory.com/370
도커에서는 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 를 하시기 바랍니다!!