Docker Stats 사용법 총정리! 컨테이너 CPU·메모리·네트워크·디스크 사용량 실시간 확인 방법

Docker 컨테이너를 운영하다 보면 특정 컨테이너의 CPU 사용량이 갑자기 높아지거나 메모리를 과도하게 사용하는 상황이 발생할 수 있습니다.

웹 애플리케이션의 응답 속도가 느려졌거나 서버 부하가 증가했다면 어떤 컨테이너가 자원을 많이 사용하고 있는지 확인해야 합니다.

이때 사용하는 대표적인 명령어가 docker stats입니다.

Docker Stats는 실행 중인 컨테이너의 CPU, 메모리, 네트워크 송수신량, 디스크 입출력량, 프로세스 수를 실시간으로 보여줍니다.

이번 글에서는 Docker Stats의 기본 사용법부터 특정 컨테이너 조회, 한 번만 출력하는 방법, 출력 항목 해석, format 옵션, CPU와 메모리 사용량 분석, Linux 서버 문제 해결 방법까지 자세히 알아보겠습니다.

Table of Contents

Docker Stats란?

docker stats는 Docker 컨테이너의 실시간 자원 사용량을 확인하는 명령어입니다.

기본 명령은 다음과 같습니다.

docker stats

명령을 실행하면 현재 실행 중인 컨테이너의 자원 사용량이 계속 갱신됩니다.

출력 예시는 다음과 같습니다.

CONTAINER ID   NAME      CPU %   MEM USAGE / LIMIT   MEM %   NET I/O         BLOCK I/O       PIDS
a1b2c3d4e5f6   web       2.15%   128MiB / 1GiB      12.50%  25MB / 18MB     8MB / 2MB       15
b2c3d4e5f6a7   mysql     5.80%   512MiB / 2GiB      25.00%  120MB / 95MB    1.2GB / 850MB   43
c3d4e5f6a7b8   redis     0.40%   32MiB / 512MiB     6.25%   45MB / 50MB     3MB / 1MB       6

Docker Stats는 기본적으로 실시간 스트리밍 방식으로 동작합니다.

종료하려면 다음 키를 누릅니다.

Ctrl + C

Docker Stats가 필요한 이유

Docker Stats를 사용하면 다음과 같은 정보를 확인할 수 있습니다.

  • CPU 사용률
  • 메모리 사용량
  • 메모리 제한
  • 네트워크 수신량과 송신량
  • 디스크 읽기와 쓰기
  • 컨테이너 프로세스 수
  • 컨테이너별 자원 사용량 비교
  • 과도한 자원 사용 컨테이너 식별

Docker Host 전체의 CPU와 메모리 사용량은 top, htop, free, vmstat 등으로 확인할 수 있습니다.

하지만 특정 Docker 컨테이너가 어느 정도의 자원을 사용하고 있는지 빠르게 확인하려면 docker stats가 편리합니다.

실행 중인 모든 컨테이너 확인

기본 명령을 실행합니다.

docker stats

실행 중인 컨테이너가 여러 개라면 각 컨테이너의 자원 사용량이 한 화면에 표시됩니다.

Docker Stats는 주기적으로 값을 갱신하므로 사용량이 변화하는 과정을 실시간으로 확인할 수 있습니다.

특정 컨테이너만 확인하기

컨테이너 이름이나 ID를 지정하면 필요한 컨테이너만 조회할 수 있습니다.

docker stats web

여러 컨테이너를 함께 지정할 수도 있습니다.

docker stats web mysql redis

웹 서버와 데이터베이스의 사용량만 비교하고 싶을 때 유용합니다.

한 번만 출력하기

기본 docker stats는 계속 갱신되기 때문에 자동화 스크립트나 결과 저장에 불편할 수 있습니다.

한 번만 결과를 출력하려면 --no-stream 옵션을 사용합니다.

docker stats --no-stream

특정 컨테이너만 한 번 조회할 수도 있습니다.

docker stats --no-stream web

출력 후 명령이 바로 종료되므로 셸 스크립트, 모니터링 작업, 결과 파일 저장에 적합합니다.

모든 컨테이너 표시하기

기본적으로 Docker Stats는 실행 중인 컨테이너를 표시합니다.

