도커 overlay 용량을 정리해보자.

Posted on November 14th, 2023

문제의 시작

차세대 코스콤 시스템을 구축하면서 IDC 에 docker image 를 이용해서 어플리케이션을 띄웠다. 배포를 하고 운영을 하면서 서버에 용량이 차기 시작했고 Zabbix에 알림이 오기 시작했다. 용량을 정리해보자.

문제 해결

우선 인프라팀에서 Zabbix 에 알림이 오면 각 서버 담당자에게 슬랙으로 연락이 온다. 나 같은 경우는 차세대 전체적으로 관리를 하고 있으므로 총 Application 7대와 운영 브로커, 스테이징 브로커에 대한 슬랙을 주신다.

df -h 명령어를 이용해서 우선 전체적으로 얼마정도 데이터가 쌓였는지 알아본다.

     2023 11 20    9 18 51

디스크에 용량이 가득차고 overlay에 가득차있다. 나는 항상 용량에 대한 이슈가 나에게 오면 ‘docker system prune -a -f’ 명령어를 쓰고 Docker 환경에서 사용되지 않는 리소스를 강제로 정리한다.

사용 중이지 않은 컨테이너: 모든 종료된 컨테이너가 제거
네트워크: 사용 중이지 않은 Docker 네트워크 리소스가 제거
이미지: 기본적으로는 태그가 없는 이미지만 제거되지만, -a 옵션으로 인해 사용 중이지 않은 태그가 있는 이미지도 제거
빌드 캐시: Docker 이미지 빌드 과정에서 생성된 캐시들이 제거

문제 해결 변수

보통 docker system prune -a -f 명령어를 사용하면 용량을 확보할 수 있었는데 이번에는 단 1도 용량이 확보되지 않았다. 이유는 이미 사용되지 않는 리소스는 정리가 되었고 추가로 용량을 차지하고 있는 부분을 확인해서 삭제를 해야한다.

자, 순차적으로 확인해보자.

  1. df -h 를 이용해서 가장 큰 용량이 있는 마운트된 경로알아봄
  2. sudo du -ahx / | sort -rh | head -n 10로 용량이 가장 많은 부분을 알아본다. ( ‘/’ 마운트된 경로 )
  3. /var/lib/docker/containers/ - 에 가장 큰 용량 차지
  4. du -ah /var/lib/docker/containers/ - | sort -rh | head -n 10 을 통해 어느 것이 가장 용량이 많은지 확인
  5. -.json 의 파일이 가장 컸다.
     2023 11 20    9 19 35

삭제를 시켜주자 !!!

  • rm -rf
     2023 11 20    9 18 51

응 ? 근데 왜 그대로 일까? 여전히 용량은 확보되지 않았다. 하지만, 다시 경로에 들어가보면 -.json 에 대한 데이터는 사라지고 없었다.

확인해보니 docker container에 해당 부분을 쓰고 있으면 삭제를 해도 완벽히 지워지지않는다더라. 한번 재시작을 하고나서야 용량이 확보되었다.

번외 1 ) - 왜 용량이 차기 시작했을까 ?

로그 파일: 웹 어플리케이션과 Docker 자체가 생성하는 로그 파일이 지속적으로 쌓일 수 있고 로그 파일들은 시간이 지남에 따라 디스크 공간을 차지한다.

Docker 이미지와 컨테이너: 차세대 코스콤 같은 경우, 어플리케이션 같은 경우, 3가지가 있다. 물론, 각자 다른 서버에 있지만 Processor(프로듀서 역할), Load(컨슈머 역할), Batch(스케줄러) 어플리케이션이 있다. 각각의 어플리케이션의 기능 개발, 장애, 수정을 할 경우, 빌드하고 배포 하므로 Docker 이미지 또는 컨테이너를 자주 업데이트하거나 재생성하는 경우가 많다. 이전 버전의 이미지나 사용되지 않는 컨테이너가 계속해서 디스크 공간을 차지할 수 있다.

데이터베이스: 어플리케이션의 데이터베이스가 서버 내부에 저장되고 있고, 데이터가 지속적으로 추가되는 경우, 이는 디스크 공간을 차지하는 요인이 될 수 있는데 예를 들어, kafka streams 의 RocksDB 같은 경우에도 용량에 문제가 될 수도 있다.

캐시 및 임시 파일: 시스템이나 어플리케이션에 의해 생성되는 캐시나 임시 파일들이 정기적으로 삭제되지 않는 경우도 있다.

번외 2 ) - /var/lib/docker/containers/ 에 있던 json 파일의 정체는 무엇일까?

이 파일은 Docker 컨테이너의 로그 파일이었다. 이 파일은 Docker 컨테이너에서 발생하는 모든 출력 및 에러 로그를 저장한다. 즉, 컨테이너 내부에서 실행되는 프로세스가 콘솔에 출력하는 모든 내용이 이 파일에 기록한다.

로그의 누적: Docker 컨테이너는 기본적으로 로그를 계속해서 이 파일에 쓰며, 시간이 지남에 따라 파일 크기가 커질 수 있고 특히 로그가 많이 생성되는 애플리케이션이 실행되는 경우 더 빨리 누적된다.

컨테이너 재시작의 필요성 : 로그 파일을 직접 삭제하려고 해도, 해당 파일이 여전히 Docker 데몬에 의해 사용 중이라면 삭제가 반영이 되지 않는다. 컨테이너를 재시작하면 Docker는 새로운 로그 파일을 시작하고, 이전에 사용 중이던 로그 파일은 해제되어 삭제될 수 있음.

또한, 중요한 로그도 있을 수 있으므로 함부로 지우면 안되고 또한 Docker 컨테이너의 로그 설정을 조정하여 로그의 최대 크기나 로테이션 수를 설정하면서 이번 문제 처럼 용량의 문제를 사전에 극복할 수 있다.