「Grafana InfluxDB Docker」とググってみて出てくるチュートリアルをやってみたら上記のようなBad Gatewayに悩まされたお話。
結論としては、URLとAccessの組み合わせを正しく理解していなかったためでした。
実施環境
ローカルPCのDocker上にGrafanaとInfluxDBのコンテナを立ち上げ、GrafanaのData SourcesからInflxDBを設定しようとしました。
以下のようなDocker-compose.ymlを書いて、実行します。
version: "3"
services:
influxdb:
image: influxdb:latest
ports:
- "8086:8086"
volumes:
- ./data/influxdb:/var/lib/influxdb
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
volumes:
- ./data/grafana:/var/lib/grafana
depends_on:
- influxdb
volumesはフィジビリする上では好みですが、今回はdocker-compose.ymlと同階層に「data」フォルダを作成し、その下に「influxdb」フォルダと「grafana」フォルダを作成しておきます。
InfluxDBにdockerコマンドでアクセスして、新規データベース(ここではsample)とメジャーメントを作成しておいてから、Grafanaに「http://localhost:3000」
でアクセスをして、ConfigurationのData SourcesよりInfluxDBを追加するために情報を入力して、「Save & Test」を実行までしたところ、冒頭のような「InfluxDB Error: Bad Gateway」が発生しました。
解決策① AccessをServer→Browserに変更する(非推奨)
こちらは、いろいろ設定を弄っているうちに接続できるようになった、という解決策です。
その後の意味合いを理解すると、この①は非推奨で、後述の②を実施すべきですので、参考程度の記載となります。
URLを「https://localhost:8086」
のまま接続を確立したい場合はAccessを**「Server」から「Browser」**に変更することで、「Save & Test」後、「Data source is working」となり接続されるようになりました。
ところで、このAccessとは何なんでしょうか?
右にある「Help」を選択すると以下のような記載が表示されます。
要約すると、以下のように理解しました。
- ServerはGrafanaのバックエンドを経由してアクセスを試みる(内部通信)
- Browserはブラウザ上から直接アクセスを試みる(外部通信)
つまり、今回つまづいた理由はServerのときにURLを「localhost:8086」としてるので、Grafanaコンテナ上の8086ポートにアクセスしようとしたため、Bad Gatewayが発生したということになります。
それが、解決策①では内部通信ではなく、外部通信として、localhost(ローカルPC自身)をアクセスしにいくようになったため、接続できるようになったということになります。
しかし、実際のケースではInfluxDBのようなデータベース層を外部からアクセスできるような状態になっているケースは殆ど無く、DBへは内部通信でアクセスできるようにしたくなります。
そのため、今回は以下のような解決策で、アクセスできるようにしました。
解決策② URLを内部通信向けの名前(アドレス)に変更する
今回は、Docker composeよりGrafanaコンテナとInfluxDBコンテナを起動しているため、docker-compose.yml
の記載やディレクトリ名に依存しますが、今回は一例として以下のような状態となります。
$ docker-compose ps
Name Command State Ports
-------------------------------------------------------------------------------------
influxdb_grafana_grafana_1 /run.sh Up 0.0.0.0:3000->3000/tcp
influxdb_grafana_influxdb_1 /entrypoint.sh influxd Up 0.0.0.0:8086->8086/tcp
上記の場合、InfluxDBのコンテナ名は「influxdb_grafana_influxdb_1」となります。
docker-composeでは、networkよりデフォルトでお互いのコンテナ名で名前解決ができるため、この「influxdb_grafana_influxdb_1」をURL名とすることでAccessがServerでも接続ができるようになります。
今回の例だと、URLをhttp://influxdb_grafana_influxdb_1:8086
とします。