중지된 컨테이너를 포함하려면 --all 또는 -a 옵션을 사용할 수 있습니다.

docker stats --all

축약형은 다음과 같습니다.

docker stats -a

중지된 컨테이너는 CPU와 메모리 사용량이 0 또는 사용하지 않는 상태로 표시될 수 있습니다.

Docker Stats 출력 항목

Docker Stats의 대표적인 출력 항목은 다음과 같습니다.

항목설명
CONTAINER ID컨테이너 ID
NAME컨테이너 이름
CPU %컨테이너 CPU 사용률
MEM USAGE / LIMIT메모리 사용량과 제한
MEM %메모리 제한 대비 사용률
NET I/O네트워크 수신량과 송신량
BLOCK I/O디스크 읽기와 쓰기
PIDS컨테이너 내부 프로세스 수

각 항목의 의미를 정확히 이해해야 컨테이너 자원 문제를 분석할 수 있습니다.

CPU % 확인하기

CPU %는 컨테이너가 사용하는 CPU 비율입니다.

출력 예시는 다음과 같습니다.

CPU %
12.50%

컨테이너가 전체 CPU 자원 중 어느 정도를 사용하고 있는지 보여줍니다.

멀티코어 환경에서는 CPU 사용률이 100%를 초과할 수 있습니다.

예를 들어 4개의 CPU 코어를 모두 사용한다면 다음처럼 표시될 수 있습니다.

400%

따라서 CPU 사용률이 150%라고 해서 오류인 것은 아닙니다.

이는 약 1.5개의 CPU 코어를 지속적으로 사용하고 있다는 의미로 해석할 수 있습니다.

컨테이너 CPU 제한 확인하기

Docker Stats는 현재 CPU 사용량을 보여주지만 설정된 CPU 제한을 자세히 확인하려면 Docker Inspect를 함께 사용해야 합니다.

docker inspect \
--format='NanoCPUs={{.HostConfig.NanoCpus}}' \
web

CPU 제한을 설정하여 컨테이너를 실행할 수도 있습니다.

docker run -d \
--name web \
--cpus="1.5" \
nginx

이 컨테이너는 최대 약 1.5개의 CPU 코어를 사용하도록 제한됩니다.

실시간 사용량은 다음 명령으로 확인합니다.

docker stats web

CPU 사용률이 높은 주요 원인

컨테이너 CPU 사용률이 지속적으로 높다면 다음 원인을 확인해야 합니다.

  • 애플리케이션 무한 반복
  • 요청량 증가
  • 비효율적인 데이터 처리
  • 데이터베이스 쿼리 문제
  • 로그 과다 출력
  • 압축 또는 이미지 처리
  • 백그라운드 작업 과부하
  • 가비지 컬렉션 반복
  • 악성 요청 또는 봇 트래픽
  • 컨테이너 내부 프로세스 오류

Docker Stats로 높은 CPU 사용량을 확인했다면 컨테이너 내부 프로세스를 추가로 점검해야 합니다.

docker top web

또는 컨테이너 내부에 접속합니다.

docker exec -it web sh

내부에서 top이나 ps를 실행합니다.

top
ps -ef

MEM USAGE / LIMIT 확인하기

MEM USAGE / LIMIT는 현재 메모리 사용량과 컨테이너에 허용된 최대 메모리를 표시합니다.

출력 예시는 다음과 같습니다.

128MiB / 1GiB

의미는 다음과 같습니다.

현재 사용량 : 128MiB
메모리 제한 : 1GiB

컨테이너에 별도의 메모리 제한이 없다면 Docker Host 전체 메모리를 기준으로 표시될 수 있습니다.

운영 환경에서는 특정 컨테이너가 서버 전체 메모리를 과도하게 사용하지 않도록 제한을 설정하는 것이 좋습니다.

MEM % 확인하기

MEM %는 메모리 제한 대비 현재 사용률입니다.

예를 들어 다음과 같이 표시될 수 있습니다.

MEM %
75.00%

메모리 제한이 1GB이고 현재 768MB를 사용한다면 약 75%로 표시됩니다.

메모리 사용률이 지속적으로 증가한다면 메모리 누수 가능성을 확인해야 합니다.

메모리 제한 설정하기

컨테이너를 실행할 때 --memory 옵션으로 최대 메모리를 제한할 수 있습니다.

