Docker 컨테이너 성능 최적화 — 이미지 크기·메모리·시작 속도
컨테이너가 느리게 시작되거나 메모리를 과도하게 사용한다면, 최적화할 여지가 있습니다. 이미지 크기 축소부터 런타임 성능 튜닝까지 단계별로 정리합니다.
이미지 크기 최적화
섹션 제목: “이미지 크기 최적화”멀티스테이지 빌드
섹션 제목: “멀티스테이지 빌드”# 나쁜 예: 빌드 도구가 최종 이미지에 포함FROM node:20WORKDIR /appCOPY package*.json ./RUN npm install # devDependencies 포함COPY . .RUN npm run build# 이미지 크기: ~800MB
# 좋은 예: 멀티스테이지 빌드FROM node:20-alpine AS builderWORKDIR /appCOPY package*.json ./RUN npm ci # ci = 재현 가능한 설치COPY . .RUN npm run build
FROM node:20-alpine AS runnerWORKDIR /appCOPY --from=builder /app/dist ./distCOPY --from=builder /app/node_modules ./node_modules# 이미지 크기: ~150MB (80% 감소)경량 베이스 이미지 선택
섹션 제목: “경량 베이스 이미지 선택”ubuntu:22.04 → ~77MBnode:20 → ~350MBnode:20-slim → ~90MBnode:20-alpine → ~40MB ← 권장.dockerignore 설정
섹션 제목: “.dockerignore 설정”node_modules.git.env**.logdistcoverageREADME.md.dockerignore 없이 빌드하면 node_modules(수백 MB)가 빌드 컨텍스트에 포함되어 빌드가 느려집니다.
메모리 제한 설정
섹션 제목: “메모리 제한 설정”services: api: image: my-api:latest deploy: resources: limits: memory: 512M # 최대 메모리 제한 cpus: '1.0' # 최대 1 CPU 코어 reservations: memory: 256M # 최소 보장 메모리 cpus: '0.5'# Docker CLIdocker run \ --memory=512m \ --memory-reservation=256m \ --cpus=1.0 \ my-api:latest시작 속도 개선
섹션 제목: “시작 속도 개선”레이어 캐시 최적화
섹션 제목: “레이어 캐시 최적화”# 나쁜 예: 소스 코드 변경마다 의존성 재설치FROM node:20-alpineCOPY . . # 소스 변경 시 이 이후 모두 캐시 무효화RUN npm install
# 좋은 예: 의존성을 먼저 복사해서 캐시 활용FROM node:20-alpineCOPY package*.json ./ # package.json 변경 시에만 npm install 재실행RUN npm ciCOPY . . # 소스 변경은 이 레이어만 무효화헬스체크로 준비 완료 시점 명확히
섹션 제목: “헬스체크로 준비 완료 시점 명확히”HEALTHCHECK --interval=10s --timeout=3s --start-period=30s --retries=3 \ CMD wget -qO- http://localhost:3000/health || exit 1healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3000/health"] interval: 10s timeout: 3s start_period: 30s # 시작 후 30초는 체크 안 함 retries: 3Kubernetes에서는 readinessProbe와 동일한 역할을 합니다.
로그 최적화
섹션 제목: “로그 최적화”# docker-compose.yml — 로그 크기 제한services: api: logging: driver: "json-file" options: max-size: "100m" # 파일당 최대 100MB max-file: "5" # 최대 5개 파일 유지로그 설정 없이 장기 운영하면 디스크가 가득 찰 수 있습니다.
성능 모니터링
섹션 제목: “성능 모니터링”# 컨테이너별 리소스 사용량 실시간 확인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다음 단계
섹션 제목: “다음 단계”이 가이드를 내 서비스에 직접 적용해 보세요.
TestForge 무료 스캔 시작 →