본문 바로가기
Server/Docker

[Docker]비정상적인 디스크 사용량 원인과 해결 (.dockerignore 설정)

by 리요_ 2025. 5. 23.
반응형

[Docker]비정상적인 디스크 사용량 원인과 해결 (.dockerignore 설정)

 

⭐ 비정상적인 디스크 사용량 원인 분석

(이전 게시글에서 "Unable to caclulate image disk size" 오류 해결 과정에 대한 내용을 다루었다는 가정을 바탕으로 이어지는 내용입니다.)

 

2025.05.22 - [Server/Docker] - [Docker] Unable to calculate image disk size 오류 해결

 

[Docker] Unable to calculate image disk size 오류 해결

⭐ 오류 내역도커로 운영 중인 서버가 어느 순간부터 응답이 느려지더니 Unable to calculate image disk size 경고 문구와 함께 서버가 강제 종료되었습니다.⭐ 오류 설명 : Docker on Window (WSL2) 환경에서의

li-yo.tistory.com

 

 

이전 게시글에서 해결한 Unable to calculate image disk size 오류를 해결했지만 여전히 서버 컴퓨터의 400GB 디스크 공간 중 300GB 이상이 설명할 수 없게 사용되고 있었습니다.

docker system df -v 명령으로 확인한 Docker 이미지, 컨테이너, 볼륨, 캐시 사용량은 합쳐봐야 5GB 수준이었기 때문입니다.

 

이 비정상적인 공간 사용량의 원인이 Docker DesktopWSL2 환경에서 사용하는 가상 디스크 파일(.vhdx)의 크기가 비대해졌기 때문이라는 것을 파악했고, Diskpart를 이용한 압축으로 파일 크기를 줄일 수 있다는 것도 알게 되었습니다.

 

하지만 여전히 왜 .vhdx 파일이 그토록 커졌는지 그리고 어떤 데이터가 그 공간을 차지하고 있는지 명확하지 않습니다.

 

가장 유력한 용의자는 로그 파일이었습니다.제가 운영하는 서비스 중 일부는 실시간 데이터를 초당으로 처리하기 때문에 상당한 양의 로그를 생성합니다.특정 서비스 하나의 한 달 로그 파일 크기가 80GB를 넘어가는 상황이었습니다.윈도우 호스트의 특정 폴더 (해당 프로젝트의 로그 파일 경로)에 로그를 저장하고 한 달이 지난 파일은 삭제되도록 처리되고 있었지만, 해당 로그 데이터가 Docker 환경 내부에도 쌓이고 있는 것으로 추정됩니다.


⭐ Docker 디스크 공간 확보 및 해결 절차

로그 파일 누적 가설을 증명하고 비정상적으로 사용된 디스크 공간을 확보하기 위해 가장 많은 로그를 생성하는 컨테이너와 관련된 데이터를 삭제하고 WSL2 .vhdx 파일의 크기가 어떻게 변하는지 확인하는 절차를 진행합니다.

 

이 과정은 해당 컨테이너와 관련된 데이터(로그 포함)를 전부 삭제하므로 필요한 데이터가 있다면 미리 백업해야 합니다.

💫 1. 컨테이너 이름/ID 확인

[Docker]비정상적인 디스크 사용량 원인과 해결 (.dockerignore 설정)

> docker ps -a

관리자 권한 명령프롬프트 혹은 PowerShell 에서 해당 명령어를 입력하여 현재 실행 중인 컨테이너 이름을 확인합니다.

저는 liyo 서비스를 종료하고 관련 데이터를 삭제하려 합니다.

💫 2. 컨테이너 삭제 및 사용되지 않는 Docker 리소스 정리 (강력)

[Docker]비정상적인 디스크 사용량 원인과 해결 (.dockerignore 설정)

> docker stop liyo

 

컨테이너를 삭제하기 위해서는 먼저 중지되어야 합니다. 컨테이너가 이미 중지된 상태라면 이 명령어는 생략합니다.

> docker rm liyo

중지된 컨테이너를 삭제합니다.

이 명령은 해당 컨테이너의 쓰기 가능한 레이어를 삭제합니다.

여기에 로그가 쌓였다면 컨테이너가 삭제되면서 해당 로그 데이터 공간이 해제됩니다.(WSL2 내부에서)

> docker system prune -a --volumes
> y[입력]

컨테이너 삭제 후 삭제된 컨테이너가 사용하던 이미지 레이어나 다른 불필요한 리소스들을 정리합니다.

 

해당 명령어 결과로 114MB 만 삭제된 것을 보면 불필요한 캐시파일의 크기는 크지 않았습니다.

💫 3. WSL 환경 종료

Docker 내부에서 공간을 정리했으니 WSL2 .vhdx 파일이 그 공간을 Windows 호스트에 반환활 수 있도록 WSL 환경을 완전히 종료해야 합니다.

> wsl --shutdown

💫 4. WSL2 가상 디스크 파일(.vhdx) 압축(Compact)

WSL 환경 내부에서 확보된 공간을 .vdhx 파일 자체의 크기를 줄여서 Windows드라이브에 반영하는 단계입니다.

ext4.vhdx 파일의 경로를 알고 있어야 하며 경로를 알지 못하는 경우 이전 게시글에 상세히 설명되어 있으니 참고 바랍니다.

> diskpart
> select vdisk file="C:\Users\liyo\AppData\Local\Docker\wsl\data\ext4.vhdx"
> attach vdisk readonly
> compact vdisk
> detach vdisk
> exit

