개발자라면 누구나 한 번쯤 겪어봤을 아찔한 순간. "어? 분명히 용량 다 지웠는데 왜 내 하드 드라이브는 아직도 배고프다고 소리치지? 😱" 특히 도커(Docker) 환경에서 수십 기가에 달하는 MySQL 데이터베이스를 다루다 보면 이런 미스터리한 상황과 자주 마주하게 됩니다. 스키마를 `DROP`하고, 볼륨을 삭제하고, `docker system prune` 명령어로 샅샅이 청소해도 로컬 디스크 용량은 요지부동일 때가 많죠. 마치 데이터가 유령처럼 사라지지 않고 남아있는 것만 같습니다. 하지만 걱정 마세요. 이건 버그도, 유령도 아닙니다. 도커의 작동 방식을 이해하면 아주 간단히 해결할 수 있는 문제랍니다. 이 글에서는 그 미스터리를 파헤치고 여러분의 소중한 디스크 공간을 되찾는 방법을 속 시원하게 알려드릴게요!
1. 왜 공간이 돌아오지 않을까? 범인은 바로 '가상 디스크' 🕵️♀️
이 문제의 핵심을 이해하려면 Docker Desktop(Mac, Windows용)이 어떻게 작동하는지 살짝 들여다봐야 합니다. Docker Desktop은 우리 컴퓨터 안에 리눅스 가상 머신(VM)을 만들고, 그 안에서 컨테이너들을 실행해요. 즉, 우리가 만든 MySQL 컨테이너와 그 데이터는 사실 이 가상 머신 안에 저장되는 거죠.
그리고 이 가상 머신은 하나의 거대한 파일로 존재합니다. Mac에서는 `Docker.raw`, Windows의 WSL2 환경에서는 `ext4.vhdx` 라는 이름의 파일이죠. 이걸 '가상 디스크'라고 부를게요.
여기에 마법의 트릭이 숨어있습니다. 이 가상 디스크 파일은 필요에 따라 크기가 자동으로 '커지기'는 하지만, 안의 내용물을 지운다고 해서 자동으로 '작아지지'는 않아요. 🤯
"비유하자면, 계속 늘어나는 고무 풍선 같은 거예요. 바람을 불면(데이터를 쓰면) 커지지만, 바람을 조금 빼도(데이터를 지워도) 풍선 크기는 그대로인 거죠. 누군가 밖에서 꽉 눌러주기 전까지는요."
우리가 `DROP SCHEMA` 명령어로 데이터베이스를 날리면, 가상 디스크 '안'의 파일 시스템은 "오케이, 이 공간은 이제 비었어. 다른 데이터가 들어와도 돼"라고 인식합니다. 하지만 가상 디스크 파일 자체는 "난 한번 이만큼 커졌으니 이 크기를 유지할래"라고 버티는 겁니다. 호스트 OS(우리의 Mac이나 Windows) 입장에서는 이 거대한 파일이 여전히 공간을 차지하고 있는 것으로 보일 수밖에 없죠.