docker run -d \
--name web \
--memory="512m" \
nginx

축약형 -m을 사용할 수도 있습니다.

docker run -d \
--name web \
-m 512m \
nginx

설정된 메모리 제한은 다음 명령으로 확인합니다.

docker inspect \
--format='{{.HostConfig.Memory}}' \
web

출력값은 바이트 단위입니다.

536870912

이는 512MB를 의미합니다.

메모리 사용량이 높은 주요 원인

Docker 컨테이너의 메모리 사용량이 높다면 다음 원인을 확인합니다.

  • 애플리케이션 메모리 누수
  • 캐시 데이터 증가
  • 대용량 파일 처리
  • 데이터베이스 버퍼 증가
  • 요청이 종료되지 않고 누적
  • Java Heap 설정 문제
  • Node.js 메모리 사용 증가
  • 로그 데이터 메모리 적재
  • 과도한 동시 접속
  • 프로세스 수 증가

사용량이 계속 증가하고 다시 줄어들지 않는다면 메모리 누수를 의심할 수 있습니다.

OOMKilled 확인하기

컨테이너가 메모리 제한을 초과하면 커널에 의해 강제 종료될 수 있습니다.

OOMKilled 여부를 확인합니다.

docker inspect \
--format='{{.State.OOMKilled}}' \
web

결과가 다음과 같다면 메모리 부족으로 종료된 것입니다.

true

종료 코드도 함께 확인합니다.

docker inspect \
--format='{{.State.ExitCode}}' \
web

종료 코드가 137이라면 SIGKILL이나 메모리 부족 종료 가능성을 확인해야 합니다.

로그도 함께 점검합니다.

docker logs --tail 200 web

NET I/O 확인하기

NET I/O는 컨테이너의 네트워크 수신량과 송신량을 표시합니다.

출력 예시는 다음과 같습니다.

NET I/O
120MB / 85MB

일반적으로 앞의 값은 수신된 데이터이고 뒤의 값은 전송된 데이터입니다.

수신량 / 송신량

웹 서버의 경우 사용자 요청을 수신하고 HTML, 이미지, API 응답을 전송하므로 두 값이 계속 증가할 수 있습니다.

Docker Stats의 네트워크 값은 순간 전송 속도가 아니라 컨테이너 실행 이후 누적된 데이터양으로 이해해야 합니다.

네트워크 사용량이 높은 주요 원인

  • 대용량 파일 다운로드
  • 이미지 또는 동영상 전송
  • API 요청 증가
  • 데이터베이스 복제
  • 백업 파일 전송
  • 로그 수집 시스템 연동
  • 크롤러 또는 봇 요청
  • 비정상 트래픽
  • 서비스 간 과도한 통신
  • 잘못된 재시도 로직

네트워크 사용량이 예상보다 빠르게 증가한다면 애플리케이션 로그와 접속 기록을 함께 확인해야 합니다.

Nginx 컨테이너라면 다음처럼 로그를 확인할 수 있습니다.

docker logs --tail 100 nginx

컨테이너 내부의 수신 포트도 확인합니다.

docker exec nginx ss -lntp

이미지에 ss 명령이 없다면 별도 네트워크 진단 도구가 필요할 수 있습니다.

BLOCK I/O 확인하기

BLOCK I/O는 컨테이너가 디스크에 읽거나 쓴 데이터양을 표시합니다.

출력 예시는 다음과 같습니다.

BLOCK I/O
1.2GB / 850MB

일반적으로 앞의 값은 디스크 읽기, 뒤의 값은 디스크 쓰기입니다.

읽기 / 쓰기

데이터베이스 컨테이너는 데이터 파일을 지속적으로 읽고 쓰기 때문에 BLOCK I/O 값이 크게 증가할 수 있습니다.

디스크 입출력이 높은 주요 원인

  • 데이터베이스 쿼리 증가
  • 대용량 로그 기록
  • 파일 업로드와 다운로드
  • 백업 또는 복원 작업
  • 캐시 파일 생성
  • 임시 파일 과다 생성
  • 데이터 압축 및 해제
  • 애플리케이션 반복 파일 접근
  • Volume 성능 저하
  • 디스크 공간 부족

