Docker 컨테이너 CPU/메모리 사용량 보는 법

Docker 컨테이너 리소스 모니터링의 필요성

Docker로 여러 컨테이너를 운영하다 보면 어떤 컨테이너가 얼마나 리소스를 사용하는지 파악하는 것이 중요해집니다. 특히 운영 환경에서는 컨테이너 간 리소스 경합, 메모리 누수, CPU 폭주 같은 문제를 조기에 발견해야 장애를 예방할 수 있습니다.

이 글에서는 Docker 컨테이너의 CPU와 메모리 사용량을 확인하는 다양한 방법을 정리합니다. 간단한 명령어부터 대시보드 툴까지 상황에 맞게 선택할 수 있도록 소개합니다.

1. docker stats: 가장 기본적인 모니터링 명령

Docker CLI에 내장된 docker stats 명령은 실행 중인 모든 컨테이너의 실시간 리소스 사용량을 보여줍니다.

docker stats

출력 예시:

CONTAINER ID   NAME       CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O         PIDS
abc123def456   django     2.34%     250MiB / 2GiB         12.20%    1.2MB / 500KB     0B / 0B           15
xyz789ghi012   postgres   0.15%     80MiB / 2GiB          3.91%     500KB / 1.2MB     10MB / 5MB        8

주요 컬럼 설명

  • CPU %: 컨테이너가 사용 중인 CPU의 퍼센트 (시스템 전체 기준)
  • MEM USAGE / LIMIT: 사용 메모리 / 할당 가능 최대 메모리
  • MEM %: 메모리 사용률
  • NET I/O: 네트워크 송수신량 (컨테이너 시작 이후 누적)
  • BLOCK I/O: 디스크 읽기/쓰기량
  • PIDS: 컨테이너 내부 프로세스 수

유용한 옵션

# 스냅샷만 (스트리밍 비활성)
docker stats --no-stream

# 특정 컨테이너만
docker stats mycontainer db

# 포맷 커스터마이즈 (스크립트용)
docker stats --format "table {{.Name}}  {{.CPUPerc}}    {{.MemUsage}}"

# JSON 출력
docker stats --no-stream --format "{{json .}}"

2. docker top: 컨테이너 내부 프로세스 확인

컨테이너 안에서 실행 중인 프로세스를 ps처럼 보여줍니다.

docker top mycontainer

어떤 프로세스가 리소스를 많이 먹는지 컨테이너 내부까지 들여다볼 때 사용합니다. Python 앱에서 어떤 워커가 문제인지, Nginx의 특정 자식 프로세스가 이상한지 등 구체적 원인 파악에 유용합니다.

3. docker inspect: 리소스 제한 확인

컨테이너에 설정된 리소스 제한(limits)을 확인합니다.

docker inspect mycontainer | grep -A5 -i "memory\|cpu"

또는 포맷 옵션으로 깔끔하게:

docker inspect --format='Memory: {{.HostConfig.Memory}}, CPUs: {{.HostConfig.NanoCpus}}' mycontainer

4. cAdvisor: 웹 대시보드

cAdvisor(Container Advisor)는 Google이 만든 컨테이너 모니터링 도구로, 웹 UI로 시각화된 대시보드를 제공합니다.

docker run   --volume=/:/rootfs:ro   --volume=/var/run:/var/run:ro   --volume=/sys:/sys:ro   --volume=/var/lib/docker/:/var/lib/docker:ro   --publish=8080:8080   --detach=true   --name=cadvisor   gcr.io/cadvisor/cadvisor:latest

브라우저에서 http://localhost:8080으로 접속하면 각 컨테이너의 CPU, 메모리, 네트워크, 디스크 I/O 그래프를 볼 수 있습니다.

시계열 데이터를 저장하려면 Prometheus + Grafana 조합으로 확장 가능합니다.

5. Portainer: 관리형 대시보드

Portainer는 Docker 환경을 통합 관리하는 GUI 툴로, 컨테이너 모니터링 외에도 이미지 관리, 볼륨/네트워크 설정, 로그 확인까지 한 화면에서 처리할 수 있습니다.

docker volume create portainer_data

docker run -d -p 9443:9443 --name portainer   --restart=always   -v /var/run/docker.sock:/var/run/docker.sock   -v portainer_data:/data   portainer/portainer-ce:latest

직관적인 UI로 개발/테스트 환경에서 특히 편리합니다.

6. Prometheus + Grafana: 운영 환경 모니터링

본격적인 운영 환경에서는 Prometheus로 메트릭 수집, Grafana로 시각화, Alertmanager로 알림을 구성합니다.

구성 요소

  • Node Exporter: 호스트 시스템 메트릭
  • cAdvisor: 컨테이너별 메트릭
  • Prometheus: 메트릭 저장 (TSDB)
  • Grafana: 대시보드
  • Alertmanager: CPU/메모리 임계치 초과 시 Slack/Email 알림

docker-compose.yml 예시

version: '3'
services:
  prometheus:
    image: prom/prometheus
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml

  cadvisor:
    image: gcr.io/cadvisor/cadvisor
    ports:
      - "8080:8080"
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:ro
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro

  grafana:
    image: grafana/grafana
    ports:
      - "3000:3000"

prometheus.yml

scrape_configs:
  - job_name: 'cadvisor'
    static_configs:
      - targets: ['cadvisor:8080']

Grafana에 cAdvisor 대시보드 템플릿(예: 14282번)을 import하면 즉시 전문가 수준의 모니터링 화면을 얻을 수 있습니다.

7. 로그 기반 모니터링: docker logs

리소스는 정상인데 앱이 이상하게 동작할 때는 로그 확인이 필수입니다.

# 최근 로그 100줄
docker logs --tail 100 mycontainer

# 실시간 팔로우
docker logs -f mycontainer

# 타임스탬프 포함
docker logs -t mycontainer

# 특정 시간 이후
docker logs --since 2024-01-01T00:00:00 mycontainer

8. 리소스 이상 패턴 예시

CPU 100% 고정

  • 원인: 무한 루프, JIT 컴파일 폭주, Python GIL 병목
  • 대응: docker top으로 원인 프로세스 찾고, 코드 프로파일링

메모리 지속 증가 (누수)

  • 원인: 캐시 청소 안 됨, 이벤트 리스너 누적, 전역 변수 증가
  • 대응: 주기적 재시작(임시), 메모리 프로파일러(py-spy, tracemalloc) 사용

메모리 사용률 100% + OOM Kill

  • 원인: 컨테이너 메모리 한도 너무 낮음 또는 실제 누수
  • 대응: docker events 로그에서 OOM 확인, 메모리 한도 조정

디스크 I/O 급증

  • 원인: 과도한 로그 쓰기, DB 인덱스 재구축, 대용량 파일 처리
  • 대응: docker stats에서 BLOCK I/O 확인, 로그 로테이션 설정

마치며

  • 간단한 확인: docker stats 한 줄이면 충분
  • 개발 환경: Portainer로 GUI 관리
  • 운영 환경: Prometheus + Grafana로 본격 모니터링 + 알림
  • 심층 분석: docker top, docker logs, 내부 프로세스 프로파일링

상황에 맞는 도구를 선택해 사용하면, 컨테이너 기반 시스템의 안정성과 성능을 효과적으로 관리할 수 있습니다.

비슷한 글 추천

Comments (0)

No comments yet. Be the first to comment!