관리자 권한명령 프롬프트/PowerShell에서 diskpart를 입력하여 위 명령어를 순서대로 입력합니다.

 

[Docker]비정상적인 디스크 사용량 원인과 해결 (.dockerignore 설정)

ext4.vdhx 의 디스크 크기가 기존 300GB에서 65GB로 줄어든 것을 확인하였습니다.

한 개의 컨테이너만 정리했을 뿐인데 200GB 넘게 정리되었습니다.

다른 서비스들도 정리하고 나면 10GB 내외까지 정리될 것으로 보입니다.


⭐ Docker 디스크 용량이 늘어난 원인 (WSL2 .vhdx 파일 용량이 커진 이유)

문제의 원인은 Dockerfile의 설정과 빌드 과정에 있었습니다.

[Docker]비정상적인 디스크 사용량 원인과 해결 (.dockerignore 설정)
docker-compose.yml

Docker Copmse 파일에 있는 volumes: - "./log:/opt/app/log" 설정은 컨테이너가 실행 중일 때 애플리케이션이 /opt/app/log 경로에 로그를 쓰면 그 데이터가 WSL2 .vhdx 파일 내부가 아닌 윈도우 호스트의 지정된 폴더(로그 파일 저장 경로)에 바로 저장되도록 연결하는 역할을 합니다. 

 

이 설정 자체는 컨테이너 실행 중에 새로 생성되는 로그가 .vhdx 파일에 쌓이는 것을 막아줍니다.

[Docker]비정상적인 디스크 사용량 원인과 해결 (.dockerignore 설정)
Dockerfile

문제는 Dockerfile 의 빌드 과정에 있었습니다. COPY . /build 명령이 포함되어 있기 때문입니다.

이 명령어는 이미지를 빌드할 때 윈도우 호스트의 프로젝트 폴더 전체를 컨테이너 내부의 /build 경로로 복사합니다.

이때 윈도우 호스트의 프로젝트 폴더에 이미 쌓여있던 과거 로그 파일들까지 COPY . 명령에 의해 이미지 레이어에 함께 포함된 것입니다.

 

이렇게 이미지 자체에 포함된 데이터는 컨테이너를 실행할 때 기본적인 파일 시스템의 일부가 되어 WSL2 .vhdx 파일 공간을 차지하게 됩니다.

Docker Compse의 바인드 마운트 설정은 컨테이너 실행 시점부터 적용되는 반면, COPY 명령은 이미지를 만드는 시점에 파일을 포함시킵니다.

 

따라서 빌드 시점에 이미지에 포함되어 버린 과거 로그 데이터는 바인드 마운트 설정으로 인해 자동으로 삭제되거나 윈도우 호스트로 이동하지 않고 .vhdx 파일 안에 그대로 남아 불필요하게 용량을 차지하게 됩니다.


⭐ 최종 해결 : .dockerignore 파일 설정

문제를 근복적으로 해결하고 빌드 시 로그 파일이 이미지에 포함되지 않도록 하기 위해 .dockerignore 파일을 사용해 줍니다.

💫 1. ./dockerignore 파일 생성

[Docker]비정상적인 디스크 사용량 원인과 해결 (.dockerignore 설정)

Dockerfile 이 있는 프로젝트 루트폴더에 ./dockerignore 파일을 생성합니다.

 

파일 내용은 아래와 같이 log/ 폴더를 제외하는 규칙을 추가합니다.

# 로그 폴더를 이미지에 포함하지 않도록 제외합니다.
log/

이 규칙은 COPY . /build 명령 실행 시 프로젝트 루트 아래의 log 폴더와 그 안의 모든 내용을 복사 대상에서 제외하도록 합니다.

 

이제 .dockerignore 파일이 적용된 상태로 이미지를 새로 빌드하고 기존 컨테이너와 관련 데이터를 정리한 후 새로운 컨테이너를 실행하면, 빌드 시 로그 파일 포함 문제가 해결되고 컨테이너 실행 중 생성되는 로그는 바인드 마운트 설정을 통해 윈도우 호스트에만 저장되어 .vhdx 파일이 불필요하게 커지는 것을 막을 수 있습니다.


⭐ 결론

"Unable to calculate image disk size" 오류 해결 과정에서 발견된 비정상적인 Docker 디스크 사용량의 주된 원인은 WSL2의 .vhdx 파일에 필드 시 실수로 포함된 대용량의 과거 로그 데이터 때문이었습니다.

 

Docker Compse의 바인드 마운트 설정은 실행 중 로그를 윈도우에 저장하지만, DockerfileCOPY 명령으로 이미지 자체에 포함된 데이터까지는 관리하지 못한다는 점을 알게 되었습니다.

 

.dockerignore 파일을 사용하여 빌드 시 특정 폴더(로그 폴더)를 제외하고, 불필요하게 커진 .vhdx 파일은 Diskpart 압축을 통해 정리하여 문제를 해결할 수 있습니다.

Windows 환경에서 Docker를 사용하며 디스크 공간 문제가 발생한다면, docker system df -v 로 Docker 내부 사용량을 확인하고,.vhdx 파일의 실제 크기와 비교하여 .vhdx 파일이 비정상적으로 크다면, Diskpart 압축을 시도하고,Dockerfile의 COPY 명령과 .dockerignore 파일을 점검하여 불필요한 파일이 이미지에 포함되고 있지 않은지 확인하여 문제를 해결할 수 있습니다.
반응형