BLOCK I/O 값이 크다고 해서 반드시 문제가 있는 것은 아닙니다.

데이터베이스나 파일 처리 서비스는 원래 디스크 사용량이 많을 수 있습니다.

중요한 것은 평소보다 갑자기 증가했는지, 애플리케이션 응답 속도 저하와 함께 발생했는지를 확인하는 것입니다.

PIDS 확인하기

PIDS는 컨테이너 내부의 프로세스 또는 스레드 수와 관련된 값을 보여줍니다.

출력 예시는 다음과 같습니다.

PIDS
35

컨테이너 내부에 하나의 애플리케이션만 실행되더라도 해당 애플리케이션이 여러 스레드를 생성하면 PIDS 값이 높게 나타날 수 있습니다.

특히 Java, 데이터베이스, 웹 서버는 여러 스레드나 작업 프로세스를 사용하므로 PIDS가 1보다 큰 것이 정상입니다.

PIDS가 계속 증가할 때

PIDS 값이 지속적으로 증가한다면 다음을 확인해야 합니다.

  • 프로세스가 종료되지 않고 누적
  • 스레드 누수
  • 자식 프로세스 반복 생성
  • 좀비 프로세스 발생
  • 요청마다 프로세스 생성
  • 잘못된 작업 스케줄러
  • 애플리케이션 Fork 오류

컨테이너 내부 프로세스를 확인합니다.

docker top web

더 자세히 확인하려면 다음 명령을 사용할 수 있습니다.

docker exec web ps -ef

스레드까지 확인하려면 이미지 환경에 따라 다음 명령을 사용할 수 있습니다.

docker exec web ps -eLf

PIDS 제한 설정하기

컨테이너가 생성할 수 있는 프로세스 수를 제한할 수 있습니다.

docker run -d \
--name web \
--pids-limit 200 \
nginx

설정값을 확인합니다.

docker inspect \
--format='{{.HostConfig.PidsLimit}}' \
web

프로세스 폭증으로 Docker Host 전체가 영향을 받는 상황을 줄이는 데 도움이 됩니다.

Docker Stats format 옵션

--format 옵션을 사용하면 원하는 항목만 선택해서 출력할 수 있습니다.

기본 형식은 다음과 같습니다.

docker stats \
--no-stream \
--format "{{.Name}} {{.CPUPerc}} {{.MemUsage}}"

출력 예시는 다음과 같습니다.

web 2.15% 128MiB / 1GiB
mysql 5.80% 512MiB / 2GiB
redis 0.40% 32MiB / 512MiB

자동화 스크립트나 모니터링 결과를 간단하게 만들 때 유용합니다.

Docker Stats에서 사용할 수 있는 주요 필드

대표적으로 다음과 같은 필드를 사용할 수 있습니다.

필드설명
.Container컨테이너 ID
.Name컨테이너 이름
.CPUPercCPU 사용률
.MemUsage메모리 사용량과 제한
.MemPerc메모리 사용률
.NetIO네트워크 입출력
.BlockIO디스크 입출력
.PIDs프로세스 수

Docker 환경이나 버전에 따라 일부 출력 필드 이름이 다를 수 있으므로 실제 출력 결과를 확인하는 것이 좋습니다.

이름과 CPU 사용률만 출력하기

docker stats \
--no-stream \
--format "{{.Name}}: {{.CPUPerc}}"

출력 예시는 다음과 같습니다.

web: 2.15%
mysql: 5.80%
redis: 0.40%

이름과 메모리 사용률 출력하기

docker stats \
--no-stream \
--format "{{.Name}}: {{.MemPerc}}"

출력 예시는 다음과 같습니다.

web: 12.50%
mysql: 25.00%
redis: 6.25%

표 형식으로 출력하기

table 형식을 사용하면 열 제목과 함께 보기 좋게 출력할 수 있습니다.

docker stats \
--no-stream \
--format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}"

출력 예시는 다음과 같습니다.

NAME      CPU %     MEM USAGE / LIMIT     MEM %
web       2.15%     128MiB / 1GiB         12.50%
mysql     5.80%     512MiB / 2GiB         25.00%
redis     0.40%     32MiB / 512MiB        6.25%

네트워크와 디스크 사용량만 출력하기

