[Docker] 이미지 레이어

목차

참고

🔍 이미지 레이어란?

Docker 이미지의 핵심적인 특징 중 하나는 레이어 기반 구조 입니다. Docker 이미지는 빌드시 한번에 만들어 지는 것이 아닌 기존 이미지에 레이어를 하나씩 쌓는 방식으로 이미지를 만듭니다.

이미지 레이어는 Dockerfile 에 있는 명령어를 실행할때 각 명령어별로 생성됩니다.. 각 레이어들은 읽기 전용 (read-only) 속성을 가지며, 순서대로 쌓여서 하나의 완전한 이미지를 구성합니다.

최종적으로 생성되는 이미지는 여러개의 레이어들이 쌓여서 만들어진 결과물이라 생각하면 됩니다.

Docker 이미지 레이어Docker 이미지 레이어

✅ 레이어의 특징

  • 캐싱
    • 동일한 Dockerfile 명령어가 이전과 같다면 해당 레이어는 재사용됩니다.
    • 캐싱된 이미지를 사용하면 빌드시간을 단축할 수 있습니다.
  • 공유성
    • 완성된 이미지는 별도로 존재하나 내부의 동일한 레이어는 중복되지 않고 공유되어 저장공간이 절약됩니다.
  • 불변성
    • 한번 만들진 레어는 변경이 불가능합니다.
    • 변경하기 위해서는 새로운 명령어를 이용해 새로운 레어어로 덮어씌어야 합니다.

📋 Dockerfile 명령어별 레이어

아래 Dockerfile을 기준으로 이미지를 빌드하면 아래와 같이 각 명령어는 하나의 레이어를 생성합니다

# 1단계: 베이스 이미지 사용
FROM ubuntu:20.04
# 2단계: 패키지 업데이트
RUN apt-get update
# 3단계: 필요한 패키지 설치
RUN apt-get install -y python3
# 4단계: 애플리케이션 코드 복사
COPY . /app

각 명령어별 이미지 레이어 구조

[ Layer 4 ] - COPY . /app           -> 소스코드 등 앱 파일을 /app에 복사
[ Layer 3 ] - RUN apt install -> python3 설치
[ Layer 2 ] - RUN apt update -> 패키지 목록 갱신
[ Layer 1 ] - FROM ubuntu:20.04 -> 베이스 이미지 (Ubuntu OS)

🕵️ 컨테이너 실행시 이미지 레이어

컨테이너 실행시 Docker 이미지 위에 쓰기 가능한 레이어(writable layer) 가 하나 추가되어 실행됩니다. 이 레이어는 컨테이너에서 생성되거나 수정된 파일을 저장하며, 컨테이너가 삭제되면 함께 사라집니다.

🤔 각 레이어는 이전명령어를 포함하는 것인가? 아니면 의존 관계인 것인가?

이미지 레이어를 공부하다보니 자연스럽게 생긴 의문이 각 이미지 레이어는 기존 이미지레이어를 포함하는 관계인가, 아니면 참조하는 관계인가 하는 의문이 생겼습니다. 결론부터 말하면 각 이미지 레이어는 레이어는 포함하는 게 아니라 “이전 레이어 위에 덧붙이는” 참조 관계입니다.

각 레이어는 그 이전 레이어를 이어받아 그 위에 파일 시스템의 변화만 기록합니다. 때문에, 각 레이어는 기존 레이어에 의존관계가 형성되게 됩니다.

🧐 레이어와 의존관계

FROM ubuntu:20.04          # Layer 1
RUN apt-get update # Layer 2
RUN apt-get install -y vim # Layer 3
  • Layer 1: ubuntu:20.04의 기본 파일 시스템을 가진 상태
  • Layer 2: Layer 1 위에 apt-get update로 패키지 목록 변경된 내용만 반영
  • Layer 3: Layer 2 위에 vim 설치로 인한 파일 시스템 변경이 기록

레이어 자체는 변경된 내용만 저장하고, 그 내용을 이전 레이어 위에 명령어를 덧씌우는 방식 이기 때문에 특정 레이어만 떼어내서 단독으로 사용할 수 없습니다. 따라서, Layer 3 을 사용하기 위해서는 Layer 2, Layer 1 가 있어야 합니다.

Share