2025. 12. 30. 21:04ㆍDocker
overlay2는 “레이어는 diff만 저장된다”는 개념이 실제로 어떻게 구현되는지를 보여주는 핵심 파일시스템 드라이버입니다.



🧠 overlay2 한 문장 정의
overlay2는 Linux OverlayFS를 사용해
여러 개의 읽기 전용 레이어(diff)를 하나의 파일시스템처럼 합쳐 보여주고,
쓰기 작업은 맨 위의 전용 레이어에만 기록하는 방식입니다.
1️⃣ overlay2가 필요한 이유 (문제부터)
도커 이미지는 이렇게 생겼습니다.
Layer A (base)
Layer B (apt install)
Layer C (copy app)
하지만 Linux 커널은 원래
- 파일시스템을 하나만 마운트해서 사용합니다.
❓ 그럼 질문:
“여러 레이어를 어떻게 하나처럼 보이게 하지?”
👉 그 해답이 OverlayFS,
👉 도커 구현체가 overlay2입니다.
2️⃣ overlay2의 기본 구성 요소 (아주 중요)
overlay2는 항상 이 3가지를 씁니다.
| 구성 요소 | 의미 |
|---|---|
| lowerdir | 읽기 전용 레이어들 (이미지 레이어) |
| upperdir | 쓰기 레이어 (컨테이너 전용) |
| merged | 최종적으로 보이는 가짜(?) 파일시스템 |
⚠️ merged는 실제 저장소가 아니라
lower + upper를 합쳐서 보여주는 뷰(view) 입니다.
3️⃣ 실제 디렉터리 구조 (진짜 중요)
/var/lib/docker/overlay2/
├── l/
│ ├── ABC123 -> ../xyz/diff
│ ├── DEF456 -> ../uvw/diff
│
├── xyz/
│ ├── diff/ ← lower layer 실제 파일
│ ├── link
│
├── container-id/
│ ├── diff/ ← upperdir (쓰기 레이어)
│ ├── merged/ ← 우리가 보는 파일시스템
│ ├── work/
핵심만 정리하면
diff/: 실제 파일 저장merged/: 컨테이너 안에서 보이는 경로work/: OverlayFS 내부 작업용 (신경 안 써도 됨)
4️⃣ 파일을 “읽을 때” overlay2는 어떻게 동작하나?
컨테이너에서:
cat /etc/os-release
overlay2의 동작 순서:
- upperdir(diff) 에 파일 있나?
- 없으면 lowerdir 들을 위에서부터 차례대로 탐색
- 가장 위 레이어의 파일을 사용
📌 즉,
“위에 있으면 위 걸 쓰고, 없으면 아래서 가져온다”
5️⃣ 파일을 “수정”하면 무슨 일이 벌어질까? (Copy-on-Write)
상황
/etc/nginx/nginx.conf- 이 파일은 이미지 레이어(lowerdir) 에 있음
컨테이너에서:
vi /etc/nginx/nginx.conf
overlay2의 실제 동작
- lowerdir 파일은 읽기 전용
- 수정 시도 감지
- 파일을 upperdir(diff) 로 복사
- 복사본을 수정
- 이후부터는 upperdir 파일만 사용
📌 이것이 Copy-on-Write (COW) 입니다.
❗ 이미지 레이어는 절대 변경되지 않습니다.
6️⃣ “삭제”는 어떻게 표현될까? (화이트아웃, 핵심)
rm /etc/nginx/nginx.conf
실제로 벌어지는 일
- lowerdir의 파일 ❌ 삭제 안 됨
- upperdir에 whiteout 파일 생성
.upperdir/
├── .wh.nginx.conf
이 의미는:
“이 파일은 아래 레이어에 있더라도
merged 뷰에서는 없는 것처럼 처리해라”
📌 그래서:
- 용량은 줄지 않고
- 파일만 안 보이게 되는 겁니다.
7️⃣ 그래서 “레이어는 diff만 저장한다”는 말의 정확한 뜻
overlay2 관점에서 보면:
| 행위 | upperdir에 기록되는 것 |
|---|---|
| 파일 생성 | 새 파일 |
| 파일 수정 | 수정된 전체 파일 |
| 파일 삭제 | whiteout 파일 |
📌 절대 기록하지 않는 것
- 파일시스템 전체
- 안 바뀐 파일들
👉 이것이 diff입니다.
8️⃣ 왜 overlay2는 빠르고 효율적인가?
① 레이어 공유
- lowerdir는 여러 컨테이너가 공유
- 디스크 절약 극대화
② 캐시 친화적
- 레이어가 불변(immutable)
- 빌드 캐시 정확
③ 커널 네이티브
- FUSE ❌
- Linux VFS 레벨에서 처리 → 빠름
9️⃣ overlay2의 한계 (현실적인 단점)
| 항목 | 설명 |
|---|---|
| 대량 쓰기 | upperdir 성능이 한계 |
| DB 사용 | 권장 ❌ (volume 권장) |
| inode 증가 | 레이어 많으면 관리 부담 |
👉 그래서 DB, 로그, 상태 데이터는 volume 사용이 원칙입니다.
🔟 한 문장으로 다시 정리
overlay2는
“읽기는 아래에서, 쓰기는 위에서,
삭제는 표시만”
하는 방식으로
레이어 기반 이미지를 현실 파일시스템으로 만든 구현체입니다.
'Docker' 카테고리의 다른 글
| Union File System & Overlay File System (0) | 2025.12.31 |
|---|---|
| Spring Boot 앱의 JAR 파일 구조 (0) | 2025.12.30 |
| 도커 이미지 레이어는 diff만 저장한다. (0) | 2025.12.30 |
| Docker Layer (0) | 2025.12.30 |
| COPY --from=build (0) | 2025.12.30 |