2. 1차 응급처치: `docker system prune` (하지만 이걸로는 부족해요)
도커 용량 문제로 검색하면 가장 먼저 나오는 해결책이 바로 `docker system prune` 입니다. 물론 아주 유용한 명령어죠. 사용하지 않는 컨테이너, 네트워크, 이미지, 그리고 빌드 캐시까지 한 방에 정리해주니까요.
# 사용 중지된 모든 도커 리소스(컨테이너, 네트워크, 이미지)와 빌드 캐시를 삭제합니다.
docker system prune -a
# 위 명령어에 더해, 컨테이너가 사용하지 않는 '볼륨'까지 모두 삭제합니다.
# 주의: 중요한 데이터가 담긴 볼륨이 삭제될 수 있으니 신중하게 사용해야 합니다.
docker system prune -a --volumes
이 명령어를 실행하면 어느 정도 용량을 확보할 수 있습니다. 하지만 우리가 마주한 '대용량 DB 삭제 후 용량 미확보' 문제의 근본적인 해결책은 아닙니다. 왜냐하면 `prune` 명령어는 도커 '내부'의 쓰레기들을 청소하는 역할만 할 뿐, 한번 커져 버린 가상 디스크 '외부'의 크기를 줄여주지는 못하기 때문이죠.
핵심 포인트
docker system prune
은 집 안(VM) 청소, 우리가 해야 할 일은 집(가상 디스크 파일) 자체의 크기를 줄이는 것입니다.
3. 진짜 해결책: 가상 디스크 다이어트 시키기 (Mac & Windows) 💪
자, 이제 본론입니다. 빵빵하게 부풀어 오른 가상 디스크의 군살을 빼줄 시간입니다. 이 과정은 운영체제에 따라 조금 다릅니다. 사용하고 있는 환경에 맞춰 따라 해보세요.
🍎 Mac 사용자
Mac 환경에서는 도커 VM 내부에 직접 접속해서 "이봐, 여기 빈 공간이야!"라고 알려주는 `TRIM` 명령을 내리는 방식으로 진행됩니다. 예전에는 과정이 꽤 복잡했지만, 요즘은 Docker Desktop에 내장된 기능이나 간단한 명령어로 해결할 수 있습니다.
방법 1: Docker Desktop GUI 활용하기 (가장 쉬움)
최신 버전의 Docker Desktop을 사용하신다면 가장 먼저 확인해볼 방법입니다.
- Docker Desktop을 실행하고, 상단 메뉴바의 Docker 아이콘을 클릭하세요.
- Settings (설정) > Resources (리소스) 메뉴로 이동합니다.
- 'Disk image size' 항목 근처에 'Compact' 또는 'Reclaim space' 와 같은 버튼이 있는지 찾아보세요.
- 버튼이 있다면 클릭! 도커가 알아서 가상 디스크를 최적화해줍니다.
방법 2: 터미널 명령어로 직접 TRIM 실행하기
GUI에 해당 기능이 없거나, 터미널 작업이 더 편한 분들을 위한 방법입니다. 도커가 제공하는 특수 컨테이너를 이용해 VM 내부에서 `fstrim` 명령어를 실행하는 원리입니다.
터미널을 열고 아래 명령어를 입력하세요.
# 1. 특수 권한을 가진 컨테이너를 실행하여 Docker VM의 네임스페이스로 진입합니다.
docker run --rm -it --privileged --pid=host justincormack/nsenter1 /bin/sh
# --- 이제 컨테이너 내부 쉘에 들어왔습니다. ---
# 2. 파일 시스템의 빈 공간을 정리하라는 TRIM 명령을 내립니다.
# /var/lib/docker 는 도커의 기본 데이터 경로입니다.
fstrim -v /var/lib/docker
# 3. 작업이 완료되면 'exit'를 입력하여 컨테이너를 빠져나옵니다.
exit
`fstrim` 명령이 실행되면, 정리된 용량 정보가 출력될 겁니다. 이 과정이 끝나면 Finder에서 `~/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw` 파일의 크기가 줄어든 것을 확인할 수 있을 거예요. 🎉
🖥️ Windows (WSL2) 사용자
Windows 환경의 Docker Desktop은 WSL2(Windows Subsystem for Linux 2)를 기반으로 동작합니다. 따라서 우리는 WSL2의 가상 디스크(`ext4.vhdx`)를 최적화해주어야 합니다.
먼저, PowerShell을 관리자 권한으로 실행해주세요. (시작 메뉴에서 PowerShell 검색 후 마우스 오른쪽 클릭 > 관리자 권한으로 실행)
1단계: WSL 완전히 종료하기
가상 디스크 파일을 조작하기 전에, WSL이 해당 파일을 사용하지 않도록 완전히 종료해야 합니다. Docker Desktop도 함께 종료하는 것이 안전합니다.
wsl --shutdown
2단계: 가상 디스크 파일 경로 찾기
일반적으로 경로는 아래와 같습니다. 하지만 사용자마다 다를 수 있으니 파일 탐색기에서 직접 확인해보는 것이 좋습니다.
%USERPROFILE%\AppData\Local\Docker\wsl\data\ext4.vhdx
예시: C:\Users\Gardenee\AppData\Local\Docker\wsl\data\ext4.vhdx

