반응형

Docker를 쓰다 보면 어느 순간 맥의 저장 공간을 몽땅 잡아먹는 Docker.raw 파일을 보게 됩니다. 이미지/컨테이너/볼륨을 지워도 용량이 줄지 않는 이유, 그리고 실제로 용량을 줄이는 방법을 정리했습니다. Postgres를 쓰는 분들을 위한 체크리스트도 포함했어요.


TL;DR

  • macOS의 Docker Desktop은 모든 데이터를 하나의 디스크 이미지(Docker.raw)에 저장합니다.
  • 이미지/컨테이너/볼륨을 지워도 파일 자체 크기는 자동으로 줄지 않습니다.
  • 공간을 줄이는 확실한 방법은 Reclaim(공간 회수) 를 실행하거나 디스크 이미지를 재생성하는 것입니다.
  • DB(특히 Postgres) 데이터는 호스트 디렉토리로 분리 마운트하면 Docker.raw가 비대해지는 것을 막을 수 있습니다.

1) 왜 Docker.raw가 이렇게 커질까?

  • 단일 디스크 이미지 구조: Docker Desktop은 내부 리눅스 VM의 /var/lib/docker 전체를 Docker.raw 한 파일에 담습니다. (이미지, 컨테이너, 볼륨 포함)
  • 희소 파일(Sparse): 처음에는 크게 보이지만 실제 사용량은 적을 수 있습니다. 다만 사용이 늘면 실제 디스크도 커집니다.
  • 자동 축소 없음: 리소스를 삭제해도 파일 자체가 줄어들지 않습니다. 내부적으로 빈 블록으로만 표시됩니다.
  • DB/로그의 누적: Postgres 같은 DB 컨테이너의 데이터, WAL 로그, 애플리케이션 로그가 용량 폭증의 주범입니다.

 

실제 사용중인 테스트용 docker 이미지 파일 용량 228g

 


2) 현재 상태 진단

# (A) 파일의 ‘겉보기’ 크기
ls -lh ~/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw

# (B) 실제 디스크 사용량
du -sh ~/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw

# (C) Docker 리소스별 사용량
docker system df
docker system df -v     # 상세

docker volume ls        # 로컬 볼륨 목록

# (D) (Postgres 예) 컨테이너 내부 실제 DB 데이터 크기
docker exec -it <postgres-container-id> du -sh /var/lib/postgresql/data

심볼릭 링크 주의: Docker.raw를 외장 디스크로 옮긴 뒤 링크만 남겼다면, 링크가 아니라 실제 대상 파일 경로에서 du -sh로 확인하세요. (예: /Volumes/External/DockerData/Docker.raw)


3) 공간 줄이는 방법 (권장 순서)

A. Reclaim: Docker Desktop 제공 공간 회수

데이터는 보존하면서, Docker.raw 내의 유휴 블록을 정리합니다.

docker run --privileged --pid=host docker/desktop-reclaim-space
# Apple Silicon에서 경고가 거슬리면 플랫폼 지정
# docker run --privileged --pid=host --platform=linux/amd64 docker/desktop-reclaim-space

실행 후 다시 확인:

du -sh /경로/…/Docker.raw

실제 사례: Reclaim 한 번으로 수백 GB → 수 GB까지 줄어드는 경우가 흔합니다.

실제 명령어 실행 후, 6.3g 로 줄어든 이미지 용량


B. 디스크 이미지 재생성 (가장 확실, 단 데이터 초기화)

모든 Docker 데이터(이미지/컨테이너/볼륨)를 날리고 새로 시작합니다.

1) Docker 종료 (메뉴바 아이콘 → Quit Docker)
2) Docker.raw 삭제

rm ~/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw
# 외장 디스크로 옮겨 링크 중이라면, 실제 대상 파일을 삭제
# rm /Volumes/External/DockerData/Docker.raw

3) Docker 재실행 (open -a Docker) → 새 Docker.raw 자동 생성
4) 필요 이미지/컨테이너 재배포

주의: 완전 초기화입니다. 필요한 데이터는 백업(pg_dump, docker save, 파일 복사 등) 후 진행하세요.


C. DB 데이터는 호스트 디렉토리로 분리 (재발 방지)

DB 데이터를 Docker.raw 바깥(외장 SSD 등)에 저장하면 비대화 방지에 효과적입니다.

