docker container stats
docker container stats
docker container stats는 컨테이너의 리소스 사용량 통계를 실시간으로 보여 주는 명령이에요. CPU·메모리 같은 리소스 소비를 지켜보고 싶을 때 써요.
출처: 문서
본문
docker stats 명령은 실행 중인 컨테이너에 대한 실시간 데이터 스트림을 반환해요. 데이터를 하나 이상의 특정 컨테이너로 제한하려면 컨테이너 이름이나 ID 목록을 공백으로 구분해 지정해요. 정지된 컨테이너를 지정할 수는 있지만 정지된 컨테이너는 데이터를 반환하지 않아요. 컨테이너의 리소스 사용량에 대한 더 자세한 정보가 필요하면 /containers/(id)/stats API 엔드포인트를 사용해요.
참고: Linux에서 Docker CLI는 총 메모리 사용량에서 캐시 사용량을 빼서 메모리 사용량을 보고해요. API는 그런 계산을 하지 않고 총 메모리 사용량과 캐시의 양을 제공하므로 클라이언트가 필요에 따라 데이터를 쓸 수 있어요. 캐시 사용량은 cgroup v1 호스트에서
memory.stat파일의total_inactive_file필드 값으로 정의돼요. Docker 19.03 이하에서는 캐시 사용량이cache필드 값으로 정의됐고, cgroup v2 호스트에서는 캐시 사용량이inactive_file필드 값으로 정의돼요.
참고: PIDS 열은 해당 컨테이너가 만든 프로세스와 커널 스레드의 수를 포함해요. Threads는 Linux 커널이 쓰는 용어예요. "lightweight process"나 "kernel task" 같은 동등한 용어도 있어요. PIDS 열의 큰 수와 (
ps나top이 보고하는) 작은 프로세스 수가 함께 나타나면 컨테이너 안에서 무언가가 많은 스레드를 만들고 있을 가능성이 있어요.
사용법 (Usage)
docker container stats [OPTIONS] [CONTAINER...]
별칭 (Aliases)
별칭은 긴 명령 대신 쓸 수 있는 짧고 기억하기 쉬운 대안이에요.
docker stats
옵션 (Options)
| 옵션 | 기본값 | 설명 |
|---|---|---|
-a, --all |
모든 컨테이너를 보여 줘요 (기본은 실행 중인 것만) | |
--format |
사용자 지정 템플릿으로 출력 형식을 정해요: table(기본, 열 머리글 있는 테이블), table TEMPLATE(Go 템플릿 사용 테이블), json(JSON), TEMPLATE(Go 템플릿 사용 출력). 템플릿 출력 포맷팅에 대한 자세한 내용은 https://docs.docker.com/go/formatting/ 참고 |
|
--no-stream |
스트리밍 통계를 끄고 첫 번째 결과만 가져와요 | |
--no-trunc |
출력을 자르지 않아요 |
예제 (Examples)
Linux 데몬에 대해 실행 중인 모든 컨테이너에서 docker stats를 실행한 예시예요.
$ docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
b95a83497c91 awesome_brattain 0.28% 5.629MiB / 1.952GiB 0.28% 916B / 0B 147kB / 0B 9
67b2525d8ad1 foobar 0.00% 1.727MiB / 1.952GiB 0.09% 2.48kB / 0B 4.11MB / 0B 2
e5c383697914 test-1951.1.kay7x1lh1twk9c0oig50sd5tr 0.00% 196KiB / 1.952GiB 0.01% 71.2kB / 0B 770kB / 0B 1
4bda148efbc0 random.1.vnc8on831idyr42slu578u3cr 0.00% 1.672MiB / 1.952GiB 0.08% 110kB / 0B 578kB / 0B 2
--format으로 형식 문자열을 지정하지 않으면 다음 열이 표시돼요.
| 열 이름 | 설명 |
|---|---|
| CONTAINER ID와 Name | 컨테이너의 ID와 이름 |
| CPU %와 MEM % | 컨테이너가 사용 중인 호스트 CPU·메모리의 백분율 |
| MEM USAGE / LIMIT | 컨테이너가 사용 중인 총 메모리와 사용이 허용된 총 메모리 |
| NET I/O | 컨테이너가 네트워크 인터페이스를 통해 받고 보낸 데이터 양 |
| BLOCK I/O | 컨테이너가 호스트의 블록 디바이스에 쓰고 읽은 데이터 양 |
| PIDs | 컨테이너가 만든 프로세스 또는 스레드 수 |
Linux 데몬에 대해 이름과 ID로 여러 컨테이너에서 docker stats를 실행한 예시예요.
$ docker stats awesome_brattain 67b2525d8ad1
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
b95a83497c91 awesome_brattain 0.28% 5.629MiB / 1.952GiB 0.28% 916B / 0B 147kB / 0B 9
67b2525d8ad1 foobar 0.00% 1.727MiB / 1.952GiB 0.09% 2.48kB / 0B 4.11MB / 0B 2
이름이 nginx인 컨테이너에 docker stats를 실행하고 json 형식으로 출력을 얻은 예시예요.
$ docker stats nginx --no-stream --format "{{ json . }}"
{"BlockIO":"0B / 13.3kB","CPUPerc":"0.03%","Container":"nginx","ID":"ed37317fbf42","MemPerc":"0.24%","MemUsage":"2.352MiB / 982.5MiB","Name":"nginx","NetIO":"539kB / 606kB","PIDs":"2"}
모든(실행 중 및 정지된) 컨테이너에 사용자 지정 형식으로 docker stats를 실행한 예시예요.
$ docker stats --all --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}" fervent_panini 5acfcb1b4fd1 humble_visvesvaraya big_heisenberg
CONTAINER CPU % MEM USAGE / LIMIT
fervent_panini 0.00% 56KiB / 15.57GiB
5acfcb1b4fd1 0.07% 32.86MiB / 15.57GiB
humble_visvesvaraya 0.00% 0B / 0B
big_heisenberg 0.00% 0B / 0B
위 예제에서 humble_visvesvaraya와 big_heisenberg는 정지된 컨테이너예요.
Windows 데몬에 대해 실행 중인 모든 컨테이너에서 docker stats를 실행한 예시예요.
PS E:\> docker stats
CONTAINER ID CPU % PRIV WORKING SET NET I/O BLOCK I/O
09d3bb5b1604 6.61% 38.21 MiB 17.1 kB / 7.73 kB 10.7 MB / 3.57 MB
9db7aa4d986d 9.19% 38.26 MiB 15.2 kB / 7.65 kB 10.6 MB / 3.3 MB
3f214c61ad1d 0.00% 28.64 MiB 64 kB / 6.84 kB 4.42 MB / 6.93 MB
Windows 데몬에 대해 이름과 ID로 여러 컨테이너에서 docker stats를 실행한 예시예요.
PS E:\> docker ps -a
CONTAINER ID NAME IMAGE COMMAND CREATED STATUS PORTS NAMES
3f214c61ad1d awesome_brattain nanoserver "cmd" 2 minutes ago Up 2 minutes big_minsky
9db7aa4d986d mad_wilson windowsservercore "cmd" 2 minutes ago Up 2 minutes mad_wilson
09d3bb5b1604 fervent_panini windowsservercore "cmd" 2 minutes ago Up 2 minutes affectionate_easley
PS E:\> docker stats 3f214c61ad1d mad_wilson
CONTAINER ID NAME CPU % PRIV WORKING SET NET I/O BLOCK I/O
3f214c61ad1d awesome_brattain 0.00% 46.25 MiB 76.3 kB / 7.92 kB 10.3 MB / 14.7 MB
9db7aa4d986d mad_wilson 9.59% 40.09 MiB 27.6 kB / 8.81 kB 17 MB / 20.1 MB
출력 형식 지정하기 (--format)
형식 옵션(--format)은 Go 템플릿으로 컨테이너 출력을 pretty-print해요. Go 템플릿의 유효한 자리표시자는 다음과 같아요.
| 자리표시자 | 설명 |
|---|---|
.Container |
컨테이너 이름 또는 ID (사용자 입력) |
.Name |
컨테이너 이름 |
.ID |
컨테이너 ID |
.CPUPerc |
CPU 백분율 |
.MemUsage |
메모리 사용량 |
.NetIO |
네트워크 IO |
.BlockIO |
블록 IO |
.MemPerc |
메모리 백분율 (Windows에서는 사용 불가) |
.PIDs |
PID 수 (Windows에서는 사용 불가) |
--format 옵션을 쓰면 stats 명령은 템플릿이 선언한 대로 데이터를 정확히 출력하거나, table 지시자를 쓰면 열 머리글도 포함해요. 다음 예제는 머리글이 없는 템플릿을 써서 모든 이미지에 대해 콜론(:)으로 구분된 Container와 CPUPerc 항목을 출력해요.
$ docker stats --format "{{.Container}}: {{.CPUPerc}}"
09d3bb5b1604: 6.61%
9db7aa4d986d: 9.19%
3f214c61ad1d: 0.00%
모든 컨테이너 통계를 이름·CPU 백분율·메모리 사용량과 함께 테이블 형식으로 나열하려면 이렇게 써요.
$ docker stats --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}"
CONTAINER CPU % PRIV WORKING SET
1285939c1fd3 0.07% 796 KiB / 64 MiB
9c76f7834ae2 0.07% 2.746 MiB / 64 MiB
d1ea048f04e4 0.03% 4.583 MiB / 64 MiB
기본 형식은 다음과 같아요.
Linux:
"table {{.ID}}\t{{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}\t{{.NetIO}}\t{{.BlockIO}}\t{{.PIDs}}"
Windows:
"table {{.ID}}\t{{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}\t{{.BlockIO}}"