205. 컨테이너 이미지 레이어 (Image Layer) 및 OCI - 도커 구조 오픈 컨테이너 이니셔티브 유니온 파일 시스템(UFS) 캐싱 불변성 스토리지 최적화
핵심 인사이트: (도커 컨테이너를 지배하는 다이어트 흑마법) 도커 이미지 파일은 우분투 OS에, 자바 깔고, 톰캣 깔고 내 1MB짜리 코드까지 합치면 무려 '1GB'짜리 거대한 덩어리가 된다. 근데 내가 코드를 살짝 고쳐서 v2 버전을 다시 찍어내려 한다. "야 ㅆㅂ!! 코드 1줄(1바이트) 고쳤다고 또 통짜로 1GB짜리 이미지를 새로 구워서 10분을 기다려야 돼?! 내 하드디스크 터지잖아!!" 솔로몬 파익스(도커)가 웃으며 말했다. "야! 도커 이미지는 1GB짜리 통짜 시멘트 덩어리가 아니야!! 밑바닥에 [우분투 층 400MB], 그 위에 [자바 층 300MB], 맨 꼭대기에 [네 코드 층 1MB]가 양파 껍질(Layer)처럼 겹겹이 분리되어 층층이 쌓여있는 샌드위치 구조라고!! 네가 꼭대기 코드 1줄을 고치면? 밑의 무거운 우분투랑 자바 층은 다시 안 굽고 100% 재활용(캐싱)해 버리고, 오직 맨 꼭대기의 1MB짜리 코드 층 딱 하나만 0.01초 만에 새로 구워서 살포시 얹어버리면(UFS 흑마법) 끝이잖아!! 1GB 덩어리 100개를 구워도 하드 용량과 빌드 시간을 빛의 속도로 다이어트 시켜주는 절대 비기, 레이어(Layer) 아키텍처다.
Ⅰ. 통짜 파일(VM)의 비만과 끔찍한 빌드 속도
- 기존 가상 머신(VMware)의
.vmdk파일은 10GB짜리 거대한 통짜 돌덩어리였습니다. - 코드를 1줄만 고쳐서 새 버전을 백업하려면, 이 10GB 돌덩어리를 통째로 하나 더 복사(Ctrl+C, V)해야 했습니다. 10개만 버전업해도 100GB가 날아가고 굽는 데 1시간이 걸리는 끔찍한 비효율입니다.
Ⅱ. 컨테이너 이미지 레이어 (Image Layer)의 마법 🌟
- 개념: 도커(Docker) 이미지를 구성하는 방식입니다. 이미지는 하나의 거대한 덩어리가 아니라, 여러 개의 독립된 '읽기 전용(Read-Only)' 조각 파일 층(Layer)들이 차곡차곡 스택(Stack)처럼 쌓여서 만들어진 겹겹이 샌드위치 구조입니다.
Ⅲ. 레이어 아키텍처의 3대 극한 최적화 무기 🌟 핵심 🌟
이 마법을 가능하게 하는 밑바닥 기술이 바로 UFS (Union File System) 입니다. (여러 개의 층을 겹쳐서 위에서 쳐다보면 마치 1개의 층처럼 보이게 투과시켜 주는 파일 시스템)
1. 완벽한 캐싱과 재사용 (초고속 빌드)
- 내 도커 파일(Dockerfile) 명세서가 이렇습니다:
1. Ubuntu 깔기➜2. Nginx 깔기➜3. 내 HTML 소스코드 복사하기. - 도커는 이걸 3개의 층(Layer A, B, C)으로 각각 쪼개서 저장합니다.
- 내일 내가 HTML 소스 코드(C층)를 수정해서
도커 빌드(Build)를 다시 때립니다. - 기적: 도커는 밑바닥의 무거운 A층(Ubuntu)과 B층(Nginx)은 변한 게 없다는 걸 알고, 다시 다운받지 않고 기존 하드디스크에 있던 걸 **100% 캐싱(재활용)**해서 그대로 가져다 씁니다. 오직 변경된 C층(HTML) 딱 1개만 0.1초 만에 새로 구워서 얹어버립니다. 10분이 걸리던 이미지 굽기(Build) 시간이 0.5초로 떡락합니다.
2. 하드디스크 용량 절약 (중복 배제)
- 서버에 '웹 서버', '결제 서버', '로그 서버' 3개의 컨테이너를 띄웠습니다.
- 3개 모두 밑바닥은 똑같은
Ubuntu 400MB레이어를 씁니다. - 도커는 400MB짜리 층을 3번 복사해 하드 용량 1.2GB를 태우지 않습니다! 하드디스크에는 오직
Ubuntu 400MB레이어 딱 1개만 저장해 두고, 3개의 컨테이너가 이 1개의 층을 링크 걸어서 공용으로 돌려(공유) 씁니다. (극강의 용량 다이어트)
3. 맨 꼭대기의 '쓰기 가능(Writable) 레이어' 🌟 (격리 유지)
- 이미지 레이어들은 204번 원칙에 따라 무조건 **'읽기 전용(Read-Only, 불변)'**입니다. 절대 못 고칩니다.
- "어? 근데 컨테이너 켜서 내가 터미널 들어가서
a.txt파일 만들고 덮어쓸 수 있던데요?" - 비밀: 도커가 컨테이너를 켤 때, 얼어붙은 읽기 전용 이미지 레이어들 맨 꼭대기 위에 아주 얇은 **'쓰기 전용(Writable) 임시 비닐 텐트 층'**을 하나 살포시 덮어씌워 줍니다.
- 사용자가 파일을 고치면 밑의 꽁꽁 언 레이어가 바뀌는 게 아니라, 이 맨 꼭대기 얇은 임시 비닐 층에만 찌끄러기가 남습니다. 컨테이너를 죽이면 이 비닐 층만 싹 날아가고 밑의 무균실 이미지 뼈대는 영원히 깨끗하게 보존(불변 인프라)됩니다.
Ⅳ. OCI (Open Container Initiative) 표준 규격
- 도커가 혼자 시장을 다 씹어먹자 구글과 MS가 견제구를 날립니다. "야, 이미지 포맷을 도커 혼자 독점하면 어떡해! 표준을 정하자!"
- OCI: 리눅스 재단 산하에서 만든 **'컨테이너 런타임과 이미지 포맷에 대한 개방형 국제 표준 규격'**입니다.
- 이 표준 덕분에, 도커(Docker)로 예쁘게 구운 레이어 이미지를, 도커가 아닌 다른 런타임 엔진(containerd, CRI-O, Podman)에 던져줘도 똑같이 찰떡처럼 100% 호환되어 잘 돌아가게 클라우드 대통합이 이뤄졌습니다.
📢 섹션 요약 비유: **컨테이너 이미지 레이어(Image Layer)**는 투명한 **'OHP 필름(투명 셀로판지) 겹쳐 그리기 마술'**과 같습니다. 옛날 가상 머신(VM) 방식은 스케치북 도화지에 사람을 한 번에 다 그리고, 모자만 딴 걸로 바꾸고 싶으면 도화지를 버리고 처음부터 발, 몸통, 얼굴, 모자를 1시간 동안 미친 듯이 새로 다 다시 그려야 했습니다(통짜 빌드의 낭비). 도커의 레이어 샌드위치 방식은 다릅니다. 1번 투명 필름에 '맨몸'을 그리고(OS 레이어), 2번 필름에 '옷'을 그리고(미들웨어), 3번 필름에 '모자'를 그립니다(소스 코드 레이어). 이 3장을 불빛에 겹쳐보면 완벽한 사람 1명(컨테이너 이미지)이 됩니다(UFS 투과 마술). 내일 모자만 야구 모자로 바꾸고 싶다면? 1번(몸), 2번(옷) 필름은 안 버리고 그대로 재활용(캐시)합니다!! 오직 맨 위에 덮었던 3번 필름(모자) 한 장만 쓰레기통에 버리고, 야구 모자가 그려진 새 3번 필름만 0.1초 만에 그려서 위에 덮어주면 끝납니다(초고속 레이어 빌드). 변하지 않는 하위 뼈대는 완벽히 얼려두고 보존하며, 변하는 윗물(코드)만 날렵하게 갈아치워 버리는 컨테이너 시대 최고의 저장 공간 다이어트와 속도 혁명의 심장입니다.