Docker 이미지, 레이어 단위로 이해하고 최적화하기
⛳ 목표 설정
🎯 도커 레이어는 왜 알아야 할까?
- "도커는 잘 쓰지만, 레이어 구조를 몰라서 매번 용량 폭탄 맞는다"
- "이미지 빌드가 느린 이유가 뭔지 모른다"
- "멀티스테이지 빌드를 쓴다고 해도 실제로 뭐가 남는지 모른다"
🔖 주제
내용내용내용내용내용내용내용내용내용내용
📓 설명
도커 이미지
컨테이너를 생성하기 위한 템플릿
+------------------------+ ◀ 쓰기 가능한 컨테이너 레이어 (Writable Layer)
| Container Layer | - 컨테이너 실행 중 생긴 변경사항이 여기에 기록됨
+------------------------+
| Layer N | - ex) COPY app /app
+------------------------+
| Layer N-1 | - ex) RUN pip install -r requirements.txt
+------------------------+
| ... |
+------------------------+
| Layer 1 (Base Image) | - ex) FROM python:3.11
+------------------------+ ◀ 읽기 전용 이미지 레이어 (Read-only Layers)
- 다수의 레이어로 구성 (읽기 전용 레이어 + 쓰기 레이어))
- 각 레이어는 tar 아카이브 파일 형태
레이어
- 각 레이어는 이미지 그 자체
- 지정된 태그가 없을 뿐 (자동 ID 존재)
- 각 계층은 기반이 되는 이미지에 대한 변경 사항을 저장
- 도커 파일의 각 명령은 레이어를 생성한다. (FROM, RUN 등)
일반 빌드
FROM node:18
WORKDIR /app
COPY . .
RUN npm install
RUN npm run build
CMD ["node", "dist/index.js"]
멀티 스테이지 빌드
# 1️⃣ 빌드 스테이지
FROM node:18 AS builder
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
RUN npm run build
# 2️⃣ 런타임 스테이지 (최종 이미지)
FROM node:18-slim
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/package.json .
RUN npm install --omit=dev # devDependencies 제외
CMD ["node", "dist/index.js"]
[Stage 1: Builder]
+------------------------+
| Build Result (e.g. bin)| ◀ 최종 바이너리만 복사
+------------------------+
| RUN npm run build |
+------------------------+
| COPY .. |
+------------------------+
| RUN npm install |
+------------------------+
| COPY package.json . |
+------------------------+
| FROM node:18 |
+------------------------+
▼
[Stage 2: Runtime]
+-----------------------------------------+
| Runtime + bin only | ◀ 작은 이미지 크기
+-----------------------------------------+
| CMD ["node", "dist/index.js"] |
+-----------------------------------------+
| RUN npm install |
+-----------------------------------------+
| COPY --from=builder /app/package.json . |
+-----------------------------------------+
| COPY --from=builder /app/dist ./dist |
+-----------------------------------------+
| FROM node:18-slim |
+-----------------------------------------+
'Backend > Docker' 카테고리의 다른 글
AWS 접속 후 Docker 설치 (0) | 2021.04.23 |
---|