IT 끄적이기

Docker Compose로 Prometheus와 Grafana 실행하기

미르아 2025. 1. 7. 10:19
728x90

Prometheus

프로메테우스는 대상 시스템으로부터 각종 모니터링 지표를 수집하여 저장하고 검색할 수 있는 시스템

Prometheus의 특징

  1. 시계열 데이터베이스:
    • Prometheus는 주로 시계열 데이터(time-series data)를 수집하고 저장하는 모니터링 도구
    • 메트릭 데이터를 특정 시간 간격으로 스크랩하여 저장
  2. 메트릭 기반 모니터링:
    • 다양한 Exporter를 통해 서버, 애플리케이션, 네트워크 장치 등에서 메트릭 데이터를 수집
    • PromQL(Prometheus Query Language)을 사용하여 데이터를 조회하고 분석
  3. Alertmanager와 연동:
    • 특정 조건에 따라 경고(Alert)를 생성하고, Slack, 이메일 등으로 알림을 보낼 수 있음
  4. 독립적인 데이터 수집:
    • 수집 대상이 HTTP로 메트릭 데이터를 노출하면 Prometheus가 직접 데이터를 수집
    • 별도의 에이전트 설치가 필요하지 않음
  5. 경량화 및 높은 성능:
    • 경량화된 구조로 대규모 환경에서도 빠른 데이터 처리와 저장이 가능

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