본문 바로가기
개발/트러블슈팅

[Docker] 도커 이미지 크기 줄이기

by char_lie 2024. 11. 26.
반응형

도커 이미지를 통해 배포를 진행하다 보면 도커 용량이 생각보다 매우 커서 서버의 용량을 자주 잡아먹는 일이 많았다.

그러던 중 다른 동료분의 발표에서 도커 이미지 크기를 2GB에서 200MB로 90%나 줄였다는 이야기를 듣고, 도커 파일 이미지 크기를 개선해 보는 것을 목표로 도커 파일을 수정해 보았다.

 

📍 도커 이미지 크기를 줄이면 뭐가 좋은데?

도커 이미지 크기를 줄이면 빠르게 빌드를 할 수 있음

특히, 이미지 크기가 클수록 네트워크 대역폭을 더 많이 사용하여 빌드와 배포에 시간이 더욱 많이 소비가 되고, 이는 리소스 낭비에 이어질 수 있기 때문에 이미지 크기를 줄이면 굉장히 많은 도움이 될 수 있음.

 

🔗 개선 전 도커 파일 코드

# Node.js 20 이미지 설정
FROM node:20

# pnpm 설치
RUN npm install -g pnpm

# 최상위 폴더를 작업 디렉토리
WORKDIR /app

# 공통 package.json과 lock 파일을 복사 및 설치
COPY package*.json pnpm-lock.yaml ./
RUN pnpm install

# 프론트엔드 파일 복사 및 빌드
WORKDIR /app/apps/frontend
COPY apps/frontend ./
RUN pnpm install
RUN pnpm run build

# 백엔드 파일 복사 및 의존성 설치
WORKDIR /app/apps/backend
COPY apps/backend ./
RUN pnpm install

# 프론트엔드와 백엔드 포트 노출 설정
EXPOSE 3000 8080

# 컨테이너 시작 시 실행
CMD ["sh", "-c", "pnpm --prefix /app/apps/frontend run dev & pnpm --prefix /app/apps/backend start"]

 

해당 도커 파일을 보면, A부터 Z까지 전부 깡으로 생성하여 만드는 것을 알 수 있다.

반응형

 

🚀 그래서 어떻게 개선했는데?

우선, 도커 이미지를 줄일 수 있는 방법이 여러 가지가 있는데 제일 먼저 권장되는 방식은 최소화된 베이스 이미지를 사용하는 것이었다.

FROM node:18-alpine

베이스 이미지를 배포할 때 경량화된 배포판으로 Alpine Linux사용하면 이미지 크기를 줄일 수 있고, 이를 통해 개선하고자 하였다.

 

두 번째 방법으로는 불필요한 파일을 .dockerignore를 통해 생성하여 이미지에 포함되지 않도록 만들었다.

node_modules/
dist
*.log
.git
.github
.gitignore
Dockerfile
build/

불필요한 파일을 전부 지움으로써 이미지 크기를 조금이라도 더 줄이고자 하였고, 굳이 빌드에 필요 없는 파일은 전부 포함되지 않게 하였다.

 

세 번째 방법으로는 멀티 스테이지 필드를 적용했다. 멀티 스테이지 빌드를 통해 빌드에 필요한 도구와 패키지를 첫 단계에서 설치하고, 최종 이미지에서는 제외함으로써 이미지 크기를 더욱 줄일 수 있었다.

# 1단계: 빌드 스테이지 (멀티 스테이지 빌드)
FROM node:20-alpine AS builder

# pnpm 설치
RUN npm install -g pnpm

# 최상위 폴더를 작업 디렉토리
WORKDIR /app

# 공통 package.json과 lock 파일을 복사 및 설치
COPY package*.json pnpm-lock.yaml ./
RUN pnpm install

# 프론트엔드 파일 복사 및 빌드
WORKDIR /app/apps/frontend
COPY apps/frontend ./ 
RUN pnpm install
RUN pnpm run build

# 백엔드 파일 복사 및 의존성 설치
WORKDIR /app/apps/backend
COPY apps/backend ./ 
RUN pnpm install

# 2단계: 실행 이미지
FROM node:20-alpine

# 작업 디렉토리 설정 및 복사
WORKDIR /app
RUN npm install -g pnpm
COPY --from=builder /app /app

# 프론트엔드와 백엔드 포트 노출 설정
EXPOSE 3000 8080

# 컨테이너 시작 시 실행
CMD ["sh", "-c", "pnpm --prefix /app/apps/frontend run dev & pnpm --prefix /app/apps/backend start"]

 

이러한 과정을 통해서 아래와 같이 1.62GB -> 508MB로 약 70%만큼 용량을 줄일 수 있었다.

어느 블로그에선 5MB까지도 줄일 수 있다고 하던데 추후 불필요한 캐시 등을 삭제하여 더 줄이는 시도를 진행 후 성공하면 업데이트 예정

반응형

댓글