Docker ComposeでPrometheusを5分で構築!ローカル開発環境の監視を始めよう
やあ、みんな!新しい技術に触れるのはワクワクするよね。今日は、みんなの開発体験を劇的に向上させる「Prometheus」を、Docker Composeを使って超簡単にローカル環境に構築する方法を伝授しよう。
「監視って難しそう…」「そもそも何のためにやるの?」って思ってるかもしれないけど、心配ご無用!このブログを読み終わる頃には、Prometheusがどんな強力な味方になってくれるのか、そしてその第一歩を軽やかに踏み出せるようになっているはずだよ。
1. なぜ監視が必要なのか? Prometheusって何者?
まずは、なぜ監視が重要なのか、そしてPrometheusがそこでどんな役割を果たすのかを、ざっくりと理解しておこう。
監視の神髄:予兆を掴み、障害を未然に防ぐ
君たちが日々開発しているアプリケーションやサービスは、たくさんの部品(コンテナやサービス)が連携して動いているよね。これらの部品がもし、ちょっとした不調を抱えていたら? 最初は小さな問題でも、それが積み重なって、ある日突然「サービスが止まった!」なんて事態になりかねない。
監視とは、これらの部品の状態を常に「見える化」して、障害が発生する前に「あれ? ちょっとおかしいぞ?」という予兆を掴むための活動なんだ。まるで、健康診断で病気の芽を見つけるように、システムの健康状態をチェックするイメージかな。
Prometheus:時系列データを収集・分析する強力な監視ツール
Prometheusは、この監視活動を強力にサポートしてくれる、オープンソースの監視システムなんだ。特に、「時系列データ」の収集と分析に特化しているのが特徴。
- 時系列データとは?
- 時間とともに変化するデータのこと。例えば、CPU使用率、メモリ使用率、リクエスト数、エラーレートなどがこれにあたるよ。
- Prometheusの得意技
- スクレイピング(Scraping): 監視したい対象(アプリケーションやコンテナ)から、定期的にメトリクス(数値データ)を「収集」する。
- PromQL: 収集した時系列データを、強力なクエリ言語「PromQL」を使って「分析」したり、「可視化」したりできる。
- アラート: 設定した閾値を超えた場合に、アラートを発報する機能もある。
「でも、ローカル開発環境でそこまで大げさなことを…」と思うかもしれない。いやいや、そんなことはないんだ。ローカル環境でこそ、手軽に監視を始めることで、開発中に発生する問題に素早く気づき、デバッグの時間を短縮できる。まさに、「毎日の作業が劇的に楽になる」第一歩なんだよ。
2. 5分で構築!Docker ComposeでPrometheusを立ち上げよう
さて、いよいよ実践だ!今回は、Docker Composeを使って、最小限の構成でPrometheusを立ち上げてみよう。
2.1. 構築するアーキテクチャの全体像
今回構築するのは、非常にシンプルな構成だ。
1. Prometheusサーバー: メトリクスを収集・保存・クエリできる中心的な役割を担う。
2. Node Exporter: Prometheusサーバーが、ホストマシン(君のPC)のCPU、メモリ、ディスクなどのシステムメトリクスを収集できるようにするためのコンポーネント。
この2つをDocker Composeで起動するだけで、ローカル環境の基本的な監視がスタートできるんだ。
graph LR
A[Docker Host (Your PC)] — Node Exporter –> B(Prometheus Server)
C[Applications/Services] — Exporter –> B
- Node Exporter: 君のPC(Docker Host)の情報をPrometheusに送る。
- Prometheus Server: Node Exporterや、将来的に君が開発するアプリケーションが出力するメトリクスを収集(スクレイピング)する。
2.2. docker-compose.yml と prometheus.yml の具体例
まずは、`docker-compose.yml` ファイルを作成しよう。これは、Dockerコンテナの定義をYAML形式で記述するファイルだ。
docker-compose.yml
version: ‘3.8’
services:
prometheus:
image: prom/prometheus:v2.48.0 # Prometheusの公式Dockerイメージを使用
container_name: prometheus-server
ports:
- “9090:9090” # PrometheusのWeb UIは9090番ポートでアクセス可能
volumes:
- ./prometheus:/etc/prometheus # 設定ファイルをホストOSと共有
command:
- ‘–config.file=/etc/prometheus/prometheus.yml’ # 設定ファイルを指定
restart: unless-stopped # コンテナが停止したら自動で再起動
node-exporter:
image: prom/node-exporter:v1.7.0 # Node Exporterの公式Dockerイメージを使用
container_name: node-exporter
ports:
- “9100:9100” # Node Exporterは通常9100番ポートでメトリクスを公開
volumes:
- /proc:/host/proc:ro # ホストOSの/procを読み取り専用でマウント
- /sys:/host/sys:ro # ホストOSの/sysを読み取り専用でマウント
- /:/rootfs:ro # ホストOSのルートファイルシステムを読み取り専用でマウント
privileged: true # ホストOSの情報を取得するために必要
restart: unless-stopped
次に、Prometheusの設定ファイル `prometheus.yml` を作成しよう。これは、Prometheusが何を監視するかを定義するファイルだ。`docker-compose.yml` と同じディレクトリに `prometheus` というフォルダを作成し、その中に `prometheus.yml` を配置してほしい。
./prometheus/prometheus.yml
global:
scrape_interval: 15s # メトリクスを収集する間隔(デフォルトは1分)
evaluation_interval: 15s # ルールを評価する間隔(デフォルトは1分)
scrape_configs:
# Prometheusサーバー自身のメトリクスを収集する設定
- job_name: ‘prometheus’
static_configs:
- targets: [‘localhost:9090’] # Prometheusサーバーのアドレスとポート
# Node Exporterからホストマシンのメトリクスを収集する設定
- job_name: ‘node-exporter’
static_configs:
- targets: [‘node-exporter:9100’] # Docker Composeで定義したnode-exporterサービス名とポート
【ポイント解説】
- `docker-compose.yml`:
- `image`: 使用するDockerイメージを指定。バージョンを指定することで、意図しない変更を防ぐことができるよ。
- `container_name`: コンテナに分かりやすい名前を付ける。
- `ports`: ホストOSのポートとコンテナのポートをマッピング。これにより、ホストOSからコンテナ内のサービスにアクセスできるようになる。
- `volumes`: ホストOSのファイルやディレクトリをコンテナ内にマウント。設定ファイルや、ホストOSの情報をコンテナから参照するために使う。
- `command`: コンテナ起動時に実行するコマンド。ここではPrometheusに設定ファイルを読み込ませている。
- `restart: unless-stopped`: Dockerデーモンが起動している限り、コンテナは停止したら自動で再起動してくれる。開発中は便利だよ。
- `privileged: true`: Node ExporterがホストOSのより詳細な情報を取得するために、特権モードで実行する。
- `prometheus.yml`:
- `global`: 全体的な設定。`scrape_interval` は、Prometheusがターゲットからメトリクスを収集する頻度。開発環境なら短めに設定しても良いだろう。
- `scrape_configs`: 監視対象(ターゲット)とその設定を記述するブロック。
- `job_name`: 監視対象をグループ化するための名前。
- `static_configs`: 静的に設定されたターゲットリスト。
- `targets`: 収集対象のサーバーアドレスとポート。`node-exporter` というサービス名は、`docker-compose.yml` で定義したサービス名だよ。Docker Composeが、同じネットワーク内のサービス名を名前解決してくれるんだ。
2.3. コンテナの起動とWeb UIへのアクセス確認
さあ、いよいよコンテナを起動しよう!
1. `docker-compose.yml` と `prometheus/prometheus.yml` を作成したディレクトリで、ターミナルを開く。
2. 以下のコマンドを実行する。
docker compose up -d
- `up`: コンテナを作成・起動する。
- `-d`: バックグラウンドで実行(デーモンモード)。
3. コンテナが起動するのを待つ。`docker compose ps` コマンドで、コンテナの状態を確認できるよ。
docker compose ps
`State` が `Up` になっていればOKだ。
4. Webブラウザを開き、以下のURLにアクセスする。
`http://localhost:9090`
PrometheusのWeb UIが表示されれば成功だ!