# docker-compose.yml (예: Postgres)
services:
  db:
    image: postgres:15
    environment:
      - POSTGRES_PASSWORD=yourpw
    volumes:
      - /Volumes/External/PostgresData:/var/lib/postgresql/data  # ← 호스트 경로 바인드
    ports:
      - "5432:5432"
  • 장점: DB 용량이 늘어도 Docker.raw는 그대로.
  • 팁: 외장 디스크를 쓴다면 항상 마운트 경로가 동일해야 합니다.

4) (중요) Postgres 용량 다이어트 체크리스트

Postgres를 쓰면 Docker.raw가 급격히 커지는 일이 많습니다.

    • VACUUM / VACUUM FULL

VACUUM FULL은 테이블 잠금을 수반합니다. 다운타임이 부담스럽다면 pg_repack 등 대안 검토.

  •  
  • VACUUM (VERBOSE); -- 테이블/DB 폭증 시 잠깐 서비스 중단 허용 가능하면 VACUUM FULL;
  • WAL 관리
    • CHECKPOINT; 실행으로 불필요 WAL 처리 가속
    • 아카이빙/보관 정책 점검 (archive_mode, archive_command)
  • Autovacuum 튜닝
    • 대량 UPDATE/DELETE가 많은 테이블은 autovacuum 파라미터 조정 검토
  • 로그/임시파일
    • 장기 보관 로그/임시파일이 볼륨을 잠식하는지 확인

정리 후에도 Docker.raw는 자동 축소되지 않으므로, A(Reclaim) 또는 B(재생성) 으로 실제 파일 크기를 줄여야 합니다.


5) 외장 디스크로 Docker.raw 옮기기 (선택)

내장 SSD 부담을 줄이고 싶다면:

# 0) Docker 종료 (Quit Docker)
# 1) 새 위치 준비
mkdir -p /Volumes/External/DockerData
# 2) 파일 이동
mv ~/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw \
   /Volumes/External/DockerData/
# 3) 심볼릭 링크 생성
ln -s /Volumes/External/DockerData/Docker.raw \
      ~/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw
# 4) Docker 재실행

이후부터는 외장 디스크 용량만 소모됩니다. du -sh실제 파일 경로에서 확인하세요.


6) 자주 묻는 질문(FAQ)

  • Q. WARNING: platform amd64 != host arm64 경고가 떠요.
    A. Apple Silicon 맥에서 reclaim 이미지를 쓸 때 나는 일반적인 경고입니다. 기능엔 문제 없습니다. 조용히 돌리고 싶으면 --platform=linux/amd64를 지정하세요.
  • Q. Docker.raw 기본 위치는 어디인가요?
    A. ~/Library/Containers/com.docker.docker/Data/vms/0/data/Docker.raw (구버전은 Docker.qcow2)
  • Q. 이미지/컨테이너를 지웠는데 왜 파일이 안 줄죠?
    A. Docker.raw는 자동 축소되지 않습니다. Reclaim하거나 재생성해야 실제 파일 크기가 줄어듭니다.
  • Q. VM 내부의 실제 경로는요?
    A. /var/lib/docker 아래에 저장됩니다. macOS에서는 디스크 이미지(Docker.raw)로 캡슐화되어 접근합니다.

7) 운영 체크리스트 (복붙용)

# 상태 점검
ls -lh /…/Docker.raw
du -sh /…/Docker.raw

# Docker 리소스 점검
docker system df
docker system df -v

# 공간 회수 (월 1회 추천)
docker run --privileged --pid=host --platform=linux/amd64 docker/desktop-reclaim-space

# 정말 안 쓰는 리소스 전부 정리 (⚠️ 신중하게)
docker system prune -a --volumes

8) 실전 예시 (전/후)

  • Before: Docker.raw 228 GB (실제 디스크 점유)
  • Reclaim 실행: docker/desktop-reclaim-space
  • After: Docker.raw 6.3 GB

컨테이너/이미지 자체의 사용량은 작았지만, 과거 이력 때문에 Docker.raw가 비대해진 전형적인 사례입니다.


결론

  • 용량이 갑자기 부족해졌다면 Docker.raw부터 확인하세요.
  • 데이터 보존이 필요하면 Reclaim, 완전 초기화가 가능하면 재생성으로 가장 빠르게 해결됩니다.
  • DB는 호스트 디렉토리로 분리 마운트하여 재발을 막는 것이 최선입니다.

이 글이 도움이 되셨다면, 팀 위키/개인 블로그에 그대로 가져다 쓰세요. 상황에 맞게 경로만 바꾸면 됩니다. 👍

반응형

+ Recent posts