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上で他に公開されているダッシュボードを参考に自分のダッシュボードを組み立てていくことになるでしょう。
カテゴリ: ソフトウェア