(※実際には、ここにPrometheusのWeb UIのスクリーンショットを挿入してください。)
左上のメニューから `Status` -> `Targets` を選択してみよう。`prometheus` と `node-exporter` のジョブが表示され、`State` が `UP` になっていれば、Prometheusが正しくメトリクスを収集できている証拠だ。

(※実際には、ここにPrometheus Targetsページのスクリーンショットを挿入してください。)
これで、君のローカル開発環境の基本的な監視が始まった!🎉
3. トラブルシューティング:接続エラー時のチェックポイント
もしWeb UIにアクセスできなかったり、Targetsのステータスが `DOWN` になっていたりしても、慌てないで。よくある原因とチェックポイントをいくつか紹介するよ。
3.1. DockerとDocker Composeは正しく動いている?
- Dockerデーモンは起動しているか?
- ターミナルで `docker info` を実行してみて。エラーが出ずに情報が表示されればOK。
- Docker Composeはインストールされているか?
- `docker compose version` でバージョンが表示されるか確認。
- `docker-compose.yml` ファイルのパスは正しいか?
- コマンドを実行しているディレクトリに、`docker-compose.yml` が正しく配置されているか確認。
3.2. ポートの競合はない?
- 9090番ポートは他のアプリケーションで使われていないか?
- Linux/macOSなら `sudo lsof -i :9090`、Windowsなら `netstat -ano | findstr :9090` で確認できる。もし使われている場合は、`docker-compose.yml` の `ports` の左側(ホストOS側)のポート番号を変更してみよう(例: `”9091:9090″`)。
- 9100番ポート(Node Exporter)も同様に確認。
3.3. 設定ファイル (`prometheus.yml`) は正しい?
- YAMLのインデントは崩れていないか?
- YAMLはインデントが非常に重要。スペースの数やタブの有無に注意して、整形ツールなどで確認すると良い。
- サービス名(`node-exporter`)は `docker-compose.yml` と一致しているか?
- ポート番号(`9100`)は正しいか?
3.4. コンテナのログを確認しよう
- Prometheusコンテナのログ:
docker logs prometheus-server
- Node Exporterコンテナのログ:
docker logs node-exporter
エラーメッセージが出ていないか、注意深く見てみよう。
3.5. Node Exporterの`privileged: true`は必要?
Node ExporterがホストOSの `/proc` や `/sys` ディレクトリ内の情報を取得するには、特権モードが必要になる場合がある。もし上記の設定でうまくいかない場合は、`privileged: true` を設定してみる価値はある。ただし、セキュリティ上の理由から、本番環境では慎重に検討する必要があるよ。
これらのチェックポイントを確認すれば、ほとんどの場合は問題が解決するはずだ。もしそれでも解決しない場合は、エラーメッセージなどを添えて、コミュニティで質問してみるのも良い方法だ。
4. 次のステップへ:開発中のアプリケーションを監視する
おめでとう!これで君のローカル開発環境にPrometheusが導入できた。でも、これはまだ始まりに過ぎない。
この後、君が開発するアプリケーション(例えば、Web APIやマイクロサービス)からメトリクスを公開するようにすれば、Prometheusでそのアプリケーションの状態も監視できるようになるんだ。
- アプリケーションにExporterを組み込む:
- 多くのプログラミング言語やフレームワークには、Prometheus用のライブラリ(SDK)が用意されている。これを使って、CPU使用率、メモリ使用量、リクエスト数、レスポンスタイム、エラーレートなどをメトリクスとして公開しよう。
- `prometheus.yml` にターゲットを追加する:
- アプリケーションのExporterが公開しているエンドポイントを `prometheus.yml` の `scrape_configs` に追加するだけ。
例えば、君がPythonでWebアプリケーションを開発していて、`my-web-app` というサービス名で動かすなら、`docker-compose.yml` に `my-web-app` を追加し、`prometheus.yml` に以下のような設定を追加するイメージだ。
… (docker-compose.yml の services に my-web-app を追加) …
prometheus.yml に追記
- job_name: ‘my-web-app’
static_configs:
- targets: [‘my-web-app:8080’] # アプリケーションのサービス名とメトリクスポート
これで、アプリケーションのパフォーマンスやエラー状況がリアルタイムで可視化できるようになる。開発中に「なんか処理が遅いな」とか「エラーが頻発してるな」といった問題に、すぐさま気づけるようになるはずだよ。
まとめ:監視は開発者の強力な武器になる
PrometheusをDocker Composeで構築するのは、驚くほど簡単だっただろう? これで、君のローカル開発環境は、より堅牢で、問題に強く、そして何より「開発しやすい」環境になったはずだ。
監視は、単に「何かあったときに調べる」ためのものではない。それは、システムの健康状態を理解し、潜在的な問題を未然に防ぎ、より良いソフトウェアを、より速く、より安定して開発するための、開発者にとっての強力な武器なんだ。
今日学んだことを活かして、ぜひ君の開発ライフに監視を取り入れてみてほしい。きっと、毎日のコーディングが、もっと楽しく、もっと効率的になるはずだよ!
何か不明な点があれば、いつでも聞いてね!君の挑戦を応援しているよ!