2026年5月27日
2026年5月27日
cAdvisorでDockerコンテナを監視する方法(導入・安全な公開範囲・Prometheus連携とアラート)
cAdvisor(Container Advisor)は Google が開発しているオープンソースのツールで、ホスト上で動く各コンテナの CPU・メモリ・ネットワーク・ディスクの使用量を集めて表示します。cAdvisor 自身をコンテナとして1つ起動すれば、WordPress・MySQL・Nginx などのコンテナごとの負荷を Web 画面で確認でき、Prometheus 形式のメトリクスとして取り出してグラフ化や通知にもつなげられます。この記事では、Docker Compose での導入、外部に公開しない設定、見るべき指標、Prometheus でのアラートの書き方までを説明します。
cAdvisorでわかることと、docker statsとの違い
コンテナの使用量を見るだけなら、Docker 標準の docker stats でも確認できます。ただし docker stats はその瞬間の値を表示するだけで、過去の推移は残りません。「昨夜 MySQL コンテナのメモリがいつから増えたか」を知りたいときには使えません。
cAdvisor はコンテナごとの指標を継続的に集め、次のことができます。
- Web 画面で、コンテナごとの直近の使用量の推移を見る
/metricsというエンドポイントで Prometheus 形式のメトリクスを提供し、Prometheus に長期保存させる- コンテナに設定したメモリ上限(limit)と実際の使用量を並べて見る
なお cAdvisor 自身が保持する履歴は短時間分だけです。長期の記録とアラートは Prometheus と Grafana などに任せ、cAdvisor は「コンテナの指標を集めて渡す係」と考えると構成がわかりやすくなります。
Docker Composeで導入する
公式の README では docker run での起動例が案内されています。ここでは同じ内容を Docker Compose で書き、運用しやすくします。作業前に、既存の compose ファイルのバックアップを取っておいてください。
# docker-compose.yml(監視用の例。既存の構成に合わせて調整する)
services:
cadvisor:
image: gcr.io/cadvisor/cadvisor:${CADVISOR_VERSION}
container_name: cadvisor
privileged: true
devices:
- /dev/kmsg
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
- /dev/disk/:/dev/disk:ro
ports:
- "127.0.0.1:8080:8080"
restart: unless-stopped
# 同じディレクトリの .env にバージョンを書く(値はリリースページで確認する)
echo 'CADVISOR_VERSION=vX.Y.Z' > .env
docker compose up -d cadvisor
docker compose logs cadvisor
ポイントは次のとおりです。
- バージョンを固定する:
latestのような移動するタグを使うと意図しない更新が入ることがあるため、GitHub のリリースページで現在の版を確認してタグを固定します。イメージの配布場所やタグの付け方は変わることがあるので、README の起動例と照らし合わせてください(2026年10月現在の情報で確認しています)。 - マウントは読み取り専用: ホストのファイルシステムや Docker のデータ領域を読むためにマウントしますが、
:roで書き込みはさせません。 - privileged の意味を理解する: cgroup などの情報を読むために特権モードで動かす構成が案内されています。特権コンテナはホストへの影響が大きいため、公式イメージ以外を使わない、外部に公開しない、の2点を守ってください。
ホスト側の Docker のデータ領域を /var/lib/docker 以外に移している場合や、ディストリビューションによっては、マウントするパスを変える必要があります。起動後にログでエラーが出ていないかを確認します。
外部に公開しない
cAdvisor の Web 画面とメトリクスには、標準では認証がありません。コンテナ名・イメージ名・使用量が誰でも見える状態は、攻撃者に構成を教えることになります。上の例でポートを 127.0.0.1:8080:8080 としているのはこのためで、サーバー自身からしか接続できません。
手元の PC から画面を見るときは SSH のポート転送を使います。
ssh -L 8080:127.0.0.1:8080 user@your-server
# ブラウザで http://localhost:8080/ を開く
注意したいのは、Docker が公開ポートのために iptables のルールを直接追加する点です。ports: "8080:8080" のように書くと、ufw で 8080 番を閉じたつもりでも外部から届いてしまうことがあります。待ち受けアドレスを 127.0.0.1 に限定する書き方が、ファイアウォールの設定に頼らない安全な方法です。
Prometheus を同じ Compose のネットワークで動かす場合は、ポートを公開せずにコンテナ名(cadvisor:8080)で直接取得させる構成がさらに安全です。
Web画面と見るべき指標
ブラウザで開くと、ホスト全体の画面が表示され、Docker コンテナはコンテナ一覧から個別の画面に進めます。各コンテナの CPU、メモリ、ネットワーク、ファイルシステムの推移がグラフで出ます。
WordPress の構成で特に見たいのは次の点です。
- メモリの使用量と上限: コンテナにメモリ上限を設定している場合、上限に近づくとコンテナ内のプロセスが OOM で強制終了されることがあります。MySQL コンテナが落ちるとサイト全体がエラーになるため、最優先で見る指標です。
- CPU の使用量: PHP のコンテナが張り付いていれば、アクセス増やプラグインの重い処理が疑われます。
- ネットワークの送受信: 急増していれば、bot のアクセスや大きなファイルの配信を疑います。
メモリの値にはキャッシュが含まれる指標と含まれない指標があります。Prometheus で見るときは、強制終了の判断に近い container_memory_working_set_bytes を使うのが一般的です。
Prometheusで収集する
Prometheus の設定に cAdvisor を取得対象として追加します。
# prometheus.yml の scrape_configs に追加
scrape_configs:
- job_name: cadvisor
scrape_interval: 30s
static_configs:
- targets: ['cadvisor:8080']
取得できているかは、Prometheus の画面で次のような式を実行して確認します。Docker のコンテナ名は name ラベルに入ります。
# コンテナごとのCPU使用量(コア数換算)
sum by (name) (rate(container_cpu_usage_seconds_total{name!=""}[5m]))
# コンテナごとのメモリ使用量(working set)
container_memory_working_set_bytes{name!=""}
Compose で起動したコンテナは「プロジェクト名-サービス名-番号」のような名前になることが多いため、ラベルで絞り込むときは name=~".*wordpress.*" のように正規表現を使うと扱いやすくなります。Grafana では、cAdvisor 向けに公開されているダッシュボードを読み込むと手早く可視化できますが、指標名やラベルの前提が使っている版と合っているかを確認してから使ってください。
アラートを設定する
通知の条件は Prometheus のアラートルールに書き、Alertmanager からメールやチャットに送ります。ここではよく使う2つの例を示します。
groups:
- name: containers
rules:
- alert: ContainerMemoryNearLimit
expr: |
(container_memory_working_set_bytes{name!=""}
/ container_spec_memory_limit_bytes{name!=""} > 0.9)
and container_spec_memory_limit_bytes{name!=""} > 0
for: 5m
labels:
severity: warning
annotations:
summary: "{{ $labels.name }} のメモリが上限の90%を超えています"
- alert: MysqlContainerMissing
expr: absent(container_memory_working_set_bytes{name=~".*mysql.*"})
for: 2m
labels:
severity: critical
annotations:
summary: "MySQLのコンテナが2分以上cAdvisorの指標に現れていません"
1つ目はメモリ上限を設定しているコンテナだけを対象にしています。上限を設定していないコンテナでは上限値が 0 になり、割り算の結果が意味を持たないため、and ... > 0 で除外しています。for: 5m は「5分続いたら通知」の意味で、一瞬の増加で通知が鳴り続けるのを防ぎます。
2つ目はコンテナが止まったことを検知する例です。cAdvisor は停止したコンテナの指標を出さなくなるため、「値が大きい」ではなく「系列が存在しない」ことを absent() で調べています。監視したいコンテナごとにルールを分けて書くと、どれが止まったかが通知文でわかります。time() - container_last_seen > 秒数 という書き方もよく紹介されますが、停止と同時に系列が消える環境では条件に一致しないことがあるため、実際にコンテナを止めて通知が届くかを試してから運用してください。cAdvisor 自体が止まった場合も同じ通知が出るので、原因の切り分けでは cAdvisor の状態から確認します。サイトが応答しているかどうかは、外形監視(HTTP で実際にページを取得する監視)を別に用意しておくと見落としを減らせます。
負荷を抑える設定とつまずきやすい点
cAdvisor は多くの指標を集めるため、小さな VPS では cAdvisor 自身の CPU やメモリが目立つことがあります。次のような起動オプションで調整できます(オプション名と既定値は版で変わることがあるので、--help で確認してください)。
--docker_only=true: Docker コンテナ以外の cgroup を集計対象から外す--housekeeping_interval: 収集間隔を長くして負荷を下げる--disable_metrics: 使わない種類の指標を無効にする
Compose では command: に並べて指定します。
command:
- --docker_only=true
- --housekeeping_interval=30s
よくあるつまずきは次のとおりです。
- ポート 8080 が使用中: 他のサービスと重なっていれば、ホスト側のポートだけ
127.0.0.1:8081:8080のように変えます。 - コンテナの一覧が出ない: Docker ソケットやデータ領域のマウントが不足していないか、ログを確認します。cgroup v2 の環境では、古い版の cAdvisor が正しく値を取れないことがあるため、新しい版を使ってください。
- メモリの値が docker stats と違う: 集計しているメモリの種類(キャッシュを含むか)が異なるためで、故障ではありません。比べるときは同じ種類の値どうしで比べます。
まとめ
- cAdvisor はコンテナごとの CPU・メモリ・ネットワーク・ディスクの使用量を集め、Web 画面と Prometheus 形式で提供します。
- Docker Compose で導入し、バージョンはリリースページで確認して固定します。
- 認証がないため、ポートは 127.0.0.1 に限定し、SSH トンネルか同じネットワーク内の Prometheus から使います。
- メモリは working set と上限の比率を最優先で見て、Prometheus のアラートルールで通知します。
- コンテナ停止の検知は外形監視と併用し、cAdvisor 自身の負荷は起動オプションで調整します。