콘텐츠로 이동

Docker 컨테이너 성능 최적화 — 이미지 크기·메모리·시작 속도

컨테이너가 느리게 시작되거나 메모리를 과도하게 사용한다면, 최적화할 여지가 있습니다. 이미지 크기 축소부터 런타임 성능 튜닝까지 단계별로 정리합니다.

# 나쁜 예: 빌드 도구가 최종 이미지에 포함
FROM node:20
WORKDIR /app
COPY package*.json ./
RUN npm install # devDependencies 포함
COPY . .
RUN npm run build
# 이미지 크기: ~800MB
# 좋은 예: 멀티스테이지 빌드
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci # ci = 재현 가능한 설치
COPY . .
RUN npm run build
FROM node:20-alpine AS runner
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
# 이미지 크기: ~150MB (80% 감소)
ubuntu:22.04 → ~77MB
node:20 → ~350MB
node:20-slim → ~90MB
node:20-alpine → ~40MB ← 권장
.dockerignore
node_modules
.git
.env*
*.log
dist
coverage
README.md

.dockerignore 없이 빌드하면 node_modules(수백 MB)가 빌드 컨텍스트에 포함되어 빌드가 느려집니다.

docker-compose.yml
services:
api:
image: my-api:latest
deploy:
resources:
limits:
memory: 512M # 최대 메모리 제한
cpus: '1.0' # 최대 1 CPU 코어
reservations:
memory: 256M # 최소 보장 메모리
cpus: '0.5'
Terminal window
# Docker CLI
docker run \
--memory=512m \
--memory-reservation=256m \
--cpus=1.0 \
my-api:latest
# 나쁜 예: 소스 코드 변경마다 의존성 재설치
FROM node:20-alpine
COPY . . # 소스 변경 시 이 이후 모두 캐시 무효화
RUN npm install
# 좋은 예: 의존성을 먼저 복사해서 캐시 활용
FROM node:20-alpine
COPY package*.json ./ # package.json 변경 시에만 npm install 재실행
RUN npm ci
COPY . . # 소스 변경은 이 레이어만 무효화

헬스체크로 준비 완료 시점 명확히

섹션 제목: “헬스체크로 준비 완료 시점 명확히”
HEALTHCHECK --interval=10s --timeout=3s --start-period=30s --retries=3 \
CMD wget -qO- http://localhost:3000/health || exit 1
docker-compose.yml
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 10s
timeout: 3s
start_period: 30s # 시작 후 30초는 체크 안 함
retries: 3

Kubernetes에서는 readinessProbe와 동일한 역할을 합니다.

# docker-compose.yml — 로그 크기 제한
services:
api:
logging:
driver: "json-file"
options:
max-size: "100m" # 파일당 최대 100MB
max-file: "5" # 최대 5개 파일 유지

로그 설정 없이 장기 운영하면 디스크가 가득 찰 수 있습니다.

Terminal window
# 컨테이너별 리소스 사용량 실시간 확인
docker stats
# 특정 컨테이너 상세
docker stats my-api --no-stream --format \
"CPU: {{.CPUPerc}}, MEM: {{.MemUsage}}, NET: {{.NetIO}}"
# Prometheus로 Docker 메트릭 수집
# docker-compose.yml에 cAdvisor 추가
cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
ports:
- "8080:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
visitor count

이 가이드를 내 서비스에 직접 적용해 보세요.

TestForge 무료 스캔 시작 →