Docker 디스크 정리: 공간 확보 완전 가이드
/var/lib/docker 구성, docker system df로 현황 파악, 단계별 prune 전략, 로그 파일 누적 해결, 이미지 크기 최적화로 디스크 공간을 효율적으로 관리하는 방법을 정리합니다.
지난 글에서 docker system prune으로 미사용 리소스를 정리하는 방법을 살펴봤다. 이번에는 Docker가 디스크를 어떻게 쓰는지 전체 그림을 이해하고, 상황별로 공간을 회수하는 구체적인 전략을 정리한다.
/var/lib/docker 구조
Docker의 루트 디렉터리는 docker info | grep "Docker Root Dir"으로 확인한다. 기본값은 /var/lib/docker다.
du -sh /var/lib/docker/*/
주요 하위 디렉터리:
overlay2/— 이미지 및 컨테이너 레이어. 보통 가장 큰 영역이다. 이미지 레이어와 실행 중인 컨테이너의 writable layer가 모두 여기 있다.volumes/—docker volume create로 만든 named volume 데이터containers/— 컨테이너 메타데이터 + 로그 파일(*-json.log)buildkit/— BuildKit 빌드 캐시image/— 이미지 메타데이터 및 manifest
현황 파악
# 요약
docker system df
# 상세 (이미지·컨테이너·볼륨 각각의 크기)
docker system df -v
RECLAIMABLE 컬럼이 회수 가능한 공간이다. 이 값이 크면 prune으로 공간을 확보할 수 있다.
단계별 정리
급하게 디스크를 확보해야 할 때 안전한 것부터 순서대로 실행한다.
1단계 — 중지된 컨테이너 삭제:
docker container prune -f
종료된 컨테이너의 writable layer와 로그 파일이 함께 삭제된다.
2단계 — 댕글링 이미지 삭제:
docker image prune -f
빌드 중 생성된 태그 없는 레이어들을 삭제한다.
3단계 — 빌드 캐시 정리:
docker builder prune --keep-storage=2g -f
--keep-storage로 최근에 사용한 캐시 2GB는 남기고 나머지를 삭제한다. CI 서버에서 자주 빌드하면 빌드 캐시가 수 GB씩 쌓인다.
4단계 — 미사용 이미지 전체 삭제:
docker image prune -a -f
사용 중이 아닌 모든 이미지를 삭제한다. 다음 배포 시 pull이 필요하다.
5단계 — 전체 정리:
docker system prune -af
volumes까지 삭제하려면 --volumes를 추가하지만, 데이터 손실 위험이 있으므로 신중하게 사용한다.
로그 파일 누적 해결
json-file 드라이버를 로테이션 없이 사용하면 containers/ 안의 *-json.log 파일이 무한히 커진다.
실행 중인 컨테이너의 로그 파일을 비울 때는 파일을 삭제하면 안 된다. Docker daemon이 파일 핸들을 열고 있으므로 truncate로 내용만 지운다.
# 특정 컨테이너 로그 비우기
truncate -s 0 $(docker inspect --format='{{.LogPath}}' <container>)
# 모든 컨테이너 로그 한번에 비우기
truncate -s 0 /var/lib/docker/containers/*/*-json.log
근본 해결책 — daemon.json에 로테이션을 설정하거나, Compose logging 블록에서 max-size를 지정한다.
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
이미지 크기 줄이기
디스크를 계속 쓰는 이유가 이미지 자체가 너무 크기 때문일 수도 있다.
# 이미지별 크기 순 정렬
docker image ls --format "{{.Size}}\t{{.Repository}}:{{.Tag}}" | sort -h -r | head -20
크기를 줄이는 빠른 방법:
alpine기반 이미지 사용 (수백 MB → 수 MB)- 멀티 스테이지 빌드로 빌드 도구 제외
RUN레이어를 합쳐 중간 파일 제거
# 나쁜 예
RUN apt-get update
RUN apt-get install -y build-essential
RUN make
RUN rm -rf /tmp/build
# 좋은 예 (레이어 하나에 처리)
RUN apt-get update && apt-get install -y build-essential \
&& make && rm -rf /tmp/build \
&& apt-get purge -y build-essential && apt-get autoremove -y
디스크 알림 설정
디스크가 가득 차서 컨테이너가 시작되지 않는 상황을 예방하려면 호스트 디스크 사용률 모니터링을 설정한다.
# 크론으로 주기적 확인
0 */4 * * * docker system prune -f --filter "until=24h" >> /var/log/docker-prune.log 2>&1
지난 글: docker system prune: 사용하지 않는 리소스 일괄 정리
다음 글: Docker 보안 개요: 컨테이너 보안의 핵심 원칙
읽어주셔서 감사합니다. 😊