기타 Lobsters · 4일 전

"도커 레이어는 파일을 어떻게 지울까?" 파고들다 마주친 뜻밖의 설계 타협들

핵심 요약
  • 도커 레이어가 tar 아카이브 기반으로 쌓여 파일시스템을 만드는데, 본래 파일 삭제 기능이 없는 tar 포맷에서 이전 레이어 파일을 어떻게 지우는지 의문을 파고든 글입니다.
  • tar를 파일시스템 diff 용도로 재사용하면서 화이트아웃(whiteout) 파일명 같은 우회 방식이 도입되었고, 이로 인해 컨테이너 내에서 특정 파일명을 쓰지 못하는 제약이 생깁니다.
  • 간단하고 보편적인 도구를 목적 외로 확장해 쓰면서 발생한 실용적 엔지니어링 타협점과 그에 따른 부작용을 다뤘습니다.
요약 도커(Docker)를 다루다 보면 이미지가 '불변의 레이어들이 차곡차곡 쌓여 만들어진 것'이라는 설명을 흔히 듣게 됩니다. 하지만 각 레이어가 실제로 어떻게 구성되어 동작하는지 파고들면 의외의 기술적 타협점과 마주하게 됩니다. 작성자는 SOCI(Seekable OCI) 기술을 살펴보던 중 "도커 레이어가 기본적으로 tar 아카이브를 순차적으로 덮어씌워 파일시스템을 만드는 구조라면, 이전 레이어에서 생성된 파일을 다음 레이어에서는 어떻게 삭제할 수 있을까?"라는 의문을 갖게 되었습니다. tar 포맷은 개별 파일을 묶고 압축하는 데에는 뛰어나지만, 파일시스템 간의 '차이점(diff)'이나 이전 아카이브에 있는 파일의 삭제 연산을 본래 지원하지 않기 때문입니다. 결국 도커와 OCI 표준은 tar라는 오래되고 단순한 도구를 원래 목적 이상으로 확장해 사용하면서 '화이트아웃(Whiteout)' 파일명 규칙이나 불투명(opaque) 디렉터리 같은 우회 방식을 도입해야 했습니다. 이로 인해 리눅스에서 정상적으로 쓸 수 있는 특정 파일명이 컨테이너 이미지 내부에서는 온전히 사용되지 못하거나, 이미지를 export 후 다시 import했을 때 동작이 달라지는 등의 독특한 부작용이 발생하게 됩니다. 우리가 당연하게 써오던 컨테이너 레이어 시스템 뒤편에 실은 영리하면서도 다소 해킹 같은 엔지니어링 타협이 숨어 있던 셈입니다.
Sponsored · 광고