基本的に私は怠惰です。
よってコードなんか一から作りたくないし、できることならコピペで行きたい!!!!
でもって生活豊かにしたい!!!!
な状況でいままでSwitchbotのAPIをかまってきていなかったのですが、ちょっとかまってみようかな、その結果蓄積してグラフを見てみたいなと思いついた次第。
基本的には初心者(私)の
- コンテナってどういうもの?
- 過去事例の見返し
- 各ソフトに関しての知見
がこの投稿の目的です。
初心者なので認識等がすごく曲解/間違っている可能性が高いですが指摘等していただけると知見の積み上げになります
なぜなに
- なぜコンテナ上で?
ざっと検索したところコンテナ作成例が多くみられた。
今までかまっていなかったため、便利なら使いたいなー程度のノリ - なぜRaspberrypi?
データベースの蓄積が重要です。ということは常時稼働(消費電力)が必要です。
よってRaspberry pi 4(Linux)上で作成できれば64Bit対応したらしい2Wでも稼働できるかもしれないし、NAS稼働もできるかもしれない。
ただ初回からNAS稼働だと最悪NASの初期化も考えなければいけない可能性もあるので、それだったらSD初期化で済むRaspberry piは知見を学ぶには良。
コンテナとは?
初期定義何もないWebソフトウェア。
よってそのまま起動しただけではほぼ役に立つことはないが、そこのところはいろいろ便利なことが考えられている
- ポートの割り付けが自由自在
- データの保存場所設定が可能
- ネットワークの分離等の設定が可能
- 初期設定なども文章設定できる
だがこれをコマンドで打とうとすると覚えてられるかぁぁ!!!( ノ ゚ー゚)ノ
となるのは当然である。しかも一つ一つにこれが必要なわけで…
そんなあなたに朗報です。
DockerのLinux版にはDocker composeというソフトがあります。
どこかに./docker
フォルダを作りましょう(名称は任意)
その下部にcompose.yaml
を作成します。
これの中に任意の設定を入れてdocker compose up -d
をすればあら不思議!
ソフトが立ち上がるではありませんか!!!
ちなみにこのyamlファイルですが、
services:
software1:
image:image1
software2:
image:image2
と記載すればすべてのイメージが立ち上がります。便利!!
ちなみに検索するとdocker-compose
というコマンドがQiitaの中で大量に見つかりますが、今はdocker compose
に置き換わっています。(VersionがV1→V2になりました。)
とりあえずいろいろインストールから起動まで
まずは何よりインストール
sudo apt install docker.io
sudo usermod -aG docker $USER
先ほど前項のようにフォルダを作成後、
とりあえずyamlには以下を記載して実行してみましょう
services:
grafana:
image: grafana/grafana
container_name: grafana
environment:
- GF_AUTH_ANONYMOUS_ENABLED=true
volumes:
- grafana-storage:/var/lib/grafana
ports:
- 3000:3000
networks:
- frontend
influxdb:
image: influxdb:2.7.6
container_name: influxdb
volumes:
- ./influxdb2/data/:/var/lib/influxdb2/
- ./influxdb2/config/:/etc/influxdb2/
ports:
- 8086:8086
environment:
- DOCKER_INFLUXDB_INIT_MODE=setup
- DOCKER_INFLUXDB_INIT_USERNAME=xxxxxxxxx
- DOCKER_INFLUXDB_INIT_PASSWORD=xxxxxxxxx
- DOCKER_INFLUXDB_INIT_ORG=xxxxxxxxx
- DOCKER_INFLUXDB_INIT_BUCKET=xxxxxxxxx
networks:
- frontend
networks:
frontend:
driver: bridge
ipam:
driver: default
volumes:
grafana-storage:
そうすれば対象のポートでWebアプリが開かれているはずです。
たまにポートが開かれていない場合はdocker compose ps -a
で立ち上がっているか確認しましょう。
volumesの作成がrootになっていたりする場合があり、書き込めなくてexitedになっている可能性が高いです。
上記ではさっくり流しましたが、上のgrafanaとinfluxdbではデータの保管方法が違います。
grafanaではDockerのVolume機能使ってgrafana-storage(実態は別名称に保存されるっぽい?)を使ってvar/lib/docker/volumes/
内にデータが保存されますが、
influxdbではyamlのある場所~/docker
に保存されます。
大抵は上のDockerのVolume機能を使うほうが(所有者問題等の)問題は少ないと思われますが、var/lib/docker/
内はrootが占有していますので悩みどころかと思われます。
さくっと作成したら次はInfluxDBに移りましょう
InfluxDB
時系列データベースとあるように時間は送れません。
つまりは送った時間が記録時間です。
逆に言えば時間は送らなくていいのであとは何を測定してどの結果だったかだけ送ればいいのでなかなか便利です。
しかもInfluxDBには代表的な4つのIoT言語のサンプルが載っています。
例題としてPythonの例題を上げます
point = (
Point("measurement1") // 測定の対象(個体名称)
.tag("tagname1", "tagvalue1") // なくてもかまわない(任意:複数OK)
.field("field1", value) // 測定の結果(任意:複数OK)
)
何らかのデータを送ると結果としてDataExplorerで受信データが観測できるはずです。
先ほども言ったように時系列なので、初回はしばらく時間をおかないと結果として見えてきませんね
Grafana
さて。グラフ化ツールのお話です。
ここに来るまでに何個かcomposeに仕掛けをしました。
例えば下記です
services:
grafana:
environment:
- GF_AUTH_ANONYMOUS_ENABLED=true
これによってGrafanaの閲覧権限を外すことができます。
毎度ログインしなくていいなんて!!!
ただし書き込み制限はあるのでGradinaに入ったらSign in
で初回アカウント登録やログインをしましょう。
初回のパスワードは
User:admin
Password:admin
で入力に成功すると下記の新規パスワード入力が出てきます。
入ると中央付近に下記が見えるはずです。
まずはinfluxdbと連携させなければいけないのでDatasourceからですね
ここで注意が二つほど。
- Query language
Query languageが選択できますが、今回インストールしたのはinfluxdb:2.7.6なのでSQLは使えません。
そのため、FluxかinfluxQLのどちらかになります。
そしてもう一つ。ここで選択されるのはどうやってデータを取り出すかの質問なので、後述の実装が全くと言っていいほど変わっています。
これはGurafanaの実装によるものなので、おそらくはGrafanaのVersionによって変更されるはずです。(当該のスクリーンショットはGrafana v11.2.0 (2a88694fd3))
- URL
URLにはhttp://localhost:8086
とあります。
コンテナ由来の条件となりますが、compose.yamlでnetworksなどを設定したはずです。
services:
grafana:
networks:
- frontend
influxdb:
networks:
- frontend
networks:
frontend:
driver: bridge
ipam:
driver: default
上記のように設定するとhttp://<container_name>:8086
とすると接続できます。
この場合はhttp://influxdb:8086
ですね。
Connections>Data sourcesで記載する場所は
- Query languageの選択(今回はFlux)
- HTTP>URL
- InfluxDB Details> Organization & Token & Default Bucket
の箇所のみです。
datasource is workingと表示されたなら
ダッシュボードに行き、Add>Visualizationを見てみましょう。
先ほどのFluxによるQueryの書式記入ができるはずです。
下記を入力して中央付近のリフレッシュマークを押します。
from(bucket: "<データを保存したDOCKER_INFLUXDB_INIT_BUCKETの名前>")
|> range(start: 0)
さっくり表示できたはずです。
Fluxの言語については下記を参照してください。Flux language syntaxからも飛べます。
2024/10/27:Grafanaデータストレー関連等追加