ACTIVE INCIDENT
00:00 elapsed
LABLAB-DOCKER-04-IMAGE-OPTIMIZATIONSEV-2
Docker 이미지가 1.2GB다 — 멀티스테이지 빌드로 줄이기
ELAPSED
00:00
PHASE
0 / 5
SLA
40분
📦 Docker
← 목록
INCIDENT RESPONSE
0 / 6 단계 완료
📚 PREREQUISITES
Theorydocker/dockerfile-basics
Theorydocker/docker-compose
TRACK
DOCKER
SLA
40분
SEV
SEV-2
PHASES
4단계
ENV
local
INCOMING TICKET
팀 리드 Slack DM 오전 10:17: "방금 AWS 비용 알람 왔어요. ECR 스토리지 비용이 이번 달 $240 넘었고, CI 빌드가 12분으로 늘어나서 하루 30회 배포 시 팀 전체 대기 시간이 6시간이에요. Node.js 앱 이미지가 1.2GB인데 확인해줄 수 있어요?"
YOUR ROLE
주니어 인프라 엔지니어
IMPACT IF UNRESOLVED
ECR 스토리지 비용 월 $240 초과. CI 빌드 12분 × 하루 30회 배포 = 팀 전체 대기 시간 6시간/일 낭비. 이미지 최적화 없이는 비용과 배포 속도 문제 지속.
🚨INCIDENT BRIEF
팀 리드에게서 Slack DM이 왔습니다.
"CI 빌드가 12분 걸리고 있어요. ECR에 푸시하는 이미지가 1.2GB인데, 이거 뭔가 잘못된 거 아닌가요?"
확인해보니 Dockerfile 첫 줄이 `FROM node:latest`입니다.
`node_modules`가 통째로 COPY되고 있고, `.git` 디렉토리도 빌드 컨텍스트에 포함돼 있습니다.
TypeScript 컴파일러와 테스트 도구까지 최종 이미지에 남아 있습니다.
이 Lab에서는 Dockerfile을 단계적으로 뜯어고칩니다.
먼저 docker history로 문제를 진단하고, .dockerignore로 빌드 컨텍스트를 줄이고,
멀티스테이지 빌드로 빌드 환경과 실행 환경을 분리하고,
마지막으로 레이어 캐시 순서를 최적화해 npm install이 캐시되도록 만듭니다.
⏱ 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을 재실행하지 않도록 만든다
📌 선수 지식
• [이론] docker/dockerfile-basics
• [이론] docker/docker-compose
ℹ️ 실습 환경
환경: local
필요 도구: docker, node
검증 스크립트: /labs/lab-docker-04-image-optimization/scripts/verify.sh
🔒
실습 실행은 Pro 플랜 전용입니다
인시던트 브리프와 학습 자료는 지금 바로 확인할 수 있습니다. 실제 실습 진행 및 터미널 사용은 Pro 플랜에서 가능합니다.
Pro로 업그레이드 →
>_ LAB TERMINAL↔ 너비 조절
NOTES