🥸

Node ExporterをDockerコンテナで運用する際に詰まった話

に公開

はじめに

Node exporterをDockerコンテナで運用する際にいくつか問題点がありました.試行錯誤して解決できたものがあるので記録しておきます.

前提

以下の記事を参考にして,Prometheusスタックによる監視基盤を作成しました.
https://zenn.dev/aobaiwaki/articles/a612bf497c59ca

問題点

Node Exporterを次のように実行していました.
docker compose

docker-compose.yml
services:
  node-exporter:
    image: prom/node-exporter
    container_name: node-exporter
    ports:
      - 9100:9100

docker run

sudo docker run -d --name=node_exporter -p 9100:9100 prom/node-exporter

上記の設定でNode exporterをコンテナ運用すると,Grafanaで可視化する際に以下の問題が発生します.

  1. Nodenameがコンテナのハッシュ値になる.
  2. RootFS Used, RootFS Totalの情報が取れない.
  3. Reboot Requiredの情報が取れない.

解決策

1. Nodenameがコンテナのハッシュ値になる.

hostnameオプションでコンテナのホスト名を明示的に指定します.Ansibleで複数サーバーにNode exporterを設置する場合は {{ ansible_hostname }} とするのがいいかもしれません.

# docker compose
hostname: my-server

# docker run
--hostname="my-sever"

最初はホストのUTS名前空間をコンテナで使えるようにすることで解決しようとしましたが,公式ドキュメントで非推奨だったのでやめました.
https://docs.docker.jp/v1.9/engine/reference/run.html#uts-uts

--uts="host" 設定をすると、ホスト上のホスト名の変更に対するフル・アクセスをもたらすため、安全ではないと考えられます。

uts: "host"

2. RootFS Used, RootFS Totalの情報が取れない.

ホストのルートディレクトリをコンテナの /rootfs ディレクトリにマウントします.このとき,コンテナがホストのルートディレクトリに書き込みを行わないよう,読み取り専用( :ro )でマウントします.また,pathオプションによってNode Exporterがコンテナ内で /rootfs をルートディレクトリとして認識するようにします.

# docker compose
volumes:
  - /:/rootfs:ro
command:
  - --path.rootfs=/rootfs

# docker run
-v "/:/rootfs:ro"
--path.rootfs=/rootfs

3. Reboot Requiredの情報が取れない.

以下のことを試しましたが,まだ解決できていません.

  • systemd を追跡対象に入れる.
  • /var/run/reboot-required/run/reboot-required をマウントする.

現在の設定

docker compose

docker-compose.yml
services:
  node-exporter:
    image: prom/node-exporter
    container_name: node-exporter
    hostname: my-server
    restart: always
    ports:
      - 9100:9100
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
      - /run/udev/data:/run/udev/data:ro
    command:
      - --path.procfs=/host/proc
      - --path.sysfs=/host/sys
      - --path.rootfs=/rootfs
      - --collector.filesystem.mount-points-exclude=^/(sys|proc|dev|etc|host|var|rootfs/(var/lib/docker|media|boot|proc|sys|dev|run|tmp))

docker run

sudo docker run -d \
-p 9100:9100 \
--name node-exporter \
--hostname="my-sever" \
--restart="always" \
-v "/proc:/host/proc:ro" \
-v "/sys:/host/sys:ro" \
-v "/:/rootfs:ro" \
-v "/run/udev/data:/run/udev/data:ro" \
prom/node-exporter \
--path.procfs=/host/proc \
--path.sysfs=/host/sys \
--path.rootfs=/rootfs \
--collector.filesystem.mount-points-exclude="^/(sys|proc|dev|etc|host|var|rootfs/(var/lib/docker|media|boot|proc|sys|dev|run|tmp))"

解決策以外に変更したオプション

コンテナの自動再起動を有効化

コンテナが何らかのエラーやサーバーが再起動したことで停止した場合に自動で再起動するようにしました.これにより,わざわざ docker compose updocker run を実行しなくて良くなりました.

 # docker compose
restart: always

# docker run
--restart="always"

ホストのプロセスやsysに関するファイルをマウント

元々,CPUやメモリに関する情報を正しく取得できてはいましたが,念のためマウントするようにしました.こちらも,pathオプションによってNode Exporterがコンテナ内でプロセスファイルとsysファイルを正しく認識できるようにしています.

# docker compose
volumes:
  - /proc:/host/proc:ro
  - /sys:/host/sys:ro
command:
  - --path.procfs=/host/proc
  - --path.sysfs=/host/sys
      
# docker run
-v "/proc:/host/proc:ro"
-v "/sys:/host/sys:ro"
--path.procfs=/host/proc
--path.sysfs=/host/sys

/run/udev/data をマウント

コンテナ起動時に以下のようなエラーが出るためマウントするようにしました.これがなくても全然動きます.

ts=2025-11-03T14:47:19.710Z caller=diskstats_linux.go:264 level=error collector=diskstats msg="Failed to open directory, disabling udev device properties" path=/run/udev/data
# docker compose
volumes:
 - /run/udev/data:/run/udev/data:ro
	
# docker run
-v "/run/udev/data:/run/udev/data:ro" \

システム系のファイルをディスク使用量の計測対象から除外する.

マウントしたホストのシステムファイル( proc , sys )やコンテナのシステムファイルをディスク使用量として含めないようにしました.

# docker compose
command:
 - --collector.filesystem.mount-points-exclude=^/(sys|proc|dev|etc|host|var|rootfs/(var/lib/docker|media|boot|proc|sys|dev|run|tmp))

# docker run
--collector.filesystem.mount-points-exclude="^/(sys|proc|dev|etc|host|var|rootfs/(var/lib/docker|media|boot|proc|sys|dev|run|tmp))"

終わりに

Node ExporterをDockerコンテナで運用する際に詰まったところの解決策をまとめて説明しました. Reboot-Required だけどうしても取得できなかったので,解決策分かる方いたらコメント等で教えてください🙇‍♂️

その他の参考記事

https://qiita.com/kanga/items/21acb042237f8a27f437
https://techracho.bpsinc.jp/ika/2017_07_18/43117

Discussion