CodeGym /행동 /Docker SELF /모니터링 및 로깅 설정

모니터링 및 로깅 설정

Docker SELF
레벨 24 , 레슨 1
사용 가능

7.1 Prometheus를 사용한 모니터링 설정

이 단계에서는 다중 컨테이너 앱을 위한 모니터링 및 로깅을 설정하는 방법을 설명할게. 이 작업을 통해 서비스 상태와 성능을 추적하고, 로그를 수집/분석해서 문제를 진단할 수 있어.

목표: 서비스에서 메트릭을 수집하고 이를 시각화해서 앱의 성능과 상태를 모니터링하는 거야.

Prometheus 설치 및 설정

이 예제에서는 Prometheus를 Docker를 사용해서 실행해 볼 거야. 이 방식은 크로스 플랫폼을 지원하고, Docker를 지원하는 어떤 운영 체제에서도 동일하게 모니터링을 배포할 수 있어.

1. Prometheus 구성 디렉토리 생성:

Terminal

mkdir prometheus
cd prometheus

2. prometheus.yml 구성 파일 생성:

Yaml

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'flask-app'
    static_configs:
      - targets: ['backend:5000']
  - job_name: 'node-app'
    static_configs:
      - targets: ['frontend:3000']

3. Prometheus를 위한 Dockerfile 생성:

dockerfile

FROM prom/prometheus
COPY prometheus.yml /etc/prometheus/prometheus.yml

4. Prometheus를 compose.yaml에 추가:

Yaml

version: '3'

services:
  frontend:
    build: ./frontend
    ports:
      - "3000:3000"
    networks:
      - task-network

  backend:
    build: ./backend
    ports:
      - "5000:5000"
    depends_on:
      - database
    networks:
      - task-network
    environment:
      - DATABASE_URL=postgresql://taskuser:taskpassword@database:5432/taskdb

  database:
    image: postgres:13
    environment:
      - POSTGRES_DB=taskdb
      - POSTGRES_USER=taskuser
      - POSTGRES_PASSWORD=taskpassword
    networks:
      - task-network
    volumes:
      - db-data:/var/lib/postgresql/data

  nginx:
    build: ./nginx
    ports:
      - "80:80"
    depends_on:
      - frontend
      - backend
    networks:
      - task-network

  prometheus:
    build: ./prometheus
    ports:
      - "9090:9090"
    networks:
      - task-network

networks:
  task-network:
    driver: bridge

volumes:
  db-data:

7.2 Grafana 설치 및 설정

1. Grafana 설정용 디렉토리 생성:

Terminal

mkdir grafana
cd grafana

2. Grafana용 Dockerfile 생성:

dockerfile

FROM grafana/grafana

3. docker-compose.yml에 Grafana 추가하기:

Yaml

  grafana:
    image: grafana/grafana
    ports:
      - "3033:3000"
    depends_on:
      - prometheus
    networks:
      - task-network

4. Prometheus와 함께 Grafana를 설정하기:

  1. docker compose up 명령어로 컨테이너를 실행해.
  2. 웹 브라우저에서 http://localhost:3033에 접속해.
  3. 기본 로그인 정보(admin/admin)로 로그인해.
  4. "Configuration" -> "Data Sources"로 이동해서 새로운 데이터 소스를 추가해.
  5. "Prometheus"를 선택하고 URL http://prometheus:9090을 입력해.
  6. 설정을 저장해.

Grafana 대시보드 생성

  1. 새로운 대시보드 생성하기:
    • "Create" -> "Dashboard"로 이동해.
    • "Add new panel"을 눌러.
    • "Query" 섹션에서 데이터 소스 Prometheus를 선택해.
    • PromQL을 사용해 메트릭 조회 쿼리를 입력해. 예를 들어, CPU 사용량을 모니터링하려면:
  2. Promql
    
    rate(container_cpu_usage_seconds_total[1m]) 
            
  3. 패널(Panel) 설정:
    • 그래프 유형을 선택해 (예: "Graph").
    • 패널을 설정해 (예: 제목, 범례, 축 등).
    • "Apply"를 눌러 패널을 저장해.
  4. 추가 패널 생성:
    • 메모리, 네트워크, 디스크와 같은 다른 메트릭을 위한 추가 패널을 생성하려면 이전 단계를 반복해.

7.3 ELK Stack 설정

ELK Stack (Elasticsearch, Logstash, Kibana)를 사용한 로깅 설정.

목표: 서비스의 로그를 수집, 저장 및 분석하기.

Elasticsearch 설치 및 설정

compose.yamlElasticsearch 추가:

Yaml

  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.15.0
    environment:
      - discovery.type=single-node
    ports:
      - "9200:9200"
    networks:
      - task-network

Logstash 설치 및 설정

1단계. Logstash 구성용 디렉토리 생성:

Terminal

mkdir logstash
cd logstash

2단계. logstash.conf 구성 파일 생성:

Text

input {
  beats {
    port => 5044
  }
}
filter {
  json {
    source => "message"
  }
}
output {
  elasticsearch {
    hosts => ["elasticsearch:9200"]
    index => "docker-logs-%{+YYYY.MM.dd}"
  }
}

3단계. Logstash용 Dockerfile 생성:

dockerfile

FROM docker.elastic.co/logstash/logstash:8.15.0
COPY logstash.conf /usr/share/logstash/pipeline/logstash.conf

4단계. compose.yaml에 Logstash 추가:

Yaml

  logstash:
    build: ./logstash
    ports:
      - "5044:5044"
    depends_on:
      - elasticsearch
    networks:
      - task-network

Kibana 설치 및 설정

compose.yaml에 Kibana 추가:

Yaml

  kibana:
    image: docker.elastic.co/kibana/kibana:8.15.0
    ports:
      - "5601:5601"
    depends_on:
      - elasticsearch
    networks:
      - task-network

로그 수집을 위한 Filebeat 설치

1단계. Filebeat 구성용 디렉토리 생성:

Terminal

mkdir filebeat
cd filebeat

2단계. filebeat.yml 구성 파일 생성:

Yaml

filebeat.inputs:
- type: docker
  containers.ids:
    - '*'
processors:
  - add_docker_metadata: ~
output.logstash:
  hosts: ["logstash:5044"]

3단계. Filebeat용 Dockerfile 생성:

dockerfile

FROM docker.elastic.co/beats/filebeat:8.15.0
COPY filebeat.yml /usr/share/filebeat/filebeat.yml

4단계. compose.yaml에 Filebeat 추가:

Yaml

filebeat:
    build: ./filebeat
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
    depends_on:
      - logstash
    networks:
      - task-network

7.4 전체 파일

전체 파일 compose.yaml

Yaml

version: '3'

services:
  frontend:
    build: ./frontend
    ports:
      - "3000:3000"
    networks:
      - task-network
        
  backend:
    build: ./backend
    ports:
      - "5000:5000"
    depends_on:
      - database
    networks:
      - task-network
    environment:
      - DATABASE_URL=postgresql://taskuser:taskpassword@database:5432/taskdb
        
  database:
    image: postgres:13
    environment:
      - POSTGRES_DB=taskdb
      - POSTGRES_USER=taskuser
      - POSTGRES_PASSWORD=taskpassword
    networks:
      - task-network
    volumes:
      - db-data:/var/lib/postgresql/data
        
  nginx:
    build: ./nginx
    ports:
      - "80:80"
    depends_on:
      - frontend
      - backend
    networks:
      - task-network
        
  prometheus:
    build: ./prometheus
    ports:
      - "9090:9090"
    networks:
      - task-network
        
  grafana:
    image: grafana/grafana
    ports:
      - "3033:3000"
    depends_on:
      - prometheus
    networks:
      - task-network
        
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.9.2
    environment:
      - discovery.type=single-node
    ports:
      - "9200:9200"
    networks:
      - task-network
        
  logstash:
    build: ./logstash
    ports:
      - "5044:5044"
    depends_on:
      - elasticsearch
    networks:
      - task-network
        
  kibana:
    image: docker.elastic.co/kibana/kibana:7.9.2
    ports:
      - "5601:5601"
    depends_on:
      - elasticsearch
    networks:
      - task-network
        
  filebeat:
    build: ./filebeat
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
    depends_on:
      - logstash
    networks:
      - task-network
        
networks:
  task-network:
    driver: bridge
        
volumes:
  db-data:
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION