도커 이미지 레이어는 diff만 저장한다.

2025. 12. 30. 21:02Docker

🔍 “레이어는 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를 조회하면:

  1. Layer 3: 삭제됨 → 무시
  2. 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