요약

  • 기존 태그로 새 이미지를 올리면 태그는 새 버전을 가리키지만, 이전 이미지는 다이제스트로 접근할 수 있고 저장 공간도 계속 차지한다.
  • 태그가 없는 이미지도 저장 한도에 포함된다. 이름을 지우는 일, 매니페스트를 지우는 일, 참조 없는 레이어를 회수하는 일은 별개다.
  • 참여를 신청해 쓰는 자동 가비지 컬렉션 공개 프리뷰는 읽기 전용 전환 없이 참조 없는 레이어를 정리한다. 수동 방식은 읽기 전용 기간과 시작 전 최대 15분의 인증 만료 대기가 있을 수 있다.

이사 간 것은 이름표뿐인데 창고가 비었다고 보고하면, 다음 청구서가 회의록을 정정한다. DigitalOcean Container Registry의 오래된 소프트웨어 이미지가 보여 주는 문제다. 새 버전이 익숙한 태그를 물려받아도 옛 버전은 그대로 남을 수 있다.

공식 시작 안내서는 이 동작을 분명히 설명한다. 이미 쓰는 태그로 새 이미지를 푸시하면 태그가 갱신된다. 이전 이미지는 다이제스트로 계속 접근할 수 있으며 레지스트리 공간을 차지한다. 배포 담당자는 교체를 마쳤고, 저장 시스템은 두 버전의 사정을 그대로 기록한다.

남겨 두는 일이 현명할 때도 많다. 새 배포가 잘못됐을 때 돌아갈 버전, 조사에 필요한 산출물, 재현해야 할 문제가 있을 수 있다. 반면 주인도 목적도 잊힌 실험 결과가 같은 자리를 차지할 수도 있다. ‘태그 없음’이라는 상태만으로는 어느 쪽인지 알 수 없다. 낡았다는 것과 쓸모없다는 것은 다른 판정이다.

삭제했다고 말하기 전에, 무엇을 지웠는가

태그는 사람이 다루기 편한 이름이다. 다이제스트는 특정 버전을 식별한다. 이름은 앞으로 움직이되 옛 버전을 정확하게 가리킬 수 있다는 점은 운영상의 장점이다. 기록이 다음 배포에 휩쓸리지 않게 해 준다.

문제는 그 장점이 부서 사이에서 비용 절감 실적으로 바뀔 때 생긴다. ‘옛 버전을 교체했다’는 보고가 ‘옛 버전을 삭제했다’로, 다시 ‘저장 공간을 줄였다’로 전달된다. 세 작업 중 첫 번째만 했는데 마지막까지 끝낸 셈이 된다.

DigitalOcean의 가격 문서는 태그 없는 이미지도 저장 한도에 포함한다고 명시한다. 정리 안내서는 다른 단계를 보여 준다. 다이제스트를 삭제하면 관련 태그도 사라진다. 매니페스트를 삭제한 뒤에는 더는 어느 매니페스트도 참조하지 않는 레이어가 남을 수 있고, 이 재료를 회수해야 공간이 풀린다.

매니페스트가 살아 있으면 태그가 없어도 필요한 레이어를 계속 참조할 수 있다. 따라서 ‘이름이 없다’와 ‘참조가 없다’를 같은 뜻으로 취급하면 안 된다. 이름표 목록이 말끔해졌다는 이유로 창고도 가벼워졌다고 계산하는 것은 너무 낙관적인 회계다.

청소기는 보관 이유를 읽지 못한다

최신 공식 문서의 자동 가비지 컬렉션은 공개 프리뷰다. 사용자가 참여해 활성화하면 참조되지 않는 레이어를 백그라운드에서 계속 정리한다. 수동 정리처럼 레지스트리를 읽기 전용으로 바꿀 필요가 없다.

이는 분명한 개선이다. 저장 공간을 정돈하는 일이 이미지 업로드 일정과 경쟁하지 않아도 된다. 다만 자동화가 맡은 대상은 참조 없는 레이어다. 회사가 어떤 버전을 복구용으로 남겨야 하는지까지 결정해 주는 보관 정책은 아니다.

수동 회수에는 태그 없는 매니페스트를 함께 삭제하는 별도 선택지가 있다. 그 선택지가 존재한다는 사실이 책임의 경계를 드러낸다. 어떤 이력을 포기할지 정하는 일과, 포기한 뒤 남은 재료를 치우는 일은 다르다. 자동 정리는 후자를 편하게 만든다.

여기에는 서로 반대인 실수가 있다. 자동 기능을 켰으니 옛 이미지도 알아서 사라질 것으로 기대하면 참조가 남은 데이터가 계속 쌓일 수 있다. 태그 없는 것은 전부 쓰레기라고 보면, 누군가 다이제스트를 기록해 둔 복구용 버전까지 삭제 대상으로 삼을 수 있다. 어느 실수도 ‘자동’이라는 단어가 대신 책임져 주지 않는다.

