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"]
- Base Image로 ubuntu:20.04 지정
apt-get update 실행
apt-get install -y python3 실행
- 현재 디렉토리에 있는 모든 파일을 /app 에 복사
["python3", "/app/main.py"] 기본 명령어 지정
6. Docker 이미지 레이어의 장점
- 빠른 빌드 및 배포
- Docker는 캐싱된 레이어를 재사용하여 이미지 빌드 속도를 단축시킬 수 있습니다.
- 만약 7개의 레이어로 구성된 이미지가 6번째에서만 수정사항이 있다면 1~5번은 캐싱된 데이터를 사용하고 6~7번은 새로 빌드합니다.
- 레이어 공유를 통한 디스크 공간 절약
- 여러 컨테이너가 동일한 이미지의 레이어를 공유하므로 디스크 공간이 절약됩니다.
- 변경 사항 최소화로 인한 관리 용이성
- 이미지의 각 레이어는 이전 레이어에 대한 차이만 기록하므로, 변경 사항이 최소화됩니다.
7. Docker 이미지 내부 구조 확인하기
docker history 명령어로 이미지 레이어 확인 docker history 명령어를 사용하면 특정 이미지가 어떤 명령어에 의해 생성되었고, 어떤 레이어가 추가되었는지 확인할 수 있습니다.docker history <이미지 이름>
docker inspect로 이미지 메타데이터 확인 docker inspect 명령어는 Docker 이미지에 대한 상세한 정보를 제공합니다. 이미지의 레이어, 환경 변수, 포트 설정 등을 확인할 수 있습니다.docker inspect <이미지 이름>