DEPLOYMENT
00:00 경과
LABLAB-DOCKER-04-IMAGE-OPTIMIZATION중급
Docker 이미지가 1.2GB다 — 멀티스테이지 빌드로 줄이기
ELAPSED
00:00
PHASE
0 / 5
SLA
40분
📦 Docker
← 목록
INCIDENT RESPONSE
0 / 6 단계 완료
📚 PREREQUISITES
TRACK
DOCKER
SLA
40분
LEVEL
중급
PHASES
4단계
ENV
local
INCOMING TICKET
팀 리드 Slack DM 오전 10:17: "방금 AWS 비용 알람 왔어요. ECR 스토리지 비용이 이번 달 $240 넘었고, CI 빌드가 12분으로 늘어나서 하루 30회 배포 시 팀 전체 대기 시간이 6시간이에요. Node.js 앱 이미지가 1.2GB인데 확인해줄 수 있어요?"
YOUR ROLE
주니어 인프라 엔지니어
안 하면 나중에
ECR 스토리지 비용 월 $240 초과. CI 빌드 12분 × 하루 30회 배포 = 팀 전체 대기 시간 6시간/일 낭비. 이미지 최적화 없이는 비용과 배포 속도 문제 지속.
📋상황 브리핑
팀 리드에게서 Slack DM이 왔습니다.
"CI 빌드가 12분 걸리고 있어요. ECR에 푸시하는 이미지가 1.2GB인데, 이거 뭔가 잘못된 거 아닌가요?"
확인해보니 Dockerfile 첫 줄이 `FROM node:latest`입니다.
`node_modules`가 통째로 COPY되고 있고, `.git` 디렉토리도 빌드 컨텍스트에 포함돼 있습니다.
TypeScript 컴파일러와 테스트 도구까지 최종 이미지에 남아 있습니다.
이 Lab에서는 Dockerfile을 단계적으로 뜯어고칩니다.
먼저 docker history로 문제를 진단하고, .dockerignore로 빌드 컨텍스트를 줄이고,
멀티스테이지 빌드(하나의 Dockerfile 안에 여러 FROM을 써서 빌드 환경과 실행 환경을 분리하는 기법)로 빌드 환경과 실행 환경을 분리하고,
마지막으로 레이어 캐시(각 Dockerfile 명령을 독립 레이어로 저장해 변경 없는 레이어를 재사용하는 Docker 빌드 최적화) 순서를 최적화해 npm install이 캐시되도록 만듭니다.
docker history로 잰 레이어별 크기 막대그래프(FROM node:latest는 작지만 COPY . .이 node_modules+.git 포함으로 가장 크고, RUN npm install과 RUN npm run build도 그다음)와, 측정 없이 npm install부터 의심하면 실제 최대 레이어(COPY . .)를 안 건드려 헛다리를 짚는다는 함정, 그리고 멀티스테이지 빌드로 builder 단계(tsc·테스트도구 포함)와 실행 단계(node:slim, 빌드 산출물만 COPY --from)를 분리해 1.2GB를 200MB로 줄이는 구조를 정리한 다이어그램확대
초기 상태: setup.sh 실행 후 `FROM node:latest`로 시작하는 비최적화 Dockerfile과 node_modules가 포함된 Node.js 프로젝트 디렉터리가 준비됩니다. `docker build -t app:latest .`로 1.2GB짜리 문제 이미지를 빌드한 상태에서 Task 1을 시작합니다.
⏱ 40분📊 중급🔧 4단계#docker#dockerfile#multi-stage#optimization
MISSION
1
현재 이미지 분석 — 왜 이렇게 큰가
docker image ls와 docker history로 기존 이미지의 크기와 레이어 구조를 분석해 비대화 원인을 파악한다
2
.dockerignore — 불필요한 파일을 빌드 컨텍스트에서 제외
.dockerignore 파일을 만들어 node_modules, .git, 테스트 파일 등을 빌드 컨텍스트에서 제외하고, 빌드 컨텍스트 크기가 줄었는지 확인한다
3
멀티스테이지 빌드 적용 — 빌드 환경과 실행 환경 분리
Dockerfile을 멀티스테이지 빌드로 재작성해 빌드 환경(node:20)과 실행 환경(node:20-alpine)을 분리하고, 이미지 크기를 200MB 이하로 줄인다
4
레이어 캐시 최적화 — npm install이 캐시되도록 순서 고정
package.json과 소스코드의 COPY 순서를 분리해 npm install이 캐시되도록 하고, 소스코드 변경 시 npm install을 재실행하지 않도록 만든다
📌 선수 지식
ℹ️ 실습 환경
환경: local
필요 도구: docker, node
검증 스크립트: /labs/lab-docker-04-image-optimization/scripts/verify.sh
🔒
실습 실행은 Pro 플랜 전용입니다
인시던트 브리프와 학습 자료는 지금 바로 확인할 수 있습니다. 실제 실습 진행 및 터미널 사용은 Pro 플랜에서 가능합니다.
Pro로 업그레이드 →
>_ LAB WORKSPACE
NOTES