본문 바로가기

개발노트/LINUX

Docker - no space left on device 대응 방법

AWS ECS 로 서버를 운영하고 있는데, ECS Fargate 가 아니라 ECS on EC2 로 운영을 하다 보면 EC2 에 대한 관리도 개발자/인프라 관리자가 책임을 갖게 된다.

ECS on EC2 로 운영하고 있는 상황에서 새로운 ECS task 를 띄우려고 할 때 가끔씩

CannotPullContainerError: failed to register layer. ... no space left on device

 

와 같이 오류가 발생하며 task 가 실행되지 않는 이슈가 생길 수 있다.

 

이는 EC2 의 용량이 꽉 차서 생기는 문제일 확률이 매우 높으며, 아래와 같이 해결할 수 있다.

 

1. 주기적으로 docker prune 을 한다.

- EC2 를 launch 하는 데 사용되는 LaunchTemplate 이나 AMI 에 crontab 을 이용하여 `docker system prune` 명령어가 주기적으로 실행되도록 한다. 그러면 stopped 상태의 container 와 관련된, 이미지, container, volume 등 모두 한 번에 정리가 되며 디스크 용량이 확보된다.

2. 실행중인 container 의 log 파일의 사이즈를 줄여준다. (truncate)

- ECS task 가 오랫동안 떠있다보면 그 container 에서 쌓는 로그 파일의 사이즈가 한없이 커지는 경우가 있다. 이 때, container 를 중지시키고 새로 띄우는 방법도 있지만 굳이 그러는 것이 여러이유에 의해 시간이 많이 들고 고민이 된다면 container 에서 쌓는 로그 파일을 host(EC2) 에서 찾은 다음 로그 파일의 내용을 싹 비워주도록 하는 방식으로 해결을 할 수가 있다.

# 실행중인 컨테이너가 쌓는 로그 파일 찾고 용량 확인하기
sudo find /var/lib/docker/containers/ -type f -name "*-json.log" | xargs ls -alh

# 실행중인 컨테이너가 쌓는 로그 파일을 truncate 시키기(사이즈를 0 으로 만들기)
sudo find /var/lib/docker/containers/ -type f -name "*-json.log" | xargs truncate -s 0 {}

container 에서 쌓는 로그 파일 용량 확인하기

 

용량 확보한 상태

이 또한 스크립트로 작성하여 crontab 으로 등록함으로써 주기적으로 실행되도록 하면 디스크 용량이 부족하다는 이유로 ECS task 가 시작되지 않는 현상은 발생하지 않을 것이다.

반응형