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!
Please to write a comment.