ホームページ  >  記事  >  運用・保守  >  アプリケーションの監視とログ管理に Docker を使用する方法

アプリケーションの監視とログ管理に Docker を使用する方法

WBOY
WBOYオリジナル
2023-11-07 16:58:541022ブラウズ

アプリケーションの監視とログ管理に Docker を使用する方法

Docker は現代のアプリケーションにおいて不可欠なテクノロジーとなっていますが、アプリケーションの監視とログ管理に Docker を使用することは課題です。 Service Discovery や Load Balancing などの Docker ネットワーク機能が継続的に強化されているため、完全で安定した効率的なアプリケーション監視システムの必要性がますます高まっています。

この記事では、アプリケーションの監視とログ管理のための Docker の使用方法を簡単に紹介し、具体的なコード例を示します。

アプリケーション監視に Prometheus を使用する

Prometheus は、SoundCloud によって開発されたオープンソースのプル モデルベースのサービス監視および警告ツールです。 Go 言語で書かれており、マイクロサービス ソリューションやクラウド環境で広く使用されています。監視ツールとして、DockerのCPU、メモリ、ネットワーク、ディスクなどを監視できるほか、多次元のデータスイッチング、柔軟なクエリ、アラーム、可視化機能もサポートしているため、迅速な対応と迅速な意思決定を可能にします。

もう 1 つ注意すべき点は、Prometheus はプル モードでサンプリングする必要があることです。つまり、監視対象のアプリケーションの /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 監視インジケーターを返します。

次に、公式 Web サイトから 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 ファイルでは、2 つのサービスを定義します。1 つは Node.js アプリケーションを実行する Node サービス、もう 1 つは監視用の 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 アドレスとそれに対応するポート番号です。ここでは、ノードとポート 3000 を使用しています。

最後に、 docker-compose up コマンドを実行してアプリケーション全体とその監視サービスを開始し、Prometheus のメンバー インジケーターを表示します。

ログ管理に ElasticSearch と Logstash を使用する

Docker では、アプリケーション ログ データはさまざまな Docker コンテナーに分散されます。これらのログを一元管理したい場合は、ELK の ElasticSearch と Logstash を使用してログを一元管理し、コンピューター リソースの監視と分析を容易にすることができます。

始める前に、Logstash と ElasticSearch の Docker イメージをダウンロードし、docker-compose.yml ファイルを作成する必要があります。

このファイルでは 3 つのサービスを定義しており、そのうちの 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

構成ファイルでは、コンテナ内のパスをホストのログ ファイル システムにマップします。同時に、ログ オプションを通じて、ログのボリューム サイズと量が定義され、ログが占有するストレージが制限されます。

設定ファイルの logstash で、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"
  }
}

この構成ファイルでは、file という名前の入力を定義します。これは、ローカル ログ ファイルからデータを読み取ることを意味します。次に、grok ライブラリを使用して特定のテンプレートに一致するログを解析するフィルターを導入しました。最後に、環境変数 ES_HOST を介してコンテナに取得とレポートを渡しながら、Elasticsearch クラスターのアドレスにデータを転送する出力を定義します。

最終的に、上記のように ELK 全体の構成が完了すると、効率的なログ管理システムが完成します。各ログは一元管理された場所に送信され、統合され、簡単に検索できるようになります。フィルタリングと可視化の操作。

以上がアプリケーションの監視とログ管理に Docker を使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。