7.1 Prometheus를 사용한 모니터링 설정
이 단계에서는 다중 컨테이너 앱을 위한 모니터링 및 로깅을 설정하는 방법을 설명할게. 이 작업을 통해 서비스 상태와 성능을 추적하고, 로그를 수집/분석해서 문제를 진단할 수 있어.
목표: 서비스에서 메트릭을 수집하고 이를 시각화해서 앱의 성능과 상태를 모니터링하는 거야.
Prometheus 설치 및 설정
이 예제에서는 Prometheus를 Docker를 사용해서 실행해 볼 거야. 이 방식은 크로스 플랫폼을 지원하고, Docker를 지원하는 어떤 운영 체제에서도 동일하게 모니터링을 배포할 수 있어.
1. Prometheus 구성 디렉토리 생성:
mkdir prometheus
cd prometheus
2. prometheus.yml
구성 파일 생성:
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 생성:
FROM prom/prometheus
COPY prometheus.yml /etc/prometheus/prometheus.yml
4. Prometheus를 compose.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 설정용 디렉토리 생성:
mkdir grafana
cd grafana
2. Grafana용 Dockerfile 생성:
FROM grafana/grafana
3. docker-compose.yml
에 Grafana 추가하기:
grafana:
image: grafana/grafana
ports:
- "3033:3000"
depends_on:
- prometheus
networks:
- task-network
4. Prometheus와 함께 Grafana를 설정하기:
docker compose up
명령어로 컨테이너를 실행해.- 웹 브라우저에서
http://localhost:3033
에 접속해. - 기본 로그인 정보(admin/admin)로 로그인해.
-
"Configuration"
->"Data Sources"
로 이동해서 새로운 데이터 소스를 추가해. -
"Prometheus"
를 선택하고URL http://prometheus:9090
을 입력해. - 설정을 저장해.
Grafana 대시보드 생성
- 새로운 대시보드 생성하기:
-
"Create"
->"Dashboard"
로 이동해. "Add new panel"
을 눌러.-
"Query"
섹션에서 데이터 소스Prometheus
를 선택해. -
PromQL
을 사용해 메트릭 조회 쿼리를 입력해. 예를 들어,CPU
사용량을 모니터링하려면:
-
- 패널(Panel) 설정:
- 그래프 유형을 선택해 (예: "Graph").
- 패널을 설정해 (예: 제목, 범례, 축 등).
"Apply"
를 눌러 패널을 저장해.
- 추가 패널 생성:
- 메모리, 네트워크, 디스크와 같은 다른 메트릭을 위한 추가 패널을 생성하려면 이전 단계를 반복해.
rate(container_cpu_usage_seconds_total[1m])
7.3 ELK Stack 설정
ELK Stack (Elasticsearch, Logstash, Kibana)
를 사용한 로깅 설정.
목표: 서비스의 로그를 수집, 저장 및 분석하기.
Elasticsearch
설치 및 설정
compose.yaml
에 Elasticsearch
추가:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.15.0
environment:
- discovery.type=single-node
ports:
- "9200:9200"
networks:
- task-network
Logstash
설치 및 설정
1단계. Logstash 구성용 디렉토리 생성:
mkdir logstash
cd logstash
2단계. logstash.conf
구성 파일 생성:
input {
beats {
port => 5044
}
}
filter {
json {
source => "message"
}
}
output {
elasticsearch {
hosts => ["elasticsearch:9200"]
index => "docker-logs-%{+YYYY.MM.dd}"
}
}
3단계. Logstash
용 Dockerfile 생성:
FROM docker.elastic.co/logstash/logstash:8.15.0
COPY logstash.conf /usr/share/logstash/pipeline/logstash.conf
4단계. compose.yaml
에 Logstash 추가:
logstash:
build: ./logstash
ports:
- "5044:5044"
depends_on:
- elasticsearch
networks:
- task-network
Kibana 설치 및 설정
compose.yaml
에 Kibana 추가:
kibana:
image: docker.elastic.co/kibana/kibana:8.15.0
ports:
- "5601:5601"
depends_on:
- elasticsearch
networks:
- task-network
로그 수집을 위한 Filebeat 설치
1단계. Filebeat 구성용 디렉토리 생성:
mkdir filebeat
cd filebeat
2단계. filebeat.yml
구성 파일 생성:
filebeat.inputs:
- type: docker
containers.ids:
- '*'
processors:
- add_docker_metadata: ~
output.logstash:
hosts: ["logstash:5044"]
3단계. Filebeat용 Dockerfile 생성:
FROM docker.elastic.co/beats/filebeat:8.15.0
COPY filebeat.yml /usr/share/filebeat/filebeat.yml
4단계. compose.yaml
에 Filebeat 추가:
filebeat:
build: ./filebeat
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
depends_on:
- logstash
networks:
- task-network
7.4 전체 파일
전체 파일 compose.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:
GO TO FULL VERSION