Docker에서 no space left on device가 뜰 때, 겉으로는 build나 pull, write, container start 한 번이 실패한 것처럼 보여도 실제 원인은 이미지, cache, log, volume 중 하나가 오래 누적되면서 host 저장 공간이 바닥난 경우가 많습니다.
짧게 말하면, 무조건 prune부터 하지 말고 어떤 저장 영역이 자라고 있는지 먼저 구분해야 합니다. 잘못된 데이터를 먼저 지우면 새로운 장애를 만들거나 필요한 상태를 날릴 수 있습니다.
먼저 host 디스크 압박과 container 내부 파일시스템 문제를 구분하세요
실무에서는 아래 둘이 자주 섞입니다.
- Docker host 전체가 image, cache, log, volume 때문에 디스크 부족 상태인 경우
- 특정 container 안에서 writable layer나 mount path가 꽉 찬 경우
첫 번째는 host 수준의 Docker 정리가 필요하고, 두 번째는 application 쓰기 패턴이나 mount 경로를 다시 봐야 합니다. 이 둘을 구분하지 않으면 cleanup이 전부 추측이 됩니다.
공간을 잡아먹는 흔한 원인
1. 오래된 image와 dangling layer가 쌓임
반복 빌드와 pull이 이어지면 오래된 tag와 사용하지 않는 layer가 조용히 누적됩니다.
2. build cache가 계속 커짐
BuildKit cache는 개발 머신과 CI host에서 생각보다 빠르게 커질 수 있습니다.
특히 자주 build하고 거의 정리하지 않는 환경에서 두드러집니다.
3. container log가 rotation 없이 계속 커짐
로그가 많은 애플리케이션은 host의 JSON log 파일을 예상보다 빠르게 채울 수 있습니다.
앱 자체는 정상이라 더 늦게 발견되는 경우가 많습니다.
4. volume이 오래된 데이터를 계속 보관함
named volume에는 database, upload, temporary artifact, 옛 상태 데이터가 컨테이너가 사라진 뒤에도 남아 있을 수 있습니다.
5. image 자체가 과하게 큼
runtime layer가 지나치게 크면 새 host나 새 배포마다 디스크 부담이 반복됩니다.
직접적인 원인이 아닐 때도 있지만 전체 상황을 더 악화시키는 요인입니다.
실전 점검 순서
1. Docker 저장 공간 요약부터 보세요
기본적으로 아래 명령으로 시작합니다.
docker system df
docker ps -a
docker volume ls
여기서 image, container, local volume, build cache 중 무엇이 크게 차지하는지 대략적인 감을 잡는 것이 첫 단계입니다.
2. stopped container와 오래된 image가 많은지 확인하세요
사용하지 않는 container나 오래된 image tag가 많으면 비교적 빠르게 정리 효과를 볼 수 있습니다. 다만 정말 버려도 되는 것인지 먼저 확인해야 합니다.
공유 host, CI runner, 오래 켜둔 개발 머신일수록 중요합니다.
3. 큰 log와 write-heavy container를 보세요
image가 핵심이 아니라면 log가 원인인 경우가 많습니다. noisy service 하나가 거대한 로컬 파일을 만들고 있어도 팀은 다른 곳만 보고 있을 수 있습니다.
4. volume은 지우기 전에 역할을 확인하세요
여기서부터는 데이터 유실 위험이 커집니다. database, upload store, stateful workload가 named volume을 쓰고 있다면 그 안의 데이터가 무엇인지, 복구 가능한지부터 알아야 합니다.
5. 책임 있는 저장 영역만 정리하세요
images, build cache, logs, volumes 중 어느 쪽이 진짜 원인인지 알게 됐다면, 그 범위만 의도적으로 정리하세요.
image 자체가 너무 큰 편이라면 Docker image가 너무 클 때도 같이 보는 것이 좋습니다.
패턴을 찾은 뒤 어떻게 바꿀지
오래된 image와 layer가 핵심인 경우
CI runner와 shared build host에서는 오래된 tag와 dangling layer를 주기적으로 정리하는 운영 습관이 필요합니다.
build cache가 핵심인 경우
cache 유지 정책과 build 빈도를 함께 봐야 합니다. 자주 build하는 host에서는 cache 증가가 자연스러운 만큼, 관리도 의도적으로 해야 합니다.
log가 디스크를 채우는 경우
불필요한 로그 양을 줄이고, 로컬 log rotation이나 driver 설정이 워크로드에 맞는지 확인하세요.
volume이 핵심인 경우
어떤 서비스가 그 데이터를 아직 쓰는지 파악하고, 큰 상태 데이터는 더 관리 쉬운 저장소로 옮기고, 오래된 named volume을 계속 방치하지 않도록 해야 합니다.
application이 writable path를 빠르게 채우는 경우
temp file 생성, export job, local upload, background task가 container filesystem이나 mounted directory에 계속 쓰고 있지 않은지 봐야 합니다.
안전한 체크리스트
Docker에서 no space left on device가 뜨면 아래 순서가 가장 안전합니다.
- host가 찼는지, container 내부 파일시스템이 찼는지 구분한다
docker system df를 실행한다- 오래된 image, stopped container, cache 증가를 본다
- container log와 named volume을 확인한다
- 이해한 범위만 prune 하거나 정리한다
- 반복해서 커지는 원인을 수정한다
FAQ
Q. docker system prune -a가 항상 정답인가요?
아닙니다. 유용한 cache나 artifact를 같이 지울 수 있고, 환경에 따라 너무 과격할 수 있습니다.
Q. 가장 빠른 첫 단계는 무엇인가요?
정리 전에 docker system df를 실행해서 어느 저장 영역이 실제 원인인지 보는 것입니다.
Q. CI host에서 왜 자꾸 반복되나요?
빌드와 pull이 많고 cache가 계속 누적되기 때문입니다. 계획된 정리가 없으면 반복됩니다.
Q. 디스크를 비워서 container가 다시 떴다면 끝난 건가요?
아닙니다. 무엇이 계속 커졌는지 찾지 않으면 같은 장애가 다시 옵니다.
Read Next
- oversized runtime layer가 원인이라면 Docker image가 너무 클 때를 보세요.
- stale build output이 문제라면 Docker build cache not updating를 확인하세요.
- cleanup 이후 restart issue가 생긴다면 Docker container keeps restarting로 이어가세요.
- 더 넓은 인프라 글은 Infra 카테고리에서 볼 수 있습니다.
Related Posts
- Docker image가 너무 클 때
- Docker build cache not updating
- Docker container keeps restarting
- Kubernetes OOMKilled
Sources:
- https://docs.docker.com/reference/cli/docker/system/df/
- https://docs.docker.com/reference/cli/docker/system/prune/
- https://docs.docker.com/engine/logging/drivers/json-file/
심사 대기 중에는 광고 대신 관련 가이드를 먼저 보여줍니다.
먼저 읽어볼 가이드
검색 유입이 많은 핵심 글부터 이어서 보세요.
- 미들웨어 트러블슈팅 가이드: Redis vs RabbitMQ vs Kafka 개발자를 위한 미들웨어 트러블슈팅 허브 글입니다. Redis, RabbitMQ, Kafka 중 어떤 증상부터 먼저 봐야 하는지와 어떤 문제 패턴이 각 시스템에 가까운지 정리합니다.
- Kubernetes CrashLoopBackOff: 먼저 볼 것들 startup failure, probe, config, resource limit 관점에서 CrashLoopBackOff를 어떻게 나눠서 봐야 하는지 정리한 가이드입니다.
- Kafka consumer lag가 계속 늘 때: 트러블슈팅 가이드 Kafka consumer lag가 계속 늘어날 때 무엇부터 봐야 하는지 정리합니다. poll 주기, 처리 속도, rebalance, consumer 설정까지 실전 기준으로 다룹니다.
- Kafka Rebalancing Too Often 가이드 Kafka consumer group에서 rebalance가 너무 자주 일어날 때 membership flapping, poll timing, protocol, assignment churn을 어떤 순서로 봐야 하는지 설명하는 실전 가이드입니다.
- Docker container가 계속 재시작될 때: 먼저 확인할 것들 exit code, command failure, environment mistake, health check 관점에서 Docker restart loop를 푸는 실전 가이드입니다.
심사 대기 중에는 광고 대신 관련 가이드를 먼저 보여줍니다.