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로 파티션 체크를 해본다.

# 파티션 체크 
$ df -h

 

/dev/xvda3이 꽉 차있는 모습

 

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

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

 

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

 

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

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

 

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

 

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

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

 

- 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 예하의 사용하지 않는 볼륨, 컨테이너, 빌드 레이어들이 많이 저장되어 있었고

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

 

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

 

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

 

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

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

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

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

 

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

 

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

 

df -ih

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

 

결론

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

 


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