Docker 빌드 후 남아 있는 중간 레이어 또는 대용량 파일은 삭제해도 될까요?

Docker 이미지에 LLM 모델들을 포함해서 하나의 이미지로 만들고 있습니다.
그 결과 최종 이미지 크기가 꽤 커졌는데요..

$ docker images
REPOSITORY                                      TAG        IMAGE ID       CREATED          SIZE
custom-ollama-custom-vision-llava250314-e1x-c   latest     2a51a22d7005   18 minutes ago   17.6GB

이미지는 .gguf 파일을 기반으로 변환해 만들었고 그 파일들도 용량이 큽니다.
그런데 시스템 디스크 용량이 부족해져서 아래 명령어로 1GB 이상 파일을 찾아봤습니다.

$ sudo find / -type f -size +1G -exec ls -lh {} \; 2>/dev/null | sort -k 5 -rh | head -20

그 결과, 다음과 같은 파일들이 발견되었습니다:

-rw-r--r-- 1 root root 13G /var/lib/docker/overlay2/.../diff/root/.ollama/models/blobs/sha256-...
-rw-r--r-- 1 root root 13G /var/lib/docker/overlay2/.../diff/temp_model_data/llava-v1.6-...

이 파일들이 여러 개 (13GB) 존재하며, 전체 용량은 최종 Docker 이미지보다도 큽니다.
아래에 질문 3개 남겨드립니다.

질문 1
이 파일들은 정확히 뭘까요?
이미지 빌드 과정에서 생성된 임시 파일일까요, 아니면 Docker 이미지의 일부로 남아 있는 건가요?

질문 2
이미 docker system prune 명령으로 Docker의 캐시와 불필요한 리소스는 모두 정리한 상태입니다.
현재 보유한 Docker 이미지는 다음과 같습니다:

$ docker images
REPOSITORY                                      TAG        IMAGE ID       CREATED          SIZE
custom-ollama-custom-vision-llava250314-e1x-c   latest     2a51a22d7005   30 minutes ago   17.6GB
redis                                           7-alpine   7d06252fad43   8 months ago     41.2MB

임시 이미지나 중간 이미지도 따로 없습니다.

질문 3
위에 나열된 13GB 파일들을 안전하게 삭제해도 괜찮을까요?
Docker가 자동으로 관리하지 않는 잔재들이라면 수동으로 지워야 할 것 같은데, 확신이 없어서 질문드립니다…

1 Like

Docker의 layer(레이어) 개념을 이해하려면 공식 문서를 참고하는 것이 좋습니다.
간단히 말하면, Docker 이미지에는 빌드 단계에서 생성된 컨테이너 파일 시스템의 스냅샷들이 계층 구조로 쌓이게 됩니다.

예를 들어, 아래와 같은 Dockerfile이 있다고 가정해볼 수 있습니다:

FROM python

RUN wget llama_initial_weights

RUN python3 cleanup.py llama_initial_weights llama_cleaned_weights
RUN python3 transform.py llama_cleaned_weights llama_transformed_weights

RUN rm llama_cleaned_weights
RUN rm llama_initial_weights

Docker에서는 RUN 명령어 하나하나가 별도의 불변(immutable) 레이어를 생성합니다.
즉, rm 명령어를 실행하더라도, 해당 파일은 이전 레이어에 그대로 남아 있게 됩니다.
예를 들어, llama_initial_weights 파일은 rm을 실행한 이후에도, 중간 레이어 어딘가에는 여전히 존재하는 것이죠.

이러한 중간 레이어를 줄이기 위해 --squash 옵션을 사용할 수 있습니다.
또한, 댓글에서도 언급되었듯이 docker system prune 명령은 사용되지 않는 이미지나 캐시들을 정리하는 데 도움이 됩니다.

Dockerfile을 약간 덜 깔끔하게 보이게 하더라도, 레이어를 줄이기 위해 아래처럼 작성하는 방법도 있습니다:

FROM python

RUN wget llama_initial_weights \
    && python3 cleanup.py llama_initial_weights llama_cleaned_weights \
    && python3 transform.py llama_cleaned_weights llama_transformed_weights \
    && rm llama_cleaned_weights \
    && rm llama_initial_weights

이렇게 하면 RUN 명령어가 한 번만 실행되므로, 하나의 레이어만 생성되어 불필요한 파일이 남지 않게 됩니다.