원격서버에 docker로 운영되는 리소스들 있었는데 동작 확인을 위해 docker를 재시작하는 도중 서버의 디스크 용량이 부족하여 docker가 빌드되지 않는 문제가 발생했다.
이전에도 gunicorn accesslog 때문에 용량이 다 찬적이 있어서 그때처럼 로그나 백업파일이 쌓인 곳은 없는지 확인하려했다.
우선 다음의 명령어로 어떤 디렉토리가 용량을 많이 차지하고 있는지 파악했다.
sudo du -hsx /* | sort -rh | head -n 40
확인해보니 /var/lib/docker/overlay2
경로에 27G나 차지하는 것을 발견했다.
💡 overlay?
우분투와 같은 데비안 계열 운영체제에서 사용하는 레이어 파일 시스템. 컨테이너의 스토리지를 제한하기위해 Docker Engine의 자제 기능을 이용하지 않고 Storage의 도움이 필요한데, 이때 사용하는 파일 시스템이 Overlay2이다.
찾아보니 보통 /var/lib/docker/overlay2
가 용량이 큰 경우 diff/tmp
에 컨테이너 내부 파일구조 변경 사항들이 과도하게 쌓였기 때문이라고 한다. 이 파일은 삭제해도 동작에 큰 문제가 생기지 않는다고 하니 우선 가장 큰 용량을 차지하고 있는 파일을 찾아 삭제를 해주려고 했다.
근데 도커에 var/lib/docker/overlay2/layerdb/sha256
을 보니 실제 운영하고 있는 도커 레이어보다 훨씬 많은 레이어들이 저장된것 처럼 보였다. 프로젝트 초기에 도커 파일을 작성하는 과정에서 저장된 불필요한 레이어들이 아직도 남아있는 것으로 예상되었다. 이참에 필요없는 것들은 모두 정리해버릴까 싶어, 레이어들을 모두 삭제해준 뒤 용량을 확인해보니 10G대로 용량이 줄어들었고 도커도 원활하게 동작이 되었다.
데비안 계열에서 도커를 설치하면 컨테이너 저장경로가 /var/lib
로 디폴트 설정되기 때문에 파티션 크기가 적은 경우 이번처럼 용량 문제를 일으킬 수 있다. 임시 처방으로 파일 정리 후 도커가 잘 동작하기는 하지만 추후에 같은 문제가 발생하지 않도록 하기 위해 저장 경로를 변경해주도록 했다.
vi /etc/docker/daemon.json
# daemon.json
{
"graph": "바꿀 경로"
}
sudo systemctl restart docker
ps -ef | grep docker
참고
[Docker / Linux] 도커 볼륨의 용량이 너무 클 때 해결법
Docker에서 /var/lib 변경
만들면서 이해하는 도커(Docker) 이미지의 구조
What do I do when my root filesystem is full?