빠른 흐름
docker stats
docker stats app worker
docker stats --no-stream
docker stats --all
docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.PIDs}}"관찰 흐름
stats는 실행 중 컨테이너의 현재 사용량을 보여준다
docker stats는 컨테이너별 CPU, 메모리, 네트워크 I/O, 블록 I/O, PID 수를 실시간으로 보여줍니다. 실행 중 컨테이너만 기본으로 표시하며, --all을 붙이면 중지된 컨테이너까지 포함할 수 있습니다.
CPU % 현재 CPU 사용 비율
MEM USAGE 사용 메모리와 제한값
NET I/O 네트워크 송수신량
BLOCK I/O 디스크 read/write 누적량
PIDS 프로세스와 스레드 수성능 문제를 처음 볼 때는 docker stats로 어떤 컨테이너가 자원을 쓰는지 좁히고, 이후 애플리케이션 profiler, DB slow query, host metrics로 원인을 더 내려가야 합니다.
--no-stream은 스냅샷과 자동 기록에 적합하다
기본 docker stats는 계속 갱신됩니다. 스크립트, CI 로그, 장애 메모처럼 한 번의 값을 남기려면 --no-stream을 사용합니다. 필요한 필드만 남기려면 --format을 함께 씁니다.
docker stats --no-stream
docker stats --no-stream \
--format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemPerc}}\t{{.NetIO}}\t{{.BlockIO}}"순간 스냅샷은 짧은 피크를 놓칠 수 있습니다. 반복적으로 수집해야 하는 운영 환경에서는 Prometheus, cAdvisor, Docker Desktop metrics, 클라우드 모니터링처럼 보관과 알림이 가능한 도구가 필요합니다.
메모리 사용량은 limit와 같이 읽어야 한다
MEM USAGE / LIMIT은 현재 사용량과 컨테이너에 허용된 메모리 한계를 함께 보여줍니다. limit가 없으면 host 기준 값이 표시될 수 있어, 컨테이너가 실제로 제한되어 있다고 착각하면 안 됩니다.
docker stats app --no-stream
docker inspect app --format "{{json .HostConfig.Memory}}"메모리 사용량이 limit에 근접하고 컨테이너가 OOMKilled로 종료된다면 애플리케이션 메모리 증가, limit 과소 설정, 요청 피크, 캐시 설정을 같이 확인해야 합니다.
CPU와 I/O 수치는 병목 위치를 가르는 첫 단서다
CPU가 높고 I/O가 낮으면 연산 또는 busy loop 가능성이 크고, BLOCK I/O가 계속 늘면 파일 쓰기, DB 파일, 로그 폭증을 의심할 수 있습니다. NET I/O가 비정상적으로 높으면 proxy, polling, 대량 응답, 외부 호출 재시도 흐름을 확인합니다.
docker stats --no-stream api db worker
docker logs --tail 100 worker
docker inspect workerstats만으로 원인을 확정하지 말고, 같은 시간대의 애플리케이션 로그, daemon events, host disk/network 지표를 맞춰야 합니다.
체크포인트
| 상황 | 먼저 볼 것 |
|---|---|
| 어떤 컨테이너가 자원을 쓰는지 확인 | docker stats |
| 한 번만 기록 | docker stats --no-stream |
| 중지 컨테이너 포함 | docker stats --all |
| 자동 수집용 출력 | --format |
| 메모리 한계 판단 | MEM USAGE / LIMIT와 inspect |
| 장기 추세와 알림 | 외부 metrics 시스템 |
주의할 점
docker stats는 현재 관찰값이지 장기 모니터링 저장소가 아닙니다. 장애가 지난 뒤 원인을 분석해야 하는 환경이라면 stats 출력에 의존하지 말고 별도 metrics 수집과 보존 정책을 구성해야 합니다.
컨테이너 단위 사용량은 host 전체 병목을 그대로 설명하지 않을 수 있습니다. host의 디스크 포화, 네트워크 지연, CPU steal, 다른 프로세스의 자원 사용은 Docker 밖 지표와 함께 확인해야 합니다.
참고 링크
1 sources