[Docker] Docker Image 내부 구조

Uk-Jake·2024년 10월 14일

Docker

목록 보기
3/11
post-thumbnail

Docker Image 내부 구조

1. Docker 이미지란?

  • Docker 이미지는 애플리케이션의 모든 것을 패키징하여 쉽게 배포, 실행할 수 있도록 필요한 환경들을 묶어 놓은 읽기 전용 템플릿입니다.
  • Docker 이미지는 애플리케이션을 실행하는 데 필요한 환경들을 포함한 읽기 전용 템플릿입니다.
  • 이미지는 컨테이너가 실행될 때 사용되며, 여러 개의 불변의 레이어(Layers)로 구성됩니다.

이미지와 컨테이너의 차이점

  • 이미지: 애플리케이션의 실행 전 상태로, 불변성을 가집니다.
  • 컨테이너: 이미지를 실행한 상태이며, 애플리케이션이 작동 중인 격리된 환경입니다. 컨테이너는 이미지 기반이지만, 쓰기 가능한 레이어를 추가하여 실행됩니다.

2. Docker 이미지의 레이어(Layers) 구조

  • Docker 이미지는 하나의 레이어로 구성된 것이 아니라, 여러 개의 레이어가 쌓여 이루어집니다.
  • 각 레이어는 Dockerfile의 명령어 실행 결과로 생성되며, 이전 레이어 위에 차곡차곡 쌓입니다.

레이어의 개념

  • Docker 레이어는 불변(Immutable)한 파일 시스템 스냅샷으로, 각 레이어는 이전 상태에 대한 변화만을 포함합니다. 예를 들어, RUN apt-get update 명령어를 실행하면 패키지 업데이트에 해당하는 파일들이 새로운 레이어에 저장됩니다.
  • 두 개의 컨테이너에서 동일한 레이어를 필요로 한다면 추가 다운없이 재사용 가능합니다.

레이어의 불변성(Immutable)

  • 한 번 생성된 레이어는 변경할 수 없으며, 레이어가 변경될 경우 새로운 레이어가 생성됩니다.
  • 불변성으로 인해 Docker 이미지는 안정적인 배포가 가능합니다.

레이어가 효율성을 높이는 방법

  • 레이어는 캐시로 재사용되며, 동일한 레이어를 여러 컨테이너에서 공유할 수 있어 디스크 공간 절약과 빌드 속도를 개선합니다.
  • 예를 들어, ubuntu 베이스 이미지를 여러 Dockerfile에서 사용하면 해당 레이어는 한 번만 다운로드되고 모든 컨테이너에서 공유됩니다.

3. Docker 이미지의 베이스 이미지(Base Image)

베이스 이미지란 무엇인가?

  • 베이스 이미지는 Docker 이미지의 최하단에 위치하는 기본적인 레이어입니다.
  • 베이스 이미지는 운영체제의 파일 시스템을 포함하며, 애플리케이션 실행에 필요한 환경을 제공합니다.

4. Docker 이미지 빌드 과정: Dockerfile을 통한 레이어 생성

Dockerfile의 역할

  • Dockerfile은 Docker 이미지를 빌드하기 위한 스크립트 파일로 이미지가 어떻게 생성될지, 어떤 파일이 복사되고 어떤 명령어가 실행될지가 작성되어 있습니다.

Dockerfile 명령어별 레이어 생성

  • FROM: 베이스 이미지를 지정
  • RUN: 명령어를 실행하여 새로운 레이어를 생성
  • COPY/ADD: 파일을 복사하거나 추가
  • CMD: 컨테이너가 시작될 때 실행할 기본 명령어를 지정

Dockerfile을 사용한 이미지 빌드 단계

FROM ubuntu:20.04
RUN apt-get update
RUN apt-get install -y python3
COPY . /app
CMD ["python3", "/app/main.py"]
  1. Base Image로 ubuntu:20.04 지정
  2. apt-get update 실행
  3. apt-get install -y python3 실행
  4. 현재 디렉토리에 있는 모든 파일을 /app 에 복사
  5. ["python3", "/app/main.py"] 기본 명령어 지정

6. Docker 이미지 레이어의 장점

  1. 빠른 빌드 및 배포
    • Docker는 캐싱된 레이어를 재사용하여 이미지 빌드 속도를 단축시킬 수 있습니다.
    • 만약 7개의 레이어로 구성된 이미지가 6번째에서만 수정사항이 있다면 1~5번은 캐싱된 데이터를 사용하고 6~7번은 새로 빌드합니다.
  2. 레이어 공유를 통한 디스크 공간 절약
    • 여러 컨테이너가 동일한 이미지의 레이어를 공유하므로 디스크 공간이 절약됩니다.
  3. 변경 사항 최소화로 인한 관리 용이성
    • 이미지의 각 레이어는 이전 레이어에 대한 차이만 기록하므로, 변경 사항이 최소화됩니다.

7. Docker 이미지 내부 구조 확인하기

  • docker history 명령어로 이미지 레이어 확인 docker history 명령어를 사용하면 특정 이미지가 어떤 명령어에 의해 생성되었고, 어떤 레이어가 추가되었는지 확인할 수 있습니다.
    docker history <이미지 이름>
  • docker inspect로 이미지 메타데이터 확인 docker inspect 명령어는 Docker 이미지에 대한 상세한 정보를 제공합니다. 이미지의 레이어, 환경 변수, 포트 설정 등을 확인할 수 있습니다.
    docker inspect <이미지 이름>

0개의 댓글