DEV/Infrastructure

[트러블슈팅] Docker, Linux no space left on device 해결 방법

Bi3a 2024. 1. 8. 10:03

목차
728x90

이게.. 왜 (안)돼?


문제 상황

배포를 위해 jar 파일을 통한 도커 이미지 빌드 과정에서 에러가 발생했다.
'failed to prepare ... : no space left on device"

 

 

문제 원인

서버 디스크의 용량이 부족함을 확인했다. 어디가 꽉 찬건지 확인해보자.

 

문제 해결 과정

 

우선 df -h로 파티션 체크를 해본다.

bash
닫기
# 파티션 체크
$ df -h

 

/dev/xvda3이 꽉 차있는 모습

 

이어서 df -i로 inode 값을 체크한다.

Inodes: Index Node의 줄임말로, 파일에 대한 메타데이터를 저장한다.
파일의 소유자 ,그룹, 권한 크기, 생성 시간, 마지막 수정 시간 등의 정보를 가지며,
디렉토리나 파일의 식별자 역할을 한다.
bash
닫기
# inodes 체크
$ df -i

 

inodes도 /dev/xvda3 이 가득 용량을 먹고 있다.

 

절대적으로 /dev/xvda3 예하의 특정 디렉토리가 가득 차서 문제가 생겼음을 확인했다.

이하의 명령어를 통해 어느 부분에서 용량을 차지하고 있는지 조회한다.

 

bash
닫기
- for i in [경로]; do echo $i; find $i | wc -l; done
# 예시 : - for i in /*; do echo $i; find $i | wc -l; done

 

/var에 가장 용량을 차지하고 있는 비중이 많음을 확인했다.

다시 한번 하위의 폴더를 상기 명령어로 검사하며 문제의 원인을 탐색한다.

 

bash
닫기
- for i in [경로]; do echo $i; find $i | wc -l; done
# 예시 : - for i in /*; do echo $i; find $i | wc -l; done

 

~ 타고 들어가는중

 

 

var/lib/docker/vfs/dir 예하의 사용하지 않는 볼륨, 컨테이너, 빌드 레이어들이 많이 저장되어 있었고

이들이 쌓여 문제를 일으키고 있던 것이다.

 

아래의 명령어를 통해 도커 시스템에서 사용하지 않는 모든 리소스를 정리하자. 

 

bash
닫기
docker system prune -a --volumes
# --volumes는 볼륨도 같이 삭제하라는 뜻

 

위의 명령어를 통해 수행되는 작업은 아래와 같다.

  • 사용하지 않는 불필요 이미지 삭제
  • 사용하지 않는 불필요 컨테이너 삭제
  • 사용하지 않는 네트워크 삭제
  • 사용하지 않는 볼륨도 삭제

이 명령어는 도커 시스템의 디스크 공간을 최적화하고 리소스를 정리하는데 유용하다.

그러나 필요한 리소스가 아닌지 반드시 확인한 후에 사용하자.

 

불필요 리소스 정리 결과: 1.58GB 확보 완료

 

정리 이후 df-ih를 통해 디스크내 inode와 용량 차지 비율을 다시 확인해보자.

 

bash
닫기
df -ih

정상화되었음을 확인했다.

 

결론

  • 문제 원인 : 과도한 이미지 빌드로 인해 불필요 리소스와 Inode가 많이 쌓여있었음
  • 해결 방법 : docker system prune -a --volumes 로 불필요 리소스를 정기적으로 제거

 


틀린 부분이 있으면 댓글로 알려주세요!