Docker Layered Architecture와 Storage Driver
Dockerfile 명령이 이미지 레이어로 쌓이는 방식과 컨테이너 레이어의 Copy-on-Write 동작을 정리한다.
시리즈 · Container1 / 2
- Docker Layered Architecture와 Storage Driver
- 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 등이 있다.