창고 문이 열 개여도 용량은 공유한다

Professional 요금제는 레지스트리를 최대 열 개까지 제공하지만, 그 사이에서 저장 공간을 공유한다. 100 GiB가 레지스트리마다 새로 생기는 구조가 아니다. 프로젝트별로 입구를 나누는 기능을 용량 증식 기능으로 사면 계산이 틀어진다.

현재 가격표에서 Basic은 월 5달러에 5 GiB, Professional은 월 20달러에 100 GiB다. 추가 저장 비용은 일말에 계산하고, 해당 월에 한도를 초과한 일수에 따라 비례 적용한다. 절감액을 구하려면 실제 초과 용량과 기간을 알아야 한다. 삭제한 태그 수는 그 자리를 대신할 수 없다.

여러 이미지가 참조하는 레이어도 고려해야 한다. 버전별로 표시된 크기를 전부 더해 ‘삭제하면 이만큼 절약’이라고 적으면, 여전히 다른 곳에서 참조하는 재료까지 절감액에 포함하기 쉽다. 공간 회수가 끝난 뒤 실제 점유량을 확인해야 비용 이야기로 넘어갈 수 있다.

일정한 버전을 남기기 위해 저장료를 내는 것은 합리적인 구매일 수 있다. 다만 중요한 복구 지점 몇 개를 보관하는 결정과 모든 빌드를 무기한 쌓는 습관은 비용이 커지는 방식이 다르다. 후자는 배포 속도가 빨라질수록 함께 자라며, 누군가 다시 묻기 전까지 자신의 목적을 설명할 필요도 없다.

대기 시간과 완료 시간은 다르다

수동 회수를 실행하면 레지스트리는 잠시 읽기 전용이 된다. 실제 회수를 시작하기 전, DigitalOcean은 이미 발급된 쓰기 인증이 만료되기를 기다린다. 마지막 쓰기 작업이 시작된 시점에 따라 최대 15분이 걸릴 수 있다.

이 시간은 시작 전 대기다. 전체 정리가 15분 안에 끝난다는 약속으로 일정표에 옮겨 적을 수는 없다. 수동 경로를 유지하는 팀은 쓰기 작업과 정리 시간을 맞춰야 한다. 자동 프리뷰가 있다는 사실만으로 해당 레지스트리에 이미 적용됐다고 가정해서도 안 된다.

취소 버튼 역시 시간의 방향을 바꾸지 않는다. 공식 안내에 따르면 취소 시점까지 삭제한 blob과 확보한 공간을 확인할 수 있다. 중단할 수 있는 것은 남은 작업이다. 이미 없앤 재료까지 돌려주는 복원 기능으로 생각하면 곤란하다. 남길 버전은 삭제를 시작하기 전에 정해야 한다.

자동 정리를 켠 경우에는 미완성 업로드에도 경계가 있다. 24시간 안에 끝나지 않은 이미지 업로드를 부분 업로드로 취급하고, 그 레이어는 자동 회수 대상이 될 수 있다. 이 규칙은 완성된 이미지 전체의 수명을 하루로 줄이지 않는다. 정확히 24시간째에 모두 삭제한다는 일정도 제시하지 않는다.

업로드 시작 기록만 보고 버전이 안전하게 보관됐다고 처리하면 이런 차이를 놓친다. 배포 이력에 적힌 항목과 실제로 쓸 수 있는 이미지가 맞아야 한다. 이름과 상태가 앞서 달리고 내용이 뒤에 남는 순간, 보관 보고서는 복구 자료로서 힘을 잃는다.

남겨 둔 버전의 월세를 설명할 사람

RIPE NCC의 일차 기록은 DigitalOcean, LLC라는 조직의 신원을 확인한다. 여기서 다룬 저장·정리·가격 규칙은 DigitalOcean의 공식 문서에 근거한다. 특정 고객의 낭비나 절감 효과를 계산하려면 다이제스트별 참조 관계, 보관 목적, 정리 전후 점유량 기록이 더 필요하다.

작은 팀이라도 질문은 어렵지 않다. 이 버전을 왜 남기는가, 누가 필요로 하는가, 언제 다시 볼 것인가. 답이 있으면 오래된 이미지도 유용한 재고다. 답이 없다면 좋은 청소 도구를 갖췄어도 회사의 판단이 비어 있는 셈이다.

자동 정리는 반가운 직원이다. 그 직원에게 회사의 소프트웨어 이력 중 무엇을 죽이고 무엇을 살릴지까지 맡기지는 말자. 이름표가 떨어졌다고 퇴실한 것도 아니고, 보관료를 내고 있다고 반드시 필요한 손님인 것도 아니다.

일차 자료