背景
おうちDockerSwarmクラスタを立てようとしていたところ不思議に思ったことが出たので調べてみました。仕様書を見たというものではないですが、そういう挙動をするようだ、というメモです。(更に詳しい仕様をご存知の方は教えてくれると助かります)
注: 7/31から2ヶ月寝かせたままだった記事です、詳細はもう覚えていません...
疑問に思ったこと
ここに、RPi-Exporterという、ホスト側の温度を取得してPrometheusのメトリクスExporterがあります。
これを Dockerコンテナ化したものに、 Docker-ARM-Exporterというものがあります。
そしてこの DockerArmExporterの実行例を見てみると、タイムゾーン、現在時刻、ノード名を読み取るだけで、肝心の 温度情報部分?をバインドしていませんでした。
このコンテナ、とりあえず試すだけなら、バインドしなくとも動く気がしたので、何もバインドせずに動かしてみました。
rpi_cpu_temperature_celsiusの項目が、リロードすると変動することからホスト温度が確かに読み取りできているようです。 何もバインドしなくて読み取れるってなんでだ?? これが今回の疑問点です。
どうやってホストの温度を読み出している?
そこでソースコードを見たところ、ioutil.ReadFile("/sys/class/thermal/thermal_zone0/temp")
との1文があり、これを読み出すことで温度が取得できているようでした。
Debian/Stretchコンテナで検証
なにか特殊な細工がされているわけではないことを確認するため、debian:stretchコンテナを起動して読み取れるか確認してみました。
これでも読み取りできました。デフォルトでマウントされている、ということで間違いなさそうです。
他に湧いた疑問
デフォルトでマウントされているので温度を読み取れるというのはわかった、けど他にも気になることがある。
そもそも/sys/classって何?
/sys/classはデバイスへのシンボリックリンクが配置されるディレクトリとなっているようです。
https://www.wdic.org/w/TECH//sys/class
他には何がマウントされてるの?
他にも色々マウントされてるみたいです。
https://qiita.com/sato4557/items/b15f325bd735eb340da5
これって書き込めるの?
読み取り専用としてマウントされるようです。
https://forums.docker.com/t/unable-to-mount-sys-inside-the-container-with-rw-access-in-unprivileged-mode/97043
実際試しても書き込めませんでした。
セキュリティとかどうなの?
少しリスクはあるかもしれません
https://container-security.dev/security/sensitive-file-mount.html
結論
Dockerコンテナは何もボリュームをマウントしていなくてもシステムの一部が読み取れる状態で稼働している。書き込みはできないが、なにか攻撃のヒントが出てくる可能性も無くもないので用心に越したことはない。