본문 바로가기
Docker

Docker 레이어

by xogns93 2024. 12. 4.

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