2025. 12. 30. 21:02ㆍDocker
🔍 “레이어는 diff만 저장한다”이해하기
1️⃣ 먼저, diff라는 말부터 정확히 정리
❌ 많은 분들이 이렇게 오해합니다
“diff = 변경된 파일만 복사해서 저장한다?”
➡️ 반만 맞고, 반은 틀립니다.
✅ 정확한 의미
diff = 이전 레이어 대비
파일시스템에 ‘무슨 변화가 있었는지’에 대한 기록
여기서 “변화”에는 3가지가 있습니다.
| 변화 종류 | 의미 |
|---|---|
| 생성 | 새 파일/디렉터리 추가 |
| 수정 | 기존 파일 내용 변경 |
| 삭제 | 기존 파일 제거 표시 |
📌 중요
삭제도 “기록”이지, 이전 파일을 지우는 게 아닙니다.
2️⃣ 타임라인으로 보는 레이어 (핵심 이해 포인트)
📦 Layer 0 (base image)
/
├── bin/
├── etc/
└── usr/
📦 Layer 1
RUN echo "hello" > /hello.txt
Layer 1에 저장되는 diff
+ /hello.txt (내용: hello)
❗ 루트 전체가 아니라
❗ “hello.txt가 추가됐다”라는 기록만 있음
📦 Layer 2
RUN echo "world" >> /hello.txt
Layer 2에 저장되는 diff
~ /hello.txt (내용: hello\nworld)
📌 여기서 중요한 사실:
- Layer 2는 hello.txt 전체를 새로 저장
- “hello → world만 저장” ❌
- 파일 단위로 다시 저장 ✅
3️⃣ “그럼 전체 파일을 저장하는데, diff가 맞아?”
여기서 대부분 헷갈립니다.
🔑 핵심 문장
diff는 ‘파일시스템 전체 기준’이 아니라
‘이전 레이어 대비’ 기준이다
즉,
- Layer 2는
/,/bin,/usr❌- 오직
/hello.txt하나만 다시 저장
그래서 파일시스템 전체 관점에서는 diff입니다.
4️⃣ 삭제가 diff라는 게 무슨 뜻인가? (가장 헷갈리는 부분)
Dockerfile
RUN rm /hello.txt
Layer 3에 저장되는 diff
- /hello.txt (삭제 마킹)
📌 중요한 사실:
- Layer 1, Layer 2에 있던
/hello.txt실제 데이터는 그대로 존재 - Layer 3에는
“이 파일은 위에서 안 보이게 해라”
라는 화이트아웃(whiteout) 기록만 있음
5️⃣ Union File System이 하는 일 (눈속임의 핵심)
컨테이너에서 /hello.txt를 조회하면:
- Layer 3: 삭제됨 → 무시
- Layer 2: 있음 → 사용
이걸 자동으로 합쳐서
“/hello.txt는 없는 것처럼 보이게”
👉 이게 Union FS의 역할입니다.
6️⃣ 왜 이미지 용량이 줄지 않는가 (여기서 모든 게 연결됨)
Dockerfile
RUN apt-get install -y curl
RUN rm -rf /var/lib/apt/lists/*
레이어 관점
Layer N:
+ /var/lib/apt/lists/* (50MB)
Layer N+1:
- /var/lib/apt/lists/* (삭제 마킹)
📌 결과:
- 파일은 위에서 안 보일 뿐
- 디스크에는 그대로 존재
- 그래서 이미지 용량 줄지 않음
7️⃣ “같은 레이어에서 지워야 한다”의 정확한 의미
RUN apt-get update \
&& apt-get install -y curl \
&& rm -rf /var/lib/apt/lists/*
이 경우:
- apt 파일이 생성되고
- 같은 레이어에서 삭제됨
- → 아예 diff에 기록되지 않음
📌 “지웠다”가 아니라
📌 “생긴 적이 없는 것처럼” 되는 것
8️⃣ 비유 하나 (현실적인 비유)
📒 레이어 = 수정 이력 노트
| 페이지 | 내용 |
|---|---|
| 1 | hello.txt 추가 |
| 2 | hello.txt 수정 |
| 3 | hello.txt 삭제 |
📌 노트를 다 합쳐서 읽으면:
hello.txt 없음
📌 하지만 노트 자체에는
- 추가 기록
- 수정 기록
- 삭제 기록
모두 남아 있음
🎯 최종 핵심 문장 (이 문장만 기억하셔도 됩니다)
도커 레이어는
“현재 상태”를 저장하지 않는다.
“어떻게 변했는지”만 저장한다.
그래서:
- 삭제해도 용량이 줄지 않고
- 캐시가 강력하며
- 레이어 공유가 가능해집니다.
'Docker' 카테고리의 다른 글
| Spring Boot 앱의 JAR 파일 구조 (0) | 2025.12.30 |
|---|---|
| overlay2 (1) | 2025.12.30 |
| Docker Layer (0) | 2025.12.30 |
| COPY --from=build (0) | 2025.12.30 |
| Multi-Stage Build (0) | 2025.12.30 |