Docker 이미지는 단일 파일이 아닌, 읽기 전용(Read-Only)의 여러 레이어(Layer)가 적층된 구조다. 이를 구현하기 위해 Union File System (UnionFS) 또는 OverlayFS 기술이 사용된다.
예를 들어 우분투 14.04 이미지를 다운받아서 컨테이너를 생성하는 과정을 살펴보자.
터미널에 다음과 같이 실행하면 아래와 같은 로그가 뜬다.
docker run -it ubuntu:14.04 /bin/bash
docker run -it ubuntu:14.04 /bin/bash
Unable to find image 'ubuntu:14.04' locally
14.04: Pulling from library/ubuntu
2e6e20c8e2e6: Pull complete
0551a797c01d: Pull complete
512123a864da: Pull complete
Digest: sha256:64483f3496c1373bfd55348e88694d1c4d0c9b660dee6bfef5e12f43b9933b30
Status: Downloaded newer image for ubuntu:14.04
로그에 출력된 Pull complete 메시지가 여러 줄인 이유는 Docker 이미지가 단일 파일이 아닌, 읽기 전용(Read-Only)의 여러 레이어(Layer)가 적층된 구조이기 때문이다. 이는 Union File System 기술을 통해 구현되며, 동일한 베이스 이미지(예: Ubuntu)를 사용하는 다른 이미지를 빌드하거나 실행할 때, 로컬 스토리지에 캐시된 레이어를 재사용하여 I/O 효율성을 극대화한다.
레이어 캐싱(Layer Caching)의 기술적 의미를 디스크(Storage) 관점과 네트워크(Network) 관점으로 나누어 분석하면 다음과 같다.
1. 기술적 메커니즘: SHA256 해시 기반의 중복 제거 (Deduplication)
Docker 이미지는 단일 바이너리가 아니라, Manifest라는 명세서와 여러 개의 Blob(바이너리 데이터 조각, 즉 레이어)으로 구성된다.
- 고유 식별자 (Digest): 각 레이어는 해당 파일 시스템의 내용물을 해시(SHA256) 알고리즘으로 계산한 고유한 ID를 가진다.
- 비교 로직: 새로운 이미지를 다운로드(Pull)하거나 빌드(Build)할 때, Docker 데몬은 로컬 스토리지(/var/lib/docker/overlay2 등)에 동일한 해시값을 가진 레이어가 존재하는지 먼저 확인한다.
2. 작동 예시
상황: 로컬 PC에 아무런 이미지도 없는 상태에서 두 개의 이미지를 순차적으로 받는다고 가정
- 이미지 A: Ubuntu 20.04 (베이스) + Nginx
- 이미지 B: Ubuntu 20.04 (베이스) + Python
1단계: 이미지 A (Ubuntu + Nginx) 다운로드
- Docker는 Ubuntu 20.04 레이어(약 70MB)와 Nginx 레이어(약 50MB)를 모두 다운로드하고 디스크에 쓴다.
- 총 I/O: 약 120MB 다운로드 및 디스크 쓰기 발생.
2단계: 이미지 B (Ubuntu + Python) 다운로드
- 이미지 B의 Manifest를 분석하니, 베이스 레이어가 Ubuntu 20.04이다.
- Docker는 로컬 스토리지에 Ubuntu 20.04 레이어의 해시값이 이미 존재함을 감지한다.
- 동작 결과:
- Ubuntu 레이어: 다운로드하지 않고(Network I/O 절약), 디스크에 새로 쓰지도 않는다(Disk I/O 절약). 기존에 저장된 레이어를 논리적으로 링크(Link)만 건다.
- Python 레이어: 로컬에 없으므로 이 부분만 새로 다운로드하고 저장한다.
- 총 I/O: Python 레이어 크기만큼만 발생.

3. I/O 효율성 극대화
이는 다음 세 가지 측면에서의 리소스 절약을 의미한다.
- Network I/O (대역폭 절약):
- 이미 가지고 있는 베이스 이미지 레이어는 네트워크를 통해 다시 전송받지 않는다. docker pull 실행 시 Already exists라고 뜨는 항목이 바로 이 경우다.
- Disk I/O (쓰기 작업 감소):
- 디스크에 데이터를 기록하는 물리적인 작업(Write Operation) 횟수가 줄어든다. 이는 디스크 수명 연장과 성능 향상에 기여한다.
- Storage Capacity (공간 효율성):
- 물리적인 디스크 공간을 중복해서 차지하지 않는다. Ubuntu 이미지를 기반으로 한 컨테이너가 100개 실행되더라도, 디스크상에는 단 하나의 Ubuntu 베이스 레이어 데이터만 존재한다(Read-Only 레이어 공유).
즉, "데이터의 내용이 같다면, 물리적으로 단 한 번만 저장하고 나머지는 그 위치를 참조한다"는 원칙을 통해 불필요한 네트워크 트래픽과 디스크 입출력을 제거한다는 의미다.
'AI Journey > 클라우드' 카테고리의 다른 글
| [Docker] 컨테이너 생명주기(lifecycle)와 PID 1 프로세스 아키텍처 (0) | 2025.12.29 |
|---|---|
| [Docker] 런타임 모드와 표준 스트림(stdio) 제어 (0) | 2025.12.29 |
| [Docker] 우분투에 도커 설치하기 (0) | 2025.12.26 |
| [Docker] 도커의 아키텍처와 동작 원리, 기술 동향 정리 (0) | 2025.12.26 |
| 도커(Docker)와 컨테이너 기술의 개념 이해하기 (2) | 2025.12.24 |