首頁  >  文章  >  運維  >  如何使用Docker進行應用程式的監控與日誌管理

如何使用Docker進行應用程式的監控與日誌管理

WBOY
WBOY原創
2023-11-07 16:58:541022瀏覽

如何使用Docker進行應用程式的監控與日誌管理

Docker已經成為了現代化應用中的必備技術,但使用Docker進行應用程式監控和日誌管理卻是一項挑戰。隨著Docker網路功能,如Service Discovery和Load Balancing的不斷增強,我們越來越需要一個完整、穩定,以及高效的應用監控系統。

在本文中,我們將簡單地介紹使用Docker進行應用監控和日誌管理的同時給出具體的程式碼範例。

利用Prometheus進行應用程式監控

Prometheus是一款開源,基於Pull模型的服務監測和警告工具,由SoundCloud開發。它使用Go語言編寫,並廣泛應用於微服務方案和雲端環境。作為一款監控工具,它可以對Docker的CPU、記憶體、網路和磁碟等進行監控,並且還支援多維資料切換、靈活的查詢、警報以及視覺化等功能,讓你可以快速做出反應,並快速做出決策。

還有一點要注意的是,Prometheus需要透過Pull方式的取樣,也就是存取被監控應用中的/metrics介面取得監控資料。所以,在啟動被監控應用程式鏡像時,需要先將可以存取到Prometheus的IP和連接埠配置到/metrics介面中。下面是一個簡單的Node.js應用程式。

const express = require('express')
const app = express()

app.get('/', (req, res) => {
  res.send('Hello World!')
})

app.get('/metrics', (req, res) => {
  res.send(`
    # HELP api_calls_total Total API calls
    # TYPE api_calls_total counter
    api_calls_total 100
  `)
})

app.listen(3000, () => {
  console.log('Example app listening on port 3000!')
})

在該程式碼中,我們透過/metrics接口,返回了一個api_calls_total的監控指標。

接著,在官網上下載Prometheus的Docker映像,並建立一個docker-compose.yml文件,並且在該文件中,我們取得該Node.js應用的資料。

version: '3'
services:
  node:
    image: node:lts
    command: node index.js
    ports:
      - 3000:3000

  prometheus:
    image: prom/prometheus:v2.25.2
    volumes:
      - ./prometheus:/etc/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.retention.time=15d'
    ports:
      - 9090:9090

該docker-compose.yml檔案中,我們定義了兩個服務,一個是運行Node.js應用程式的Node服務,另一個是用於監控的Prometheus服務。其中,Node服務發布的端口為3000端口,透過端口映射,可以透過docker-compose.yml中的IP和3000端口存取到該Node應用的/metrics接口。而Prometheus則可以透過9090埠存取對應的監控指標資料。

最後,在prometheus.yml檔案中,我們需要定義要取得的資料來源。

global:
  scrape_interval:     15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'node-exporter'
    static_configs:
    - targets: ['node:9100']

  - job_name: 'node-js-app'
    static_configs:
    - targets: ['node:3000']

在該檔案中,我們定義了要擷取的所有的Node.js應用的指標,其中targets參數是Node.js應用的IP位址及其對應埠號。在這裡,我們使用的是node和3000連接埠。

最後,執行docker-compose up指令,即可啟動整個應用程式及其監控服務,並在Prometheus中查看該會員指標。

利用ElasticSearch和Logstash進行日誌管理

在Docker中,所應用的日誌資料分散在不同的Docker容器中。如果你要在集中的地方對這些日誌進行管理,那麼可以透過使用ELK中的ElasticSearch和Logstash,將日誌中心化管理,以便更輕鬆地實現電腦資源的監控和分析。

在開始之前,需要先下載Logstash和ElasticSearch的Docker映像,並建立一個docker-compose.yml檔案。

在該檔案中,我們定義了三個服務,其中bls是用來模擬業務日誌的API服務,其每次回應後,將記錄一條日誌到stdout和日誌檔案中。 logstash服務是由Logstash官方提供的Docker映像構建,用於收集、過濾和傳輸日誌。 ElasticSearch服務用於儲存和檢索日誌。

version: '3'
services:
  bls:
    image: nginx:alpine
    volumes:
      - ./log:/var/log/nginx
      - ./public:/usr/share/nginx/html:ro
    ports:
      - "8000:80"
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "10"

  logstash:
    image: logstash:7.10.1
    volumes:
      - ./logstash/pipeline:/usr/share/logstash/pipeline
    environment:
      - "ES_HOST=elasticsearch"
    depends_on:
      - elasticsearch

  elasticsearch:
    image: elasticsearch:7.10.1
    environment:
      - "http.host=0.0.0.0"
      - "discovery.type=single-node"
    volumes:
      - ./elasticsearch:/usr/share/elasticsearch/data

在設定檔中,我們對應了容器內的路徑到宿主機的日誌檔案系統中。同時透過logging的option,則定義了日誌的磁碟區大小和數量,以限制日誌的佔用儲存。

在設定檔的logstash中,我們定義了一個新的pipeline,其名稱為nginx_pipeline.conf,該檔案用於處理nginx日誌的收集、過濾和傳輸。與ELK的工作原理相同,logstash將根據不同的條件,對接收到的日誌進行處理,並將其發送到已經建立的 Elasticsearch 叢集中。在這個設定檔中,我們定義瞭如下處理邏輯:

input {
  file {
    path => "/var/log/nginx/access.log"
  }
}

filter {
  grok {
    match => { "message" => "%{COMBINEDAPACHELOG}" }
  }
}

output {
  elasticsearch {
    hosts => [ "${ES_HOST}:9200" ]
    index => "nginx_log_index"
  }
}

在該設定檔中,我們定義了一個name為file的輸入,表示要從本機Log檔案中讀取資料。接著,我們引進了使用grok函式庫來解析符合特定範本的日誌的filter。最後,我們定義了輸出,將資料傳輸到 Elasticsearch 叢集的位址,同時將檢索和報告透過環境變數ES_HOST傳遞到容器中。

在最後,如上完成整個ELK的配置後,我們會得到一個高效的日誌管理系統,每個日誌都將發送到集中的地方,並被整合在一起,可以實現簡單的搜索,過濾和可視化操作。

以上是如何使用Docker進行應用程式的監控與日誌管理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn