DockerでPrometheusを構築する
公開日:
カテゴリ: ソフトウェア
サーバとして運用している端末の状態を調べるのに、毎回シェルにログインするのは面倒なので、Prometheusという監視ソフトウェアを使って集計・分析してみます。
今回目指す構成
- Dockerコンテナ- Prometheus- 各種ソフトウェアから出力されたメトリクスを収集・集積するソフトウェア
 
- node-exporter- Linux系OSのメトリクスを収集して出力するソフトウェア
- 今回はDockerホストのメトリクスを収集
 
- Grafana- 集積データをグラフ等に可視化するダッシュボードソフトウェア
 
 
- Prometheus
- ひとまずホストネットワーク・ホストPID・capabilityは使わない
ファイル構成
今回はcompose.ymlファイルを置くフォルダは以下の構成にしました。
.
├─/config
│ └─/prometheus.yml
├─/grafana
├─/grafana_data
├─/prometheus_data
└─/compose.ymlさしあたり、compose.ymlとprometheus.ymlファイルの作成が必要です。
compose.yml
networks:
  nginx:
    external: true
  prometheus:
    name: prometheus
    internal: true
services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    user: "1000:1000"
    volumes:
      - ./config:/etc/prometheus
      - ./prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.console.libraries=/usr/share/prometheus/console_libraries'
      - '--web.console.templates=/usr/share/prometheus/consoles'
    expose:
      - 9090
    networks:
      - prometheus
    restart: always
  node-exporter:
    image: prom/node-exporter:latest
    container_name: node-exporter
    volumes:
      - /:/host:ro,rslave
    command:
      - '--path.rootfs=/host'
      - '--path.procfs=/host/proc'
      - '--path.sysfs=/host/sys'
    expose:
      - 9100
    networks:
      - prometheus
    restart: always
  grafana:
    image: grafana/grafana
    container_name: grafana
    user: "1000:1000"
    depends_on:
      - prometheus
    expose:
      - 3000
    volumes:
      - ./grafana_data:/var/lib/grafana
      - ./grafana/provisioning:/etc/grafana/provisioning
    environment:
      GF_USERS_ALLOW_SIGN_UP: "false"
    networks:
      - prometheus
      - nginx
    restart: alwaysすべてprometheus内部ネットワークで通信するようにしています。Grafanaは外からWebブラウザでアクセスする必要があるため、別のネットワークにも接続しています(今回はcomposeの外で作られたnginxネットワークに接続します)。
Prometheus本体のコンテナでは、コンフィグファイルを読み取る以外に特記事項はありません。
node-exporterのコンテナではホストシステムの情報を収集するため、ホストのファイルシステムを丸ごとバインドマウントします。セキュリティが気になる等があれば、必要なパスのみをマウントしても問題ありません(もちろん収集できる項目は減ります)。
またコマンドライン引数を追加することで、不要な項目を無効化したり、デフォルトでは無効になっている項目を有効化することができます。詳しい引数はnode-exporterのREADMEに記載されています。
Grafanaは特に何もせずにコンテナを作成するだけで問題ありません。今回は一応、環境変数にユーザの追加登録を無効にする設定を追加しています。
prometheus.yml
global:
  scrape_interval: 15s
  evaluation_interval: 15s
  external_labels:
      monitor: 'example'
scrape_configs:
  - job_name: 'prometheus'
    scrape_interval: 15s
    static_configs:
         - targets: ['localhost:9090']
  - job_name: 'node-exporter'
    scrape_interval: 15s
    static_configs:
      - targets: ['node-exporter.prometheus:9100']情報を収集する間隔を指定します。ジョブごとに任意の間隔を設定できます。
global.external_labels.monitorには適当な分かりやすい名前をつけておきます。
確認
設定ファイルができたらコンテナを立ち上げます。
ログイン
docker compose up -d上記の構成ではgrafana.nginx:3000にアクセスするとGrafanaのログイン画面が表示されます。初期ユーザ名とパスワードはどちらもadminでログインできます。
データソースの追加
まずはGrafanaが参照するデータソース(つまりprometheusコンテナ)を取り込みます。左メニューのConnectionsのAdd new connectionを開きます。一覧からPrometheusを選択し、右上のAdd new data sourceを押下して追加します。デフォルトのチェックを入れておくと便利です。
追加したデータソースのURLにPrometheusのURL(今回の構成の場合http://prometheus.prometheus:9090)を指定してSave&Exitを押下します。エラーが出た場合は、残念ながらここまでで何かが間違っています。
ダッシュボードの追加
ダッシュボードを作成して動作確認をしたいところですが、自分でダッシュボードを作成するのは大変なので、とりあえずWeb上に公開されているNode Exporter Fullというダッシュボードを取り込みます。このダッシュボードはnode-exporterで取得できる項目が一通り網羅されています。
今回の構成では外部ネットワークには接続しないため、JSONをダウンロードします。Grafanaに戻り、右上の*ボタンからImport dashboardを開き、ダウンロードしてきたJSONファイルをアップロードすれば取り込めます。
ダッシュボード左上のDatasourceにprometheus、Jobにnode-exporter、Hostにnode-exporter.prometheus:9100を選択してグラフが描画されればひとまず完成です。node-exporterのコマンドライン引数やバインドマウントの指定によっては一部No dataとなっている項目があるかもしれません。
あとは取り込んだNode Exporter FullやWeb上で他に公開されているダッシュボードを参考に自分のダッシュボードを組み立てていくことになるでしょう。
カテゴリ: ソフトウェア
