OverlayFS
이 문서는 리눅스 Union 파일시스템인 OverlayFS의 개요를 살피고, Docker에서 어떻게 활용되는지 학습합니다.
OverlayFS is a modern union filesystem that is simple, fast and memory efficient.
It allows one filesystem to be overlaid on top of another, combining them into a single view.OverlayFS는 현대적인 Union 파일시스템으로 단순하고 빠르며 메모리 효율적입니다.
하나의 파일시스템을 다른 파일시스템 위에 겹쳐서overlay 단일 뷰로 결합할 수 있습니다.
출처: Linux Kernel OverlayFS Documentation
OverlayFS = Layered Filesystem
OverlayFS는 Docker의 기본 스토리지 드라이버로 사용되며, 컨테이너 이미지의 레이어 구조를 효율적으로 구현합니다.
여러 레이어를 하나의 통합된 뷰로 제공하여 디스크 공간과 메모리를 절약합니다.
OverlayFS의 개념
OverlayFS는 여러 디렉토리를 하나로 합쳐서 보여주는 파일시스템입니다.
변경사항은 상위 레이어에만 기록되며, 하위 레이어는 읽기 전용으로 유지됩니다.
도커 마스터즈 강의에서 도커 이미지의 overlay가 중요한 개념이라 강조해주신 내용이 생각났습니다.
주요 구성 요소
구성요소는 다음과 같습니다. 도커에도 동일하게 적용되는 개념이니 숙지하겠습니다:
- Lower Layer(s): 읽기 전용 레이어. 여러 개 가능. 기본 파일시스템
- 변경되지 않는 원본 데이터
- 여러 컨테이너가 공유 가능
- Upper Layer: 읽기/쓰기 레이어. 모든 변경사항이 여기에 저장
- 파일 생성, 수정, 삭제 기록
- 컨테이너마다 독립적으로 존재
- Merged: 통합된 뷰. 사용자가 실제로 보는 파일시스템
- Lower + Upper의 결합
- Work Directory: OverlayFS 내부 작업용 디렉토리
- 파일 복사 및 이동 작업에 사용
OverlayFS의 동작 원리
Copy-on-Write (CoW)
OverlayFS는 Copy-on-Write 방식으로 동작한다고 합니다.
| 연산 | 동작 방식 |
|---|---|
| 읽기 | Upper에 있으면 Upper에서, 없으면 Lower에서 읽기 |
| 생성 | Upper에 새 파일 생성 |
| 수정 | Lower의 파일을 Upper로 복사 후 수정 (CoW) |
| 삭제 | Upper에 "삭제 마커" (whiteout) 생성. Lower는 그대로 유지 |
| 이름 변경 | Upper에서 처리. Lower 파일은 CoW 후 이름 변경 |
OverlayFS 실습
기본 OverlayFS 마운트
OverlayFS를 직접 생성하고 동작을 확인해보겠습니다.
# 디렉토리 구조 생성
mkdir -p /tmp/overlay-test/{lower,upper,work,merged}
# Lower 레이어에 파일 생성
echo "Lower Layer File" > /tmp/overlay-test/lower/file1.txt
echo "Original File" > /tmp/overlay-test/lower/file2.txt
# OverlayFS 마운트 - tmp 경로에서 실행합니다:
sudo mount -t overlay overlay \
-o lowerdir=/tmp/overlay-test/lower,\
upperdir=/tmp/overlay-test/upper,\
workdir=/tmp/overlay-test/work \
/tmp/overlay-test/merged
# 마운트 확인
mount | grep overlay
ls -la /tmp/overlay-test/merged

Copy-on-Write Practice
리눅스에서 직접 overlayfs를 사용하여 파일을 생성하고 수정해보았습니다.

# Merged에서 파일 확인
cat /tmp/overlay-test/merged/file1.txt
# 출력: Lower Layer File
# Upper 레이어 확인 (아직 비어있음)
ls /tmp/overlay-test/upper
# 출력: (비어있음)
# Merged에서 파일 수정
echo "Modified in Upper" >> /tmp/overlay-test/merged/file1.txt
# Upper 레이어 확인 (파일이 복사됨)
ls /tmp/overlay-test/upper
cat /tmp/overlay-test/upper/file1.txt
# 출력: Lower Layer File
# Modified in Upper
# Lower 레이어는 변경되지 않음
cat /tmp/overlay-test/lower/file1.txt
# 출력: Lower Layer File
# 언마운트
sudo umount /tmp/overlay-test/merged
# 디렉토리 삭제
rm -rf /tmp/overlay-test
Docker와 OverlayFS
Docker는 overlay2 스토리지 드라이버를 기본으로 사용합니다.
각 이미지 레이어는 OverlayFS의 Lower 레이어로, 컨테이너 레이어는 Upper 레이어로 동작합니다.
Docker 이미지 레이어 구조
# Docker 스토리지 드라이버 확인
docker info | grep "Storage Driver"
# 출력: Storage Driver: overlay2
# Docker 루트 디렉토리 확인
docker info | grep "Docker Root Dir"
# 출력: Docker Root Dir: /var/lib/docker

OverlayFS의 장점과 한계
장점
- 디스크 공간 절약: 여러 컨테이너가 동일한 이미지 레이어 공유
- 100개의 컨테이너가 같은 베이스 이미지를 사용해도 베이스 레이어는 1개만 저장
- 빠른 컨테이너 시작: 레이어를 복사하지 않고 마운트만 하면 됨
- AUFS보다 성능이 우수
- 메모리 효율성: 페이지 캐시를 효율적으로 사용
- 간단한 구조: AUFS보다 구현이 단순하고 안정적
- 커널 메인라인 포함: 리눅스 커널 3.18부터 공식 지원
한계
이미지 컨테이너의 레이어 수와 각종 리소스를 제한하는 등의 적절한 최적화와 관리가 필요합니다.
- inode 제한: 많은 레이어를 사용하면 inode 소비 증가
- 파일 복사 오버헤드: 큰 파일 수정 시 전체 파일을 Upper로 복사 (CoW)
- 데이터베이스 파일 등 대용량 파일 수정 시 성능 저하
- rename(2) 제한: 특정 상황에서 EXDEV 에러 발생 가능
- 하드링크 제한: Lower 레이어 간 하드링크가 깨질 수 있음
Mount, Namespace, OverlayFS의 관계
| 구분 | Mount | Namespace | OverlayFS |
|---|---|---|---|
| 목적 | 파일시스템 연결 | 격리된 뷰 | 레이어 통합 |
| 기능 | "어디에 연결" | "무엇을 볼 수 있는가" | "어떻게 합치는가" |
| 예시 | /dev/sda1 → /mnt | 독립적인 마운트 테이블 | 여러 레이어 → 단일 뷰 |
| Docker 역할 | 볼륨 마운트 | 격리된 파일시스템 | 이미지 레이어 관리 |
Mount = Where Storage Connects
Namespace = What You Can See
OverlayFS = How Layers Merge
세 기술이 함께 작동하여 Docker 컨테이너의 파일시스템을 구현합니다:
- Mount: 볼륨과 바인드 마운트로 데이터 제공
- Mount Namespace: 컨테이너마다 독립적인 파일시스템 뷰
- OverlayFS: 효율적인 이미지 레이어 관리