3단계: 가상 디스크 최적화 실행하기
두 가지 방법이 있지만, 최신 Windows에서는 `Optimize-VHD`를 사용하는 것이 더 간편하고 강력합니다.
방법 A: `Optimize-VHD` 사용 (권장)
# 'YOUR_USER_NAME' 부분은 실제 사용자 이름으로 바꿔주세요.
Optimize-VHD -Path "C:\Users\YOUR_USER_NAME\AppData\Local\Docker\wsl\data\ext4.vhdx" -Mode Full
이 명령을 실행하면 최적화 과정이 진행됩니다. 파일 크기에 따라 몇 분 정도 소요될 수 있어요. 완료되면 별다른 메시지 없이 프롬프트가 다시 나타납니다.
방법 B: `diskpart` 사용 (고전적인 방법)
`Optimize-VHD` 명령이 없는 구버전 Windows라면 `diskpart`를 사용할 수 있습니다.
# diskpart 실행
diskpart
# --- 이제 diskpart 프롬프트에 들어왔습니다. ---
# 1. 가상 디스크 파일을 선택합니다. 경로를 꼭 확인하세요.
select vdisk file="C:\Users\YOUR_USER_NAME\AppData\Local\Docker\wsl\data\ext4.vhdx"
# 2. 읽기 전용으로 디스크를 연결합니다.
attach vdisk readonly
# 3. 디스크 압축(최적화)을 실행합니다.
compact vdisk
# 4. 디스크 연결을 해제합니다.
detach vdisk
# 5. diskpart 종료
exit
모든 과정이 끝나면 Docker Desktop을 다시 실행하세요. 파일 탐색기에서 `ext4.vhdx` 파일의 크기가 확 줄어든 것을 보며 짜릿한 쾌감을 느낄 수 있을 겁니다! 😉
4. 미래를 위한 예방: 똑똑한 도커 용량 관리 습관 💡
문제가 터진 뒤에 해결하는 것도 중요하지만, 미리 예방하는 습관을 들이면 더욱 좋겠죠? 몇 가지 팁을 드릴게요.
- 정기적인 `prune`: 앞서 `prune`만으로는 부족하다고 했지만, 그렇다고 중요하지 않은 건 아니에요. 주기적으로 `docker system prune`을 실행해서 불필요한 도커 리소스가 쌓이는 것을 막아주세요.
- Bind Mounts 활용 고려: 아주 크고 임시적인 데이터를 다룰 때는 도커 볼륨 대신 바인드 마운트(Bind Mounts)를 사용하는 것도 방법입니다. 바인드 마운트는 호스트의 파일 시스템에 직접 데이터를 저장하므로, 호스트에서 파일을 지우면 바로 용량이 확보되는 장점이 있습니다. (물론 이식성과 관리 측면에서는 볼륨이 더 우수하니 상황에 맞게 선택해야 합니다.)
- 멀티스테이지 빌드(Multi-stage builds): 도커 이미지를 만들 때, 최종 이미지에는 빌드에만 필요했던 라이브러리나 도구들이 포함되지 않도록 멀티스테이지 빌드를 활용하세요. 작고 깨끗한 이미지는 용량 절약의 기본입니다.
- 주기적인 디스크 최적화: 특히 대용량 데이터를 자주 다루는 환경이라면, 오늘 배운 가상 디스크 최적화 작업을 주기적으로(예: 한 달에 한 번) 실행해주는 것도 좋은 습관입니다.
마무리: 이제 당신은 도커 용량 마스터! 🥳
도커의 '유령 용량' 미스터리는 이제 풀렸습니다. 핵심은 "컨테이너 내부의 데이터 삭제와 가상 디스크 파일 자체의 축소는 별개의 작업이다"라는 것이죠. 이제 여러분은 왜 용량이 줄지 않았는지, 그리고 어떻게 해야 진짜로 공간을 되찾을 수 있는지 명확히 알게 되었습니다.
오늘 배운 내용을 잘 기억해두셨다가 다음에 비슷한 상황이 닥치면 당황하지 말고, 커피 한 잔의 여유와 함께 우아하게 문제를 해결해보세요. 더 이상 갑작스러운 '디스크 공간 부족' 경고에 스트레스받지 않는, 한 단계 더 성장한 개발자가 되신 것을 축하합니다! 🚀