cAdvisor로 Docker 컨테이너 메트릭 모니터링
cAdvisor로 Docker 컨테이너 메트릭 모니터링 (Monitoring Docker container metrics using cAdvisor)
cAdvisor(Container Advisor의 줄임말)는 실행 중인 컨테이너의 리소스 사용량과 성능 데이터를 분석하고 노출해요. cAdvisor는 기본적으로 Prometheus 메트릭을 노출합니다. 이 가이드에서는:
- 각각 Prometheus, cAdvisor, Redis 서버를 실행하는 컨테이너를 포함한 로컬 다중 컨테이너 Docker Compose 설치를 만들고,
- cAdvisor가 수집하고 Prometheus가 스크레이프한, Redis 컨테이너가 만들어낸 일부 컨테이너 메트릭을 살펴봅니다.
출처: 문서
본문
cAdvisor(Container Advisor의 줄임말)는 실행 중인 컨테이너의 리소스 사용량과 성능 데이터를 분석하고 노출합니다. cAdvisor는 기본적으로 Prometheus 메트릭을 노출해요. 이 가이드에서는:
- 각각 Prometheus, cAdvisor, Redis 서버를 실행하는 컨테이너를 포함한 로컬 다중 컨테이너 Docker Compose 설치를 만들고,
- cAdvisor가 수집하고 Prometheus가 스크레이프한, Redis 컨테이너가 만들어낸 일부 컨테이너 메트릭을 살펴봅니다.
Prometheus 설정
먼저 cAdvisor에서 메트릭을 스크레이프하도록 Prometheus를 구성해야 합니다. prometheus.yml 파일을 만들고 이 구성으로 채웁니다:
scrape_configs:
- job_name: cadvisor
scrape_interval: 5s
static_configs:
- targets:
- cadvisor:8080
Docker Compose 설정
이제 설치의 일부인 컨테이너와 각 컨테이너가 노출하는 포트, 사용하는 볼륨 등을 지정하는 Docker Compose 구성을 만들어야 합니다.
prometheus.yml 파일을 만든 같은 폴더에 docker-compose.yml 파일을 만들고 다음 Docker Compose 구성으로 채웁니다:
바인드 마운트 사용하기 (Using Bind Mounts)
version: '3.2'
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
ports:
- 9090:9090
command:
- --config.file=/etc/prometheus/prometheus.yml
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
depends_on:
- cadvisor
cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
container_name: cadvisor
ports:
- 8080:8080
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
depends_on:
- redis
redis:
image: redis:latest
container_name: redis
ports:
- 6379:6379
이 구성은 Docker Compose에게 각각 Docker 컨테이너에 해당하는 세 개의 서비스를 실행하라고 지시합니다:
prometheus서비스는 로컬prometheus.yml설정 파일(볼륨 파라미터로 컨테이너에 가져옴)을 사용합니다.cadvisor서비스는 포트 8080(cAdvisor 메트릭의 기본 포트)을 노출하고 다양한 로컬 볼륨(/,/var/run등)에 의존합니다.redis서비스는 표준 Redis 서버입니다. cAdvisor는 추가 구성 없이 자동으로 이 컨테이너에서 컨테이너 메트릭을 수집합니다.
설치를 실행하려면:
docker-compose up
Docker Compose가 세 컨테이너를 모두 성공적으로 시작하면 다음과 같은 출력이 보입니다:
prometheus | level=info ts=2018-07-12T22:02:40.5195272Z caller=main.go:500 msg="Server is ready to receive web requests."
ps 명령으로 세 컨테이너가 모두 실행 중인지 확인할 수 있습니다:
docker-compose ps
출력은 대략 다음과 같습니다:
Name Command State Ports
----------------------------------------------------------------------------
cadvisor /usr/bin/cadvisor -logtostderr Up 8080/tcp
prometheus /bin/prometheus --config.f ... Up 0.0.0.0:9090->9090/tcp
redis docker-entrypoint.sh redis ... Up 0.0.0.0:6379->6379/tcp
대안: 인라인 Docker Config 사용 (원격 배포)
원격 Docker 호스트를 관리하고 호스트에 별도의 설정 파일을 관리하지 않으면서 모든 구성을 docker-compose.yml 파일 안에 유지하는 것을 선호한다면, Docker의 configs 기능을 사용할 수 있습니다:
version: '3.8'
configs:
prometheus_config:
content: |
scrape_configs:
- job_name: 'cadvisor'
scrape_interval: 5s
static_configs:
- targets: ['cadvisor:8080']
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
ports:
- 9090:9090
command:
- --config.file=/etc/prometheus/prometheus.yml
configs:
- source: prometheus_config
target: /etc/prometheus/prometheus.yml
uid: "65534" # 필수: 'nobody' 사용자의 숫자 UID
gid: "65534" # 필수: 'nobody' 그룹의 숫자 GID
mode: 0400 # 필수: 읽기 전용 권한
depends_on:
- cadvisor
cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
container_name: cadvisor
ports:
- 8080:8080
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
depends_on:
- redis
redis:
image: redis:latest
container_name: redis
ports:
- 6379:6379
중요 참고사항
⚠️ 필수 필드: Docker configs를 사용할 때는 uid, gid, mode를 숫자 값으로 명시적으로 지정해야 합니다:
uid: "65534"— 숫자 사용자 ID (65534 = Prometheus 이미지의nobody사용자)gid: "65534"— 숫자 그룹 ID (65534 =nobody그룹)mode: 0400— 파일 권한 (소유자에 대해 읽기 전용)
이 필드를 생략하거나 "nobody" 같은 문자열 값을 사용하면 다음 오류가 발생합니다:
strconv.Atoi: parsing "nobody": invalid syntax
cAdvisor 웹 UI 탐색
cAdvisor 웹 UI는 http://localhost:8080에서 접근할 수 있습니다. 설치에서 특정 Docker 컨테이너에 대한 통계와 그래프는 http://localhost:8080/docker/에서 탐색할 수 있습니다. 예를 들어 Redis 컨테이너 메트릭은 http://localhost:8080/docker/redis, Prometheus는 http://localhost:8080/docker/prometheus 등에서 접근할 수 있습니다.
표현식 브라우저에서 메트릭 탐색
cAdvisor의 웹 UI는 cAdvisor가 모니터링하는 것들을 탐색하기에 유용한 인터페이스지만, 컨테이너 메트릭을 탐색하는 인터페이스는 제공하지 않습니다. 그러려면 http://localhost:9090/graph에서 사용할 수 있는 Prometheus 표현식 브라우저가 필요합니다. 표현식 입력란에 Prometheus 표현식을 입력할 수 있습니다.
container_start_time_seconds 메트릭부터 탐색해볼게요. 이 메트릭은 컨테이너의 시작 시간(초 단위)을 기록합니다. name="<name>" 표현식으로 특정 컨테이너를 선택할 수 있습니다. 컨테이너 이름은 Docker Compose 설정의 container_name 파라미터에 해당합니다. 예를 들어 container_start_time_seconds{name="redis"} 표현식은 redis 컨테이너의 시작 시간을 보여줍니다.
참고: Prometheus에 노출되는 cAdvisor가 수집한 컨테이너 메트릭의 전체 목록은 cAdvisor 문서에서 찾을 수 있습니다.
다른 표현식들
아래 표는 몇 가지 다른 예시 표현식을 나열합니다:
| 표현식 | 설명 | 대상 |
|---|---|---|
rate(container_cpu_usage_seconds_total{name="redis"}[1m]) |
지난 1분 동안의 cgroup CPU 사용량 | redis 컨테이너 |
container_memory_usage_bytes{name="redis"} |
cgroup의 총 메모리 사용량(바이트 단위) | redis 컨테이너 |
rate(container_network_transmit_bytes_total[1m]) |
지난 1분 동안 컨테이너가 초당 네트워크로 전송한 바이트 | 모든 컨테이너 |
rate(container_network_receive_bytes_total[1m]) |
지난 1분 동안 컨테이너가 초당 네트워크로 수신한 바이트 | 모든 컨테이너 |
요약 (Summary)
이 가이드에서는 Docker Compose로 단일 설치에서 세 개의 분리된 컨테이너를 실행했습니다. Prometheus 컨테이너가 cAdvisor 컨테이너에서 메트릭을 스크레이프했고, cAdvisor는 다시 Redis 컨테이너가 만들어낸 메트릭을 수집했습니다. 그런 다음 Prometheus 표현식 브라우저로 몇 가지 cAdvisor 컨테이너 메트릭을 탐색했습니다.
더 알아보기 (Learn more)
- node_exporter 가이드 — 호스트 수준 노드 메트릭 수집
- 표현식 브라우저 — Prometheus UI에서 메트릭 탐색
- cAdvisor 문서 — 컨테이너 메트릭 목록
- 기본 인증 가이드 — Prometheus 보안 설정