Docker 레이어(Docker Layers)란?

Docker 레이어는 Docker 이미지가 여러 단계의 읽기 전용 계층(레이어)으로 구성된다는 개념을 설명합니다. Docker는 이러한 레이어를 재사용 가능하고 효율적으로 관리하여, 저장 공간을 절약하고 빌드 및 배포 속도를 높입니다.


1. Docker 레이어의 주요 개념

  1. 읽기 전용 레이어:

    • Docker 이미지는 여러 읽기 전용 레이어로 구성됩니다.
    • 각 레이어는 Dockerfile의 명령어 하나(RUN, COPY, ADD 등)에 해당합니다.
    • 예: 아래 Dockerfile의 각 명령은 레이어를 만듭니다.
      FROM ubuntu:latest       # 첫 번째 레이어
      RUN apt-get update       # 두 번째 레이어
      RUN apt-get install -y curl  # 세 번째 레이어
  2. 컨테이너 레이어:

    • 컨테이너를 실행할 때 쓰기 가능한 레이어가 생성됩니다.
    • 이 레이어는 컨테이너의 상태 변화(파일 생성, 수정, 삭제 등)를 기록합니다.
    • 컨테이너가 삭제되면 쓰기 가능한 레이어도 함께 삭제됩니다.
  3. 레이어 재사용:

    • 동일한 레이어가 다른 이미지에서 사용될 경우, Docker는 해당 레이어를 다시 다운로드하거나 저장하지 않고 캐시를 재사용합니다.
    • 예: 같은 ubuntu:latest를 사용하는 여러 이미지는 같은 베이스 레이어를 공유.

2. Docker 레이어의 구조

  1. 베이스 레이어(Base Layer):

    • 모든 Docker 이미지는 특정 베이스 이미지(예: ubuntu:latest)를 기반으로 시작합니다.
    • 베이스 이미지는 다른 이미지가 의존하는 가장 아래 단계의 레이어입니다.
  2. 중간 레이어(Intermediate Layers):

    • Dockerfile의 각 명령(RUN, COPY, ADD)은 새로운 레이어를 생성합니다.
    • 중간 레이어는 읽기 전용 상태로 저장되며, 이미 빌드된 중간 레이어는 다시 빌드되지 않습니다.
  3. 최종 이미지(Final Image):

    • 모든 읽기 전용 레이어를 합쳐 최종 이미지가 생성됩니다.
    • 최종 이미지는 레이어들의 스택으로 볼 수 있습니다.
  4. 컨테이너 레이어(Container Layer):

    • 컨테이너 실행 시 추가되는 쓰기 가능한 레이어.
    • 컨테이너가 삭제되면 해당 레이어도 삭제됩니다.

3. Docker 레이어의 작동 방식

3.1 레이어 생성

  • Dockerfile의 명령어 하나가 실행될 때마다 새로운 레이어가 생성됩니다.
  • 레이어는 읽기 전용 상태로 저장되며, 새로운 명령어는 이전 레이어 위에 추가됩니다.

3.2 레이어 캐싱

  • Docker는 이전에 빌드된 레이어를 캐시로 저장하고, 동일한 명령이 다시 실행될 때 해당 캐시를 재사용합니다.
  • 예: 같은 apt-get update 명령이 있으면 이전 레이어를 재사용.

3.3 레이어 결합

  • 이미지는 여러 레이어가 결합된 상태로 저장되며, 실행 시에는 레이어들이 투명하게 병합됩니다.

4. Docker 레이어의 장점

  1. 효율적인 스토리지 사용:

    • 동일한 레이어는 여러 이미지와 컨테이너에서 공유되므로 저장 공간을 절약.
  2. 빠른 빌드 속도:

    • Docker는 변경된 명령어 이후의 레이어만 다시 빌드하므로, 빌드 시간이 크게 단축.
  3. 배포 속도 최적화:

    • 변경된 레이어만 전송하면 되므로 이미지 배포 시간이 감소.
  4. 유지보수 용이:

    • 각 레이어가 명확히 분리되어 있어, 문제를 디버깅하거나 이미지를 수정하기 쉬움.

5. Docker 레이어 관리 명령

  1. 레이어 확인

    • Docker 이미지의 레이어를 확인하려면:
      docker history <image-name>
      예: ubuntu:latest의 레이어 확인
      docker history ubuntu:latest
  2. 레이어 캐시 삭제

    • 불필요한 캐시 레이어를 삭제하려면:
      docker system prune
  3. 컨테이너 레이어 확인

    • 실행 중인 컨테이너의 레이어를 확인하려면:
      docker inspect <container-id>

6. Dockerfile 작성 시 레이어 최적화

6.1 레이어 수 최소화

  • 명령어를 합쳐 레이어 수를 줄입니다.

    # 비효율적
    RUN apt-get update
    RUN apt-get install -y curl
    
    # 최적화
    RUN apt-get update && apt-get install -y curl

6.2 불필요한 파일 제거

  • 빌드 과정에서 임시 파일이나 캐시를 제거합니다.
    RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*

6.3 캐싱 유효성 관리

  • 종속성이 자주 변경된다면 명령 순서를 조정하여 캐시를 유효하게 유지합니다.
    COPY requirements.txt /app/
    RUN pip install -r /app/requirements.txt

7. 요약

  • Docker 레이어는 이미지가 여러 단계로 구성되어 있으며, 읽기 전용 상태로 저장되고 재사용됩니다.
  • 레이어 기반 구조는 저장 공간을 절약하고 빌드 및 배포 속도를 최적화합니다.
  • 레이어 관리 및 Dockerfile 최적화를 통해 효율적인 컨테이너 환경을 구축할 수 있습니다. 😊

'Docker' 카테고리의 다른 글

도커 인 액션 3장  (0) 2024.12.04
ext4 (Extended Filesystem 4)  (1) 2024.12.04
Root 파일 시스템(root filesystem)  (1) 2024.12.04
scratch  (0) 2024.12.04
Surface Area  (1) 2024.12.04

+ Recent posts