← 아티클 목록

도커 이미지 용량 줄이기 — 1GB를 100MB로 만드는 5가지

2026-06-29#docker#최적화#배포

도커 이미지가 1GB를 넘으면 빌드도 느리고, 레지스트리 푸시·풀도 느리고, 배포 때마다 시간을 잡아먹습니다. 대부분의 비대한 이미지는 빌드 도구와 캐시가 최종 이미지에 그대로 남아서 생깁니다. 원인별로 줄여봅니다.

1. 멀티스테이지 빌드 — 가장 큰 효과

컴파일·번들에 필요한 도구는 빌드 단계에만 두고, 최종 이미지에는 산출물만 복사합니다.

Dockerfile
# 빌드 단계
FROM node:20 AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# 실행 단계 — 빌드 산출물만
FROM node:20-slim
WORKDIR /app
COPY --from=build /app/dist ./dist
COPY --from=build /app/node_modules ./node_modules
CMD ["node", "dist/main.js"]

빌드 도구·소스·캐시가 최종 이미지에서 빠지면서 수백 MB가 줄어듭니다.

2. 베이스 이미지를 가볍게

베이스대략 크기메모
node:20~1GB풀 데비안, 빌드용으로만
node:20-slim~200MB실행용 기본 추천
node:20-alpine~130MB가장 작지만 glibc 아님(네이티브 모듈 주의)

alpine은 musl libc라 일부 네이티브 의존성에서 문제가 날 수 있으니, 안전하게는 slim부터 시작합니다.

3. 레이어 캐시를 노린 순서

자주 안 바뀌는 것(의존성)을 먼저, 자주 바뀌는 것(소스)을 나중에 COPY하면 캐시가 살아 빌드가 빨라집니다. COPY package*.jsonRUN npm ciCOPY . . 순서가 핵심입니다.

4. .dockerignore로 컨텍스트 줄이기

node_modules, .git, 로그, 테스트 산출물을 빌드 컨텍스트에서 제외합니다.

node_modules
.git
*.log
dist
coverage

5. RUN 한 줄로 정리·캐시 삭제

패키지 설치 후 캐시를 같은 레이어에서 지웁니다.

Dockerfile
RUN apt-get update && apt-get install -y --no-install-recommends curl \
  && rm -rf /var/lib/apt/lists/*

확인

로컬 터미널
docker images        # 이미지 크기 비교
docker history <img> # 어떤 레이어가 큰지 추적

docker history로 어느 레이어가 무거운지 보면, 위 5가지 중 무엇을 적용할지 바로 보입니다.


멀티스테이지 빌드와 레이어 캐시를 직접 만들어 보며 크기 변화를 확인하는 실습은 도커 트랙에서 무료로 할 수 있습니다.