Quick Flow
# running container의 live stream
docker stats api worker
# 현재 값 한 번만 기록
docker stats --no-stream --format \
'table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}\t{{.PIDs}}'
# memory limit 및 OOM 종료 이력과 함께 확인
docker inspect --format '{{.State.OOMKilled}} {{.HostConfig.Memory}}' apidocker stats는 running container의 현재 resource 사용량을 보여 주는 live stream입니다. 숫자 하나로 원인을 확정하지 말고 limit, application latency·log, host 또는 Docker Desktop VM 지표와 같은 시점으로 맞춥니다.
수치 읽기
| 필드 | 의미 | 단독으로 결론 내리면 안 되는 이유 |
|---|---|---|
CPU % | host CPU 기준 사용률 | quota throttling, request latency, 다른 process 경쟁도 확인 |
MEM USAGE / LIMIT | 사용량과 허용 limit | cache 계산·OOM 종료·actual limit을 inspect와 함께 확인 |
NET I/O | container 시작 뒤 누적 송수신량 | latency·error rate·재시도와 구분되지 않음 |
BLOCK I/O | host block device 누적 read/write | file cache와 storage driver·host disk 포화를 설명하지 못함 |
PIDS | process와 thread 수 | leak 여부는 시간 변화와 process tree를 함께 봐야 함 |
docker stats는 기본적으로 실행 중인 container만 stream합니다. --all은 중지된 container도 목록에 포함하려 하지만, 중지된 container는 stats data를 반환하지 않습니다. 종료된 job의 과거 CPU·memory 사용량을 보관하는 명령이 아닙니다.
limit와 함께 보기
memory가 limit에 근접했다고 바로 leak으로 판단하지 않습니다. startup cache, batch 처리, traffic spike일 수 있습니다. 반대로 memory graph가 낮아도 다른 process가 kill됐거나 host 전체가 압박을 받을 수 있으므로, container 종료 뒤에는 OOMKilled, exit code, kernel·daemon log, application log를 같이 봅니다.
docker stats api --no-stream
docker inspect --format \
'oom={{.State.OOMKilled}} exit={{.State.ExitCode}} memory={{.HostConfig.Memory}}' api
docker logs --tail 100 apiLinux Docker CLI의 memory usage 표시는 cache를 뺀 값을 사용하지만, Docker API는 total usage와 cache를 별도로 제공합니다. API·cAdvisor·Prometheus 숫자와 CLI 수치가 다를 수 있으므로, dashboard를 바꿨다고 memory behavior가 달라졌다고 판단하지 않습니다.
CPU가 높고 I/O가 낮으면 연산·busy loop를, block I/O 증가와 latency를 함께 보면 file·DB·logging 병목을 의심할 수 있습니다. 이는 조사 시작점일 뿐 profiler, DB slow query, tracing 없이 원인을 확정하는 근거는 아닙니다.
관찰 범위
Docker Desktop에서 docker stats는 Linux VM 안에서 실행되는 container 사용량입니다. native host의 memory pressure, VM resource limit, 다른 application의 CPU·disk I/O는 Desktop resource settings와 OS monitoring도 함께 봐야 합니다. container limit을 정하는 기준은 CPU와 메모리 제한 기본 카드에서 다룹니다.
장기 추세·alert·장애 후 분석이 필요하면 docker stats --no-stream을 임시 기록에만 쓰고, Prometheus·cAdvisor·cloud monitoring·application metrics처럼 timestamped storage를 사용합니다. scrape interval, label cardinality, retention, alert threshold는 서비스의 traffic pattern에 맞춰 별도로 설계합니다.
docker stats의 순간 수치는 resource 사용을 보여도 병목 원인을 보장하지 않습니다. CPU·memory·I/O를 보자마자 limit을 올리거나 내리지 말고, 해당 시점의 request rate, latency, error, host/VM 여유 자원을 함께 대조하십시오.
참고 링크
2 sources