개인의 기록
  • 소개
  • 프로젝트
  • 글
  • 링크

© 2026 newgirok

← 글 목록

Docker Image — 컨테이너를 만드는 읽기 전용 템플릿

2025년 6월 18일
DockerImageLayerRegistrydocker pull

컨테이너를 실행하려면 반드시 Image가 필요하다. Image는 실행 가능한 애플리케이션과 그 환경 전체를 담은 읽기 전용 템플릿으로, 이 템플릿을 기반으로 컨테이너가 생성된다. Image와 Container의 관계는 클래스와 인스턴스의 관계와 동일하다.

Image란 무엇인가

Docker Image는 파일 시스템 스냅샷과 실행 메타데이터(CMD, ENV, EXPOSE 등)를 묶은 패키지다. Image 자체는 변경이 불가능하며, 컨테이너를 실행하면 Image 위에 얇은 쓰기 가능 레이어(Writable Layer)가 하나 추가된다.

구분ImageContainer
상태읽기 전용읽기 + 쓰기
생명주기영구 보관실행 중에만 존재
비유클래스인스턴스

Layer 구조와 Union File System

Image는 단일 파일이 아니라 여러 Layer가 쌓인 구조다. 각 Layer는 Dockerfile의 명령어 하나(FROM, RUN, COPY 등)에 대응하며, 변경된 파일 차이만 저장한다.

┌─────────────────────────────┐
│  Writable Layer (Container) │  ← docker run 시 생성
├─────────────────────────────┤
│  Layer 3: COPY app /app     │  ← 읽기 전용
├─────────────────────────────┤
│  Layer 2: RUN npm install   │  ← 읽기 전용
├─────────────────────────────┤
│  Layer 1: FROM node:20      │  ← 읽기 전용 (Base Image)
└─────────────────────────────┘

Union File System(UnionFS) — 여러 디렉터리를 하나의 가상 파일 시스템으로 합쳐 보여주는 기술. Docker는 OverlayFS를 기본으로 사용한다.

Layer가 분리되어 있기 때문에, node:20 Base Image를 공유하는 두 Image는 해당 Layer를 디스크에 한 번만 저장한다. 이것이 Docker가 공간을 효율적으로 사용하는 핵심 원리다.

Docker Hub와 Registry

Registry는 Image를 저장하고 배포하는 서버다. 공식 공개 Registry는 Docker Hub(hub.docker.com)이며, 사내 환경에서는 AWS ECR, GCR, Harbor 같은 Private Registry를 사용한다.

docker pull node:20
       │
       ▼
  Docker Hub (Registry)
  └── library/node (Repository)
            └── 20 (Tag)

Repository — 동일한 Image의 여러 버전(Tag)을 묶는 단위. node:20, node:lts, node:alpine은 모두 같은 Repository의 다른 Tag다.

주요 CLI 명령어

# Registry에서 Image 내려받기
docker pull node:20

# 로컬에 저장된 Image 목록 확인
docker images

# 특정 Image 삭제 (컨테이너가 없어야 삭제 가능)
docker rmi node:20

# Image의 Layer 이력 확인
docker history node:20

# Image 상세 메타데이터 조회
docker inspect node:20

Image vs Container 실행 흐름

Registry
   │
   │  docker pull
   ▼
Local Image Store
   │
   │  docker run
   ▼
Container (Image Layer + Writable Layer)

docker run은 docker pull + docker create + docker start를 한 번에 수행한다. 로컬에 Image가 이미 있으면 pull 단계를 건너뛴다.

Layer 캐시 활용

Dockerfile 작성 시 변경 빈도가 낮은 명령어를 위쪽에 배치해야 빌드 캐시를 최대한 재사용할 수 있다.

FROM node:20

# 의존성은 먼저 복사 (자주 바뀌지 않음)
COPY package*.json ./
RUN npm install

# 소스코드는 나중에 복사 (자주 바뀜)
COPY . .

CMD ["node", "index.js"]

package.json이 바뀌지 않으면 npm install Layer는 캐시에서 그대로 재사용되므로 빌드 시간이 크게 단축된다.

← 이전 글Container vs VM — 가상화 방식의 차이
다음 글 →Docker Container — 이미지로 실행되는 격리된 프로세스