본문 바로가기

Backend/Docker

Docker 이미지, 레이어 단위로 이해하고 최적화하기

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