Node ExporterをDockerコンテナで運用する際に詰まった話
はじめに
Node exporterをDockerコンテナで運用する際にいくつか問題点がありました.試行錯誤して解決できたものがあるので記録しておきます.
前提
以下の記事を参考にして,Prometheusスタックによる監視基盤を作成しました.
問題点
Node Exporterを次のように実行していました.
docker compose
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で可視化する際に以下の問題が発生します.
- Nodenameがコンテナのハッシュ値になる.
- RootFS Used, RootFS Totalの情報が取れない.
- Reboot Requiredの情報が取れない.
解決策
1. Nodenameがコンテナのハッシュ値になる.
hostnameオプションでコンテナのホスト名を明示的に指定します.Ansibleで複数サーバーにNode exporterを設置する場合は {{ ansible_hostname }} とするのがいいかもしれません.
# docker compose
hostname: my-server
# docker run
--hostname="my-sever"
最初はホストの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
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 up や docker 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 だけどうしても取得できなかったので,解決策分かる方いたらコメント等で教えてください🙇♂️
その他の参考記事
Discussion