윈도우 환경에서 도커를 사용하며 컨테이너와 이미지를 관리하다 보면, 어느새 눈에 띄게 늘어난 디스크 사용량에 당황하신 경험이 있으실 것입니다. 특히 가상 디스크 파일(.vhdx)은 시간이 지날수록 용량이 비대해져 시스템의 전반적인 성능 저하를 유발하기도 합니다. 이러한 문제는 개발 환경의 효율성을 떨어뜨릴 뿐만 아니라, 중요한 데이터를 저장할 공간마저 부족하게 만들어 스트레스를 안겨줍니다. 😥 하지만 걱정하지 마세요! 이 글을 통해 도커 가상 디스크 용량을 효과적으로 줄이고 쾌적한 개발 환경을 되찾는 구체적인 방법들을 단계별로 알아보겠습니다.
도커 가상 디스크, 왜 이렇게 커지는 걸까요? 🤔
도커는 컨테이너를 실행하고 관리하기 위해 자체적인 가상화 기술을 사용합니다. 윈도우 환경에서는 주로 WSL 2 (Windows Subsystem for Linux 2) 기반으로 동작하며, 이때 컨테이너 이미지, 볼륨, 로그 파일 등이 가상 디스크 파일(예: `ext4.vhdx`) 안에 저장됩니다.
가상 디스크의 용량이 늘어나는 주된 이유는 다음과 같습니다.
- 사용하지 않는 이미지 및 컨테이너: 불필요하게 쌓인 도커 이미지, 중지된 컨테이너, 빌드 캐시 등이 공간을 차지합니다.
- 볼륨 데이터: 컨테이너가 데이터를 영구적으로 저장하는 볼륨에 많은 데이터가 누적될 수 있습니다.
- 로그 파일: 컨테이너에서 생성되는 로그가 제대로 관리되지 않으면 용량이 커질 수 있습니다.
- 자동 확장: 도커는 기본적으로 가상 디스크를 동적으로 확장하지만, 축소 기능은 제한적입니다.
도커는 가상 디스크 용량을 자동으로 관리하는 데 한계가 있기 때문에, 주기적인 수동 관리가 필수적입니다. 이를 통해 시스템 자원을 효율적으로 사용할 수 있습니다.
불필요한 도커 객체 정리하기 🧹
가장 먼저 시도해 볼 수 있는 방법은 사용하지 않는 도커 이미지, 컨테이너, 네트워크, 볼륨 등을 정리하는 것입니다. 이러한 불필요한 객체들은 가상 디스크의 용량을 불필요하게 차지하고 있습니다.
1. 사용하지 않는 컨테이너, 이미지, 볼륨, 네트워크 삭제
이 모든 것을 한 번에 정리하는 가장 쉬운 명령어는 `docker system prune` 입니다. 이 명령어는 중지된 모든 컨테이너, 사용되지 않는 모든 네트워크, 빌드 캐시, 그리고 어떤 컨테이너에도 연결되지 않은 모든 이미지를 삭제합니다.
시스템 전체 정리 명령어
docker system prune -a --volumes
설명:
-a
(또는--all
): 현재 실행 중이지 않은 모든 이미지(dangling 이미지뿐만 아니라 사용되지 않는 모든 이미지)를 삭제합니다.--volumes
: 어떤 컨테이너에도 연결되지 않은 모든 볼륨을 삭제합니다. 이 옵션을 사용할 때는 주의가 필요합니다.
만약 특정 컨테이너만 삭제하고 싶다면, 먼저 컨테이너 ID 또는 이름을 확인한 후 `docker rm [컨테이너 ID 또는 이름]` 명령어를 사용하면 됩니다. 마찬가지로 이미지도 `docker rmi [이미지 ID 또는 이름]`으로 삭제할 수 있습니다.
2. 빌드 캐시 정리
도커 이미지를 빌드할 때 생성되는 캐시는 디스크 공간을 많이 차지할 수 있습니다. 빌드 캐시를 정리하려면 다음 명령어를 사용하세요.
빌드 캐시 정리 명령어
docker builder prune
설명: 이 명령어는 빌드 시 사용되지 않는 빌드 캐시 데이터를 정리하여 공간을 확보합니다.
`docker system prune --volumes` 명령어를 사용할 때는 해당 볼륨에 저장된 데이터가 영구적으로 삭제되므로, 중요한 데이터가 있다면 미리 백업해야 합니다.
WSL 2 가상 디스크 직접 관리하기 🛠️
위에서 설명한 도커 객체 정리만으로는 가상 디스크 파일(.vhdx) 자체의 크기가 줄어들지 않을 수 있습니다. 이는 삭제된 데이터의 공간이 가상 디스크 내부에 '빈 공간'으로 남아있을 뿐, 파일 크기는 그대로이기 때문입니다. 이럴 때는 WSL 2 가상 디스크의 용량을 직접 관리해야 합니다.
1. WSL 2 종료
가상 디스크를 정리하기 전에 WSL 2 환경이 완전히 종료되어야 합니다. 명령 프롬프트(cmd) 또는 PowerShell을 열어 다음 명령어를 실행합니다.
WSL 2 종료 명령어
wsl --shutdown
설명: 이 명령은 실행 중인 모든 WSL 2 배포판을 강제로 종료시킵니다.
2. 가상 디스크 최적화 (Compact)
WSL 2 가상 디스크는 VHDX(Virtual Hard Disk) 형식으로 저장됩니다. VHDX 파일은 동적으로 확장되지만, 축소 기능은 명시적으로 수행해야 합니다. 이를 위해 `Optimize-VHD` PowerShell cmdlet을 사용할 수 있습니다.
먼저, WSL 2 가상 디스크 파일의 위치를 찾아야 합니다. 기본적으로 이 파일은 사용자 프로필 폴더 안에 저장됩니다.
%USERPROFILE%\AppData\Local\Packages
경로를 탐색하여 도커 관련 패키지 폴더(예: CanonicalGroupLimited.UbuntuonWindows_...
) 내부의 LocalState
폴더에서 `ext4.vhdx` 파일을 찾을 수 있습니다.
가상 디스크 파일의 정확한 위치를 확인했다면, PowerShell을 관리자 권한으로 실행하고 다음 명령어를 사용하여 최적화를 진행합니다.
VHDX 최적화 명령어
Optimize-VHD -Path "C:\경로\to\your\ext4.vhdx" -Mode Full
설명:
-Path
: 최적화할 VHDX 파일의 전체 경로를 지정합니다.-Mode Full
: 디스크의 모든 빈 공간을 제거하여 용량을 최대한 줄입니다. 이 과정은 시간이 다소 소요될 수 있습니다.
3. VHDX 파일 크기 조정 (Shrink)
Optimize-VHD
명령어는 내부적인 빈 공간을 정리하는 데 효과적이지만, 파일 크기 자체를 줄이기 위해서는 추가적인 작업이 필요할 수 있습니다. 하지만 Optimize-VHD -Mode Full
옵션이 실제로 VHDX 파일의 크기를 줄여주므로, 이 명령어만으로도 충분한 경우가 많습니다.
VHDX 파일 경로를 잘못 지정하거나, WSL 2가 실행 중인 상태에서 이 명령을 실행하면 데이터 손실이나 시스템 오류가 발생할 수 있습니다. 반드시 WSL 2를 종료하고 정확한 경로를 확인한 후 관리자 권한으로 PowerShell을 실행해야 합니다.
또한, Optimize-VHD
는 Windows 10 버전 2004 (20H1) 이상에서 지원됩니다. 이전 버전의 윈도우를 사용 중이라면 다른 방법을 고려해야 할 수 있습니다.
4. WSL 2 가상 디스크 재연결 (필요시)
일부 경우에는 최적화 후에도 변경 사항이 바로 적용되지 않거나, 특정 문제가 발생할 수 있습니다. 이럴 때 가상 디스크 파일을 제거하고 다시 연결하는 방법을 시도해 볼 수 있으나, 이는 다소 복잡하고 위험 부담이 따르므로 최후의 수단으로 고려해야 합니다.
자동화를 통한 용량 관리 🚀
매번 수동으로 용량을 정리하는 것이 번거롭다면, 스크립트를 활용하여 자동화하는 방법을 고려해 볼 수 있습니다. 예를 들어, 주기적으로 `docker system prune` 명령어를 실행하는 배치 파일이나 PowerShell 스크립트를 작성하여 예약 작업으로 등록해두면 편리합니다.
하지만 WSL 2 가상 디스크 최적화(`Optimize-VHD`)는 시스템 종료 및 관리자 권한 실행이 필요하므로 완전한 자동화에는 제약이 따릅니다. 대신, 사용자가 원할 때 쉽게 실행할 수 있도록 스크립트 형태로 만들어두는 것이 좋습니다.