IT 끄적이기
Docker Compose로 Prometheus와 Grafana 실행하기
미르아
2025. 1. 7. 10:19
728x90
Prometheus
프로메테우스는 대상 시스템으로부터 각종 모니터링 지표를 수집하여 저장하고 검색할 수 있는 시스템
Prometheus의 특징
- 시계열 데이터베이스:
- Prometheus는 주로 시계열 데이터(time-series data)를 수집하고 저장하는 모니터링 도구
- 메트릭 데이터를 특정 시간 간격으로 스크랩하여 저장
- 메트릭 기반 모니터링:
- 다양한 Exporter를 통해 서버, 애플리케이션, 네트워크 장치 등에서 메트릭 데이터를 수집
- PromQL(Prometheus Query Language)을 사용하여 데이터를 조회하고 분석
- Alertmanager와 연동:
- 특정 조건에 따라 경고(Alert)를 생성하고, Slack, 이메일 등으로 알림을 보낼 수 있음
- 독립적인 데이터 수집:
- 수집 대상이 HTTP로 메트릭 데이터를 노출하면 Prometheus가 직접 데이터를 수집
- 별도의 에이전트 설치가 필요하지 않음
- 경량화 및 높은 성능:
- 경량화된 구조로 대규모 환경에서도 빠른 데이터 처리와 저장이 가능
Grafana
그라파나는 프로메테우스를 비롯한 여러 데이터들을 시각화해주는 모니터링 툴
- 강력한 시각화 도구:
- Grafana는 Prometheus 데이터를 기반으로 사용자 지정 대시보드를 생성하여 시각화
- 다양한 차트, 그래프, 게이지를 통해 데이터를 직관적으로 표현
- 다양한 데이터 소스 지원:
- Prometheus뿐만 아니라 Elasticsearch, MySQL, InfluxDB 등 다양한 데이터 소스와 통합 가능
- 대시보드 템플릿:
- 이미 만들어진 템플릿을 다운로드받아 빠르게 대시보드를 구성할 수 있음
- 경고(Alert) 기능:
- Grafana 자체적으로도 경고를 설정하여 Slack, 이메일, PagerDuty 등을 통해 알림을 받을 수 있음
- 사용자 및 팀 협업 지원:
- 대시보드를 다른 사용자와 공유하거나 Export/Import하여 재사용 가능
Docker Compose로 Prometheus와 Grafana 실행하기
docker-compose.yml
version: '3.8' # Docker Compose 파일의 버전
services:
prometheus: # Prometheus 서비스 정의
image: prom/prometheus:latest # Prometheus의 최신 이미지 사용
container_name: prometheus # 컨테이너 이름 설정
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml # 로컬의 prometheus.yml 파일을 컨테이너 내부로 마운트
ports:
- "9090:9090" # Prometheus 웹 UI를 외부에서 접근할 수 있도록 9090 포트 매핑
restart: always # 컨테이너가 종료되더라도 자동으로 재시작
grafana: # Grafana 서비스 정의
image: grafana/grafana:latest # Grafana의 최신 이미지 사용
container_name: grafana # 컨테이너 이름 설정
ports:
- "3000:3000" # Grafana 웹 UI를 외부에서 접근할 수 있도록 3000 포트 매핑
environment:
- GF_SECURITY_ADMIN_USER=admin # Grafana 관리자 계정 ID
- GF_SECURITY_ADMIN_PASSWORD=admin # Grafana 관리자 계정 비밀번호
restart: always # 컨테이너가 종료되더라도 자동으로 재시작
nginx-exporter: # Nginx Exporter 서비스 정의
image: nginx/nginx-prometheus-exporter:latest # Nginx Exporter의 최신 이미지 사용
container_name: nginx-exporter # 컨테이너 이름 설정
ports:
- "9113:9113" # Nginx Exporter의 기본 포트 매핑
command: -nginx.scrape-uri=http://nginx:80/nginx_status # Nginx 상태를 스크랩할 URI 설정
depends_on:
- nginx # Nginx Exporter는 Nginx 서비스가 실행된 후에 시작
restart: always # 컨테이너가 종료되더라도 자동으로 재시작
nginx: # Nginx 서비스 정의
image: nginx:latest # Nginx의 최신 이미지 사용
container_name: nginx # 컨테이너 이름 설정
ports:
- "80:80" # Nginx의 기본 HTTP 포트 매핑
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf # 로컬의 nginx.conf 파일을 컨테이너 내부로 마운트
restart: always # 컨테이너가 종료되더라도 자동으로 재시작
Prometheus 설정 파일
Prometheus가 Nginx Exporter를 스크랩하도록 설정하는 파일
prometheus.yml
global:
scrape_interval: 15s # 데이터를 스크랩하는 기본 간격 (15초)
evaluation_interval: 15s # Alert 규칙 등을 평가하는 간격 (15초)
scrape_configs:
# Prometheus 자체를 모니터링
- job_name: 'prometheus' # Job 이름: Prometheus 자체
static_configs:
- targets: ['localhost:9090'] # Prometheus 서버 자체를 모니터링 (9090 포트)
# Nginx Exporter를 통한 Nginx 모니터링
- job_name: 'nginx_exporter' # Job 이름: Nginx Exporter
static_configs:
- targets: ['nginx-exporter:9113'] # Nginx Exporter의 기본 포트 (9113)에서 데이터를 수집
Nginx conf 파일
각자 서버 설정에 맞게 설정 필요
user nginx; # Nginx 프로세스를 실행할 사용자 (기본값: nginx)
worker_processes auto; # Nginx 워커 프로세스의 개수를 자동으로 설정 (CPU 코어 개수 기반)
error_log /var/log/nginx/error.log warn; # 에러 로그 파일 위치 및 로그 레벨 (warn: 경고 수준)
pid /var/run/nginx.pid; # Nginx 프로세스의 PID 파일 위치
events {
worker_connections 1024; # 각 워커 프로세스가 처리할 수 있는 최대 연결 수
}
http {
include /etc/nginx/mime.types; # MIME 타입 파일 포함
default_type application/octet-stream; # 기본 MIME 타입 설정
sendfile on; # sendfile을 활성화하여 파일 전송 속도 향상
keepalive_timeout 65; # 클라이언트와의 연결을 유지할 시간 (초 단위)
server {
listen 80; # Nginx가 요청을 수신할 포트 (기본 HTTP 포트)
server_name localhost; # 서버 이름 (현재는 로컬호스트로 설정)
location / {
root /usr/share/nginx/html; # 정적 파일의 루트 디렉터리
index index.html index.htm; # 기본 인덱스 파일
}
location /nginx_status { # Nginx 상태를 확인하기 위한 URI
stub_status; # Nginx 상태 정보를 노출
allow all; # 모든 IP에서 접근 허용 (보안을 위해 특정 IP로 제한 가능)
}
}
}
Docker-compose.yml 파일이 있는 경로에서
docker-compose up -d 명령어 실행 후 도커컴포즈 실행 확인
설정해 둔 IP:PORT 번호로 접속
- Prometheus: http://<서버 IP>:9090
- Grafana: http://<서버 IP>:3000 (기본 사용자: admin, 비밀번호: admin)
1. Docker Compose 파일
- Prometheus, Grafana, Nginx, Nginx Exporter를 독립적인 컨테이너로 실행하며, 각 서비스가 필요한 포트를 공개.
- 모든 컨테이너는 종료되더라도 자동으로 재시작(restart: always) 설정이 적용
2. Prometheus 설정 파일
- Prometheus는 Nginx Exporter를 통해 Nginx 상태를 모니터링
- 자체적으로 Prometheus 상태도 모니터링 가능
3. Nginx 설정 파일
- Nginx는 /nginx_status 경로를 통해 서버 상태 정보를 Prometheus가 수집할 수 있도록 노출
- stub_status 디렉티브는 활성 연결, 처리 중 요청 등의 상태를 제공
728x90