Skip to content

Docker 이미지가 너무 크다

Seungheon Han edited this page Nov 22, 2024 · 2 revisions

image

현재 도커 이미지 하나 하나가 다 500MB가 넘으며, media 서버는 거의 1GB에 달하고 있다. 현재 파일 크기가 너무 커서 git action으로 media 서버를 배포하면 빌드하는데만 시간이 5분 이상 걸리고 있다. 때문에 빌드 시간 단축을 위해서 최적화의 필요성을 느꼈다.

어떻게 최적화를 하지?

멀티 스테이지 빌드 활용

멀티 스테이지 빌드는 Docker 이미지를 빌드하는 여러 단계를 나눠, 필요한 파일만 최종 이미지에 포함시키는 방식이다. 각 단계는 독립된 환경을 가지며, 최종 단계는 이전 단계의 결과물만 복사하여 이미지를 생성한다.

  1. 첫 번째 단계 (빌드)
    • 애플리케이션 코드를 컴파일하거나 빌드
    • 빌드 도구와 개발 의존성 설치
  2. 최종 단계 (런타임 단계)
    • 빌드 단계에서 생성된 결과물만 복사
    • 불필요한 도구나 개발 의존성 제거
    • 경량화된 베이스 이미지 사용

왜 멀티 스테이지를 사용하면 이미지 크기가 줄어들지?

  1. 빌드 도구 및 개발 의존성 제거 빌드 단계에서 필요한 컴파일러, 개발 의존성 들은 최종 실행 단계에서는 필요하지 않다. 따라서 빌드가 끝난 후 최종 이미지는 실행에 필요한 최소한의 파일만 포함한다.
  2. 중간 파일 제거 빌드 과정에서 생성된 임시 파일, 로그 파일, 캐시 데이터는 최종 실행 단계에서는 필요하지 않다. 멀티 스테이지 빌드를 통해 이러한 불필요한 파일을 제거해줄 수 있다.
  3. 경량화된 베이스 이미지 사용 최종 실행 단계에서는 애플리케이션 실행에 필요한 최소한의 구성 요소만 포함된 경량 이미지를 사용할 수 있다.

멀티 스테이지 빌드 사용법

FROM node:22-alpine

WORKDIR /app

COPY . .

RUN npm install
RUN npm run build

CMD ["node", "dist/main.js"]

위 Dockerfile의 문제점은 다음과 같다.

  • 빌드 도구와 개발 의존성이 모두 포함되어 이미지가 무겁다.
  • node_modules에 불필요한 파일이 많다.
FROM node:22-alpine AS builder

WORKDIR /app

COPY package.json package-lock.json ./
RUN npm install

COPY . .
RUN npm run build

# 실행 단계
FROM node:16-alpine AS runner

WORKDIR /app

COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules

CMD ["node", "dist/main.js"]

문제점이 있던 Dockerfile에 멀티 스테이지를 적용하면 빌드 단계와 실행 단계를 분리시킬 수 있다. 빌드 단계에서는 빌드 도구와 개발 의존성을 포함한 환경에서 애플리케이션을 빌드하고, 실행 단계에서는 빌드된 결과물과 실행에 필요한 파일들만 가져와 실행 환경을 구성해준다. 이렇게 하면 최종 이미지에서 불필요한 파일과 개발 의존성을 제거할 수 있어 이미지 크기를 대폭 줄일 수 있다.

image

👥 팀 강점

🧑‍💻 개발 일지

📌 ALL

📌 FE

📌 BE

💥 트러블 슈팅

📌 FE

📌 BE

🤔 고민

📚 학습 정리

📌 김광현

📌 백지연

📌 전희선

📌 한승헌

🤝 회의록

🗒️ 데일리 스크럼

💬 팀 회고


👨‍👩‍👧‍👦 소개

🌱 문화

🔨 기술 스택

⚙️ 서비스 아키텍쳐

🚧 CI/CD

🌊 Flow

💭 6주를 보내면서

Clone this wiki locally