• docker
  • container

Docker Layered Architecture와 Storage Driver

Dockerfile 명령이 이미지 레이어로 쌓이는 방식과 컨테이너 레이어의 Copy-on-Write 동작을 정리한다.

시리즈 · Container1 / 2
  1. Docker Layered Architecture와 Storage Driver
  2. Docker vs Podman: Production에서 Podman을 선택한 이유

Docker 이미지가 레이어로 구성되는 방식과, 컨테이너 실행 시 그 위에 무엇이 추가되는지 정리한다.

이미지 레이어

Docker는 Dockerfile을 읽으면서 파일 시스템에 변화를 주는 명령마다 새로운 이미지 레이어를 만든다.

# Layer 1
FROM ubuntu

# Layer 2
RUN apt-get update && apt-get -y install python

# Layer 3
RUN pip install flask flask-mysql

# Layer 4
COPY . /opt/source-code

# Layer 5
ENTRYPOINT FLASK_APP=/opt/source-code/app.py flask run

이 Dockerfile에서는 5개의 레이어가 생성된다.

Layer 내용 크기
1 Base Ubuntu 120MB
2 apt 패키지 변경분 306MB
3 pip 패키지 변경분 6.3MB
4 소스 코드 229B
5 Entrypoint 갱신 0B

각 레이어는 이전 레이어 대비 변경 사항만 저장한다. 레이어는 캐시에 보관되어, 같은 Base Ubuntu 레이어가 필요한 다른 Dockerfile을 빌드할 때 재사용된다. 여러 이미지가 공유하는 만큼 이미지 레이어는 Read Only여야 한다.

컨테이너 레이어와 Copy-on-Write

컨테이너를 실행하면 Read Only인 이미지 레이어(1~5) 위에 쓰기 가능한 Container Layer(Layer 6)가 하나 추가된다. 컨테이너 안에서 이미지 레이어에 있는 파일을 수정하면, 원본을 건드리는 대신 해당 파일을 Container Layer로 복사한 뒤 그 복사본을 수정한다. 이를 Copy-on-Write라고 한다.

읽기 전용 이미지 레이어 위에 쓰기 가능한 컨테이너 레이어가 올라간 구조

Storage Driver

이런 레이어 구조를 실제로 구현하는 것이 Storage Driver다.

  • 레이어 관리: 이미지와 컨테이너의 각 레이어를 어떻게 저장하고, 캐시하고, 복제할지 결정한다.
  • 데이터 최적화: 레이어 합성과 복사 시 읽기/쓰기 효율을 담당한다.

종류로는 overlay2, AUFS, ZFS 등이 있다.

참고