docker stats \
--no-stream \
--format "table {{.Name}}\t{{.NetIO}}\t{{.BlockIO}}"

출력 예시는 다음과 같습니다.

NAME      NET I/O          BLOCK I/O
web       25MB / 18MB      8MB / 2MB
mysql     120MB / 95MB     1.2GB / 850MB

결과를 파일로 저장하기

현재 컨테이너 자원 사용량을 파일로 저장할 수 있습니다.

docker stats --no-stream > docker-stats.txt

날짜와 함께 저장하려면 다음과 같이 사용할 수 있습니다.

echo "$(date)" >> docker-stats.log
docker stats --no-stream >> docker-stats.log

주기적으로 기록하려면 Cron이나 셸 스크립트를 활용할 수 있습니다.

Docker Stats 간단한 기록 스크립트

다음 스크립트는 컨테이너 사용량을 한 번 조회하여 로그 파일에 저장합니다.

#!/bin/bash

LOG_FILE="/var/log/docker-stats.log"

echo "===== $(date '+%Y-%m-%d %H:%M:%S') =====" >> "$LOG_FILE"

docker stats \
--no-stream \
--format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}\t{{.NetIO}}\t{{.BlockIO}}\t{{.PIDs}}" \
>> "$LOG_FILE"

echo "" >> "$LOG_FILE"

실행 권한을 부여합니다.

chmod +x docker-stats.sh

실행합니다.

sudo ./docker-stats.sh

다만 장기적인 모니터링에는 단순 로그 파일보다 Prometheus, Grafana, cAdvisor와 같은 전문 모니터링 도구를 사용하는 것이 더 적합합니다.

Docker Compose 컨테이너 Stats 확인하기

Docker Compose로 실행한 컨테이너도 일반 docker stats 명령으로 확인할 수 있습니다.

docker stats

Compose 프로젝트의 컨테이너 이름을 확인합니다.

docker compose ps

특정 컨테이너만 확인합니다.

docker stats project-web-1 project-db-1

사용하는 Docker Compose 환경에 따라 컨테이너 이름이 프로젝트명과 서비스명을 조합한 형태로 생성될 수 있습니다.

Docker Stats와 docker top 차이

docker statsdocker top은 목적이 다릅니다.

명령어주요 목적
docker stats컨테이너 자원 사용량 확인
docker top컨테이너 내부 프로세스 확인

CPU 사용량이 높은 컨테이너를 먼저 docker stats로 찾고, 어떤 프로세스가 실행 중인지 docker top으로 확인하는 방식이 효과적입니다.

docker stats --no-stream
docker top web

Docker Stats와 docker inspect 차이

명령어확인 내용
docker stats실시간 CPU, 메모리, 네트워크, 디스크 사용량
docker inspect컨테이너 설정과 상태 정보
docker logs애플리케이션 로그
docker exec컨테이너 내부 명령 실행

예를 들어 메모리 사용량은 docker stats로 확인합니다.

docker stats web

설정된 메모리 제한은 docker inspect로 확인합니다.

docker inspect \
--format='{{.HostConfig.Memory}}' \
web

컨테이너 내부 문제는 docker exec로 확인합니다.

docker exec -it web sh

오류 기록은 docker logs로 확인합니다.

docker logs web

Docker Stats와 Linux top 차이

top은 Linux 서버 전체의 프로세스와 자원 사용량을 보여줍니다.

top

docker stats는 Docker 컨테이너 단위의 자원 사용량을 보여줍니다.

docker stats

Docker Host 전체의 부하가 높다면 먼저 top이나 htop으로 시스템 전체를 확인하고, Docker가 원인으로 보인다면 docker stats로 컨테이너별 사용량을 비교하는 것이 좋습니다.

CPU 사용량 높은 컨테이너 찾기

먼저 한 번만 결과를 출력합니다.

docker stats \
--no-stream \
--format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemPerc}}"

출력 예시는 다음과 같습니다.

NAME      CPU %     MEM %
web       3.20%     15.30%
worker    185.50%   45.10%
mysql     12.80%    38.60%

worker 컨테이너의 CPU 사용률이 가장 높습니다.

내부 프로세스를 확인합니다.

docker top worker

로그도 확인합니다.

docker logs --tail 200 worker

실행 명령과 환경 변수도 확인할 수 있습니다.

docker inspect \
--format='{{json .Config.Cmd}}' \
worker
docker inspect \
--format='{{range .Config.Env}}{{println .}}{{end}}' \
worker

메모리 누수 의심 컨테이너 찾기

현재 메모리 사용률을 확인합니다.

docker stats \
--no-stream \
--format "table {{.Name}}\t{{.MemUsage}}\t{{.MemPerc}}"

일정한 시간 간격으로 여러 번 확인했을 때 특정 컨테이너의 메모리 사용량이 계속 증가하고 줄어들지 않는다면 메모리 누수 가능성이 있습니다.

실시간으로 확인합니다.

docker stats app

프로세스 상태를 확인합니다.

docker top app

애플리케이션 로그를 확인합니다.

docker logs -f app

메모리 제한과 OOMKilled 상태를 확인합니다.

docker inspect \
--format='Memory={{.HostConfig.Memory}} OOMKilled={{.State.OOMKilled}}' \
app

컨테이너 자원 제한 설정 예제

CPU와 메모리를 함께 제한할 수 있습니다.

docker run -d \
--name app \
--cpus="1.0" \
--memory="512m" \
myapp

설정을 확인합니다.

docker inspect \
--format='Memory={{.HostConfig.Memory}} NanoCPUs={{.HostConfig.NanoCpus}}' \
app

사용량은 다음 명령으로 확인합니다.

docker stats app

Docker Compose에서 자원 제한하기

Compose 환경에서는 사용 방식과 배포 모드에 따라 자원 제한 설정이 달라질 수 있습니다.

일반적인 로컬 Compose 환경에서는 다음과 같은 설정을 사용할 수 있습니다.

services:
  app:
    image: myapp
    mem_limit: 512m
    cpus: 1.0

실행합니다.

docker compose up -d

실제 적용된 설정은 Inspect로 확인합니다.

docker inspect \
--format='Memory={{.HostConfig.Memory}} NanoCPUs={{.HostConfig.NanoCpus}}' \
컨테이너이름

Compose 파일의 자원 제한 지원 범위는 사용 중인 Compose 버전과 실행 환경을 함께 확인해야 합니다.

Docker Stats 사용 시 주의사항

Docker Stats는 현재 자원 사용 상태를 빠르게 확인하는 데 유용하지만 전문 모니터링 시스템을 완전히 대체하지는 않습니다.

다음과 같은 한계가 있습니다.

  • 장기간 사용량 이력 저장 기능 부족
  • 알림 기능 없음
  • 그래프 제공 없음
  • 컨테이너 재생성 시 비교 어려움
  • 순간적인 사용량만 확인
  • 애플리케이션 내부 상태 확인 불가

지속적인 운영 환경에서는 다음 도구를 함께 고려할 수 있습니다.

  • Prometheus
  • Grafana
  • cAdvisor
  • Node Exporter
  • OpenTelemetry
  • 클라우드 모니터링 서비스

Docker Stats는 빠른 현황 파악과 Linux 서버 문제 해결에 적합하고, 장기적인 추세 분석에는 별도의 모니터링 시스템이 적합합니다.

Docker Stats를 이용한 Linux 서버 문제 해결

웹사이트 응답 속도가 갑자기 느려진 상황을 가정해 보겠습니다.

먼저 Docker Host 전체 부하를 확인합니다.

top

CPU 사용률이 높고 Docker 관련 프로세스가 많은 자원을 사용하는 것을 확인했습니다.

컨테이너별 사용량을 확인합니다.

docker stats --no-stream

출력 결과는 다음과 같다고 가정합니다.

NAME        CPU %     MEM USAGE / LIMIT     MEM %     NET I/O        BLOCK I/O       PIDS
web         5.20%     180MiB / 1GiB         17.58%    80MB / 120MB   10MB / 5MB      18
worker      290.50%   850MiB / 1GiB         83.01%    15MB / 8MB     2GB / 1.5GB     120
mysql       35.20%    1.2GiB / 2GiB         60.00%    250MB / 180MB  5GB / 3GB       55

worker 컨테이너의 CPU, 메모리, 프로세스 수가 모두 높습니다.

프로세스를 확인합니다.

docker top worker

로그를 확인합니다.

docker logs --tail 200 worker

로그에서 동일한 작업이 계속 재시도되는 것을 발견합니다.

Job failed. Retrying...
Job failed. Retrying...
Job failed. Retrying...

환경 변수를 확인합니다.

docker inspect \
--format='{{range .Config.Env}}{{println .}}{{end}}' \
worker

잘못된 API 주소로 인해 작업이 무한 재시도되고 있음을 확인합니다.

환경 변수를 수정한 뒤 컨테이너를 다시 생성합니다.

docker compose up -d --force-recreate worker

다시 자원 사용량을 확인합니다.

docker stats --no-stream worker

CPU와 메모리 사용량이 정상 범위로 내려갔다면 문제가 해결된 것입니다.

이처럼 Docker Stats는 문제가 발생한 컨테이너를 빠르게 찾는 첫 번째 진단 도구로 활용할 수 있습니다.

자주 묻는 질문

Docker Stats는 실행 중인 컨테이너만 보여주나요?

기본적으로 실행 중인 컨테이너를 표시합니다. 중지된 컨테이너까지 포함하려면 --all 옵션을 사용합니다.

docker stats --all

Docker Stats를 한 번만 출력하려면 어떻게 하나요?

--no-stream 옵션을 사용합니다.

docker stats --no-stream

CPU 사용률이 100%를 넘는 이유는 무엇인가요?

멀티코어 시스템에서는 여러 CPU 코어를 사용하면 100%를 초과할 수 있습니다. 예를 들어 2개의 코어를 모두 사용하면 약 200%로 표시될 수 있습니다.

NET I/O는 실시간 전송 속도인가요?

일반적으로 컨테이너가 시작된 이후 누적된 네트워크 수신량과 송신량을 보여줍니다. 초당 전송 속도를 직접 표시하는 값은 아닙니다.

BLOCK I/O는 무엇을 의미하나요?

컨테이너가 블록 장치에서 읽고 쓴 누적 데이터양입니다. 데이터베이스, 백업, 로그 기록이 많은 컨테이너에서 값이 크게 증가할 수 있습니다.

PIDS가 1보다 큰 것은 문제가 있나요?

반드시 문제가 있는 것은 아닙니다. 애플리케이션이 여러 프로세스나 스레드를 사용하면 PIDS가 높게 나타날 수 있습니다. 지속적으로 증가하는지가 중요합니다.

Docker Stats로 메모리 누수를 확인할 수 있나요?

메모리 사용량이 지속적으로 증가하는 현상은 확인할 수 있지만, 누수 원인을 직접 알려주지는 않습니다. 애플리케이션 프로파일러, 로그, Heap 분석 도구를 함께 사용해야 합니다.

Docker Stats 결과를 저장할 수 있나요?

--no-stream 옵션과 출력 리디렉션을 사용하면 파일로 저장할 수 있습니다.

docker stats --no-stream > docker-stats.txt

Docker Stats만으로 운영 모니터링이 충분한가요?

간단한 상태 확인에는 유용하지만 장기간 기록, 그래프, 임계값 알림이 필요한 운영 환경에서는 Prometheus와 Grafana 같은 전문 모니터링 도구를 사용하는 것이 좋습니다.

마무리

Docker Stats는 실행 중인 컨테이너의 CPU, 메모리, 네트워크, 디스크, 프로세스 사용량을 실시간으로 확인하는 핵심 명령어입니다.

기본 docker stats 명령은 값을 계속 갱신하고, --no-stream 옵션은 현재 상태를 한 번만 출력합니다.

CPU 사용률이 높은 컨테이너는 docker topdocker logs로 내부 프로세스와 오류를 확인하고, 메모리 사용률이 높은 컨테이너는 메모리 제한, OOMKilled 상태, 애플리케이션 메모리 누수를 점검해야 합니다.

NET I/O와 BLOCK I/O는 누적 네트워크 및 디스크 사용량을 보여주며, PIDS는 컨테이너 내부 프로세스와 스레드 수를 분석하는 데 활용할 수 있습니다.

Docker Stats는 Linux 서버 문제 해결의 출발점으로 매우 유용하지만 장기적인 운영 모니터링이 필요하다면 Prometheus, Grafana, cAdvisor 같은 도구를 함께 사용하는 것이 좋습니다.

댓글 남기기