Skip to main content

11/23/2025

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

overlay-1

Copy-on-Write Practice​

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

overlay-2

# 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

overlay-3 overlay-4


OverlayFS의 장점과 한계​

장점​

  • 디스크 공간 절약: 여러 컨테이너가 동일한 이미지 레이어 공유
    • 100개의 컨테이너가 같은 베이스 이미지를 사용해도 베이스 레이어는 1개만 저장
  • 빠른 컨테이너 시작: 레이어를 복사하지 않고 마운트만 하면 됨
    • AUFS보다 성능이 우수
  • 메모리 효율성: 페이지 캐시를 효율적으로 사용
  • 간단한 구조: AUFS보다 구현이 단순하고 안정적
  • 커널 메인라인 포함: 리눅스 커널 3.18부터 공식 지원

한계​

이미지 컨테이너의 레이어 수와 각종 리소스를 제한하는 등의 적절한 최적화와 관리가 필요합니다.

  • inode 제한: 많은 레이어를 사용하면 inode 소비 증가
  • 파일 복사 오버헤드: 큰 파일 수정 시 전체 파일을 Upper로 복사 (CoW)
    • 데이터베이스 파일 등 대용량 파일 수정 시 성능 저하
  • rename(2) 제한: 특정 상황에서 EXDEV 에러 발생 가능
  • 하드링크 제한: Lower 레이어 간 하드링크가 깨질 수 있음

Mount, Namespace, OverlayFS의 관계​

구분MountNamespaceOverlayFS
목적파일시스템 연결격리된 뷰레이어 통합
기능"어디에 연결""무엇을 볼 수 있는가""어떻게 합치는가"
예시/dev/sda1 → /mnt독립적인 마운트 테이블여러 레이어 → 단일 뷰
Docker 역할볼륨 마운트격리된 파일시스템이미지 레이어 관리

Mount = Where Storage Connects
Namespace = What You Can See
OverlayFS = How Layers Merge

세 기술이 함께 작동하여 Docker 컨테이너의 파일시스템을 구현합니다:

  • Mount: 볼륨과 바인드 마운트로 데이터 제공
  • Mount Namespace: 컨테이너마다 독립적인 파일시스템 뷰
  • OverlayFS: 효율적인 이미지 레이어 관리

참고 자료​