Docker上でGrafanaとInfluxDBを接続しようとしたらBad Gatewayが出た


「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とします。