목차
참고
🔍 이미지 레이어란?
Docker 이미지의 핵심적인 특징 중 하나는 레이어 기반 구조 입니다. Docker 이미지는 빌드시 한번에 만들어 지는 것이 아닌 기존 이미지에 레이어를 하나씩 쌓는 방식으로 이미지를 만듭니다.
이미지 레이어는 Dockerfile 에 있는 명령어를 실행할때 각 명령어별로 생성됩니다.. 각 레이어들은 읽기 전용 (read-only) 속성을 가지며, 순서대로 쌓여서 하나의 완전한 이미지를 구성합니다.
최종적으로 생성되는 이미지는 여러개의 레이어들이 쌓여서 만들어진 결과물이라 생각하면 됩니다.
✅ 레이어의 특징
- 캐싱
- 동일한 Dockerfile 명령어가 이전과 같다면 해당 레이어는 재사용됩니다.
- 캐싱된 이미지를 사용하면 빌드시간을 단축할 수 있습니다.
- 공유성
- 완성된 이미지는 별도로 존재하나 내부의 동일한 레이어는 중복되지 않고 공유되어 저장공간이 절약됩니다.
- 불변성
- 한번 만들진 레어는 변경이 불가능합니다.
- 변경하기 위해서는 새로운 명령어를 이용해 새로운 레어어로 덮어씌어야 합니다.
📋 Dockerfile 명령어별 레이어
아래 Dockerfile을 기준으로 이미지를 빌드하면 아래와 같이 각 명령어는 하나의 레이어를 생성합니다
# 1단계: 베이스 이미지 사용 |
각 명령어별 이미지 레이어 구조
[ Layer 4 ] - COPY . /app -> 소스코드 등 앱 파일을 /app에 복사 |
🕵️ 컨테이너 실행시 이미지 레이어
컨테이너 실행시 Docker 이미지 위에 쓰기 가능한 레이어(writable layer) 가 하나 추가되어 실행됩니다. 이 레이어는 컨테이너에서 생성되거나 수정된 파일을 저장하며, 컨테이너가 삭제되면 함께 사라집니다.
🤔 각 레이어는 이전명령어를 포함하는 것인가? 아니면 의존 관계인 것인가?
이미지 레이어를 공부하다보니 자연스럽게 생긴 의문이 각 이미지 레이어는 기존 이미지레이어를 포함하는 관계인가, 아니면 참조하는 관계인가 하는 의문이 생겼습니다. 결론부터 말하면 각 이미지 레이어는 레이어는 포함하는 게 아니라 “이전 레이어 위에 덧붙이는” 참조 관계입니다.
각 레이어는 그 이전 레이어를 이어받아 그 위에 파일 시스템의 변화만 기록합니다. 때문에, 각 레이어는 기존 레이어에 의존관계가 형성되게 됩니다.
🧐 레이어와 의존관계
FROM ubuntu:20.04 # Layer 1 |
- Layer 1: ubuntu:20.04의 기본 파일 시스템을 가진 상태
- Layer 2: Layer 1 위에 apt-get update로 패키지 목록 변경된 내용만 반영
- Layer 3: Layer 2 위에 vim 설치로 인한 파일 시스템 변경이 기록
레이어 자체는 변경된 내용만 저장하고, 그 내용을 이전 레이어 위에 명령어를 덧씌우는 방식
이기 때문에 특정 레이어만 떼어내서 단독으로 사용할 수 없습니다. 따라서, Layer 3 을 사용하기 위해서는 Layer 2, Layer 1 가 있어야 합니다.