어느날 서버 데이터 자체가 날라갈 뻔했던 적이 있었다.
그에 대비하기 위해 rsync를 이용해 무식하게 백업을 했는데, 예상했던것 보다 용량이 많이 나와서 알아보기 시작했다.
용량을 가장 많이 먹었던 것은 private registry 였다.
생각해보니 registry를 올려두고 한번도 정리를 해본적이 없었다…
그래서 ‘자동으로 정리할 방법이 없나’ 고민 했었고 그 끝에 garbage colllection이 있다는 것을 알았다.
garbage collection이란 필요 없는 이미지 레이어들을 자동으로 없애주는 기능이다.
pl에 있는 GC와 비슷하다.
세부적인 문법은 이 곳에서 참고 하면 될것 같고, 나는 다른 기능들은 딱히 설정할 필요가 없어서 설정하지 않았다.
내가 설정한 것은 아래와 같다.
version: 0.1
storage:
delete:
enabled: true
이와 같이 설정하면 컨테이너 외부나 내부에서 삭제가 가능해지도록 해준다. (위 처럼 설정한다고 gc가 자동으로 일어나는 것은 아니다!)
이렇게 설정해 두고 컨테이너 볼륨을 이용해 연결해 주면 된다.
GC를 하는 명령어는 아래와 같다.
docker exec -it -u root {your_container_name} bin/registry garbage-collect --delete-untagged /etc/docker/registry/config.yml
도커의 기본적인 명령어는 다른 글에서 알아보도록 하고, 위 명령어에서의 핵심은 “–delete-untagged”와 “/etc/docker/registry/config.yml”이다.
delete untagged의 경우 태그가 없는 이미지를 삭제 하는 옵션이다.
같은 태그로 계속해서 업로드 하는 경우 기존에 업로드 된 이미지는 원래 가지고 있던 태그를 잃고 새로 업로드 된 이미지만 태그를 가질 수 있다.
이런 이유로, delete untagged 옵션을 이용하면 쉽게 이미지를 지울 수 있다.
그 다음으로 /etc/docker/registry/config.yml 는 위에 설정파일 위치를 나타내는데, 도커 이미지를 실행 시킬 때 컨테이너 안에 볼륨으로 연결 해 주면 된다.
추가적으로 자동화를 원하는 경우, cron이나 타이머를 이용하면 된다. 도커 내부에서 자동적으로 지원해주는것 같지는 않아보인다.
아무튼, Garbage Collection을 진행한 결과
40GB 육박했던 크기에서 2.35GB로 줄었다. 효과는 대단했다!