CodeGym /Adesua ahorow /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. 在 compose.yaml 中添加 Prometheus:

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. 打開瀏覽器進入 Grafana 的 Web 介面: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.yaml 中添加 Elasticsearch

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