LoginSignup
8
4

More than 3 years have passed since last update.

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

Posted at

screencapture-localhost-3000-datasources-edit-6-2021-01-12-20_21_50.png

「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に変更する(非推奨)

こちらは、いろいろ設定を弄っているうちに接続できるようになった、という解決策です。
その後の意味合いを理解すると、この①は非推奨で、後述の②を実施すべきですので、参考程度の記載となります。
スクリーンショット 2021-01-12 20.54.22.png
URLを「https://localhost:8086」のまま接続を確立したい場合はAccessを「Server」から「Browser」に変更することで、「Save & Test」後、「Data source is working」となり接続されるようになりました。

ところで、このAccessとは何なんでしょうか?
右にある「Help」を選択すると以下のような記載が表示されます。
スクリーンショット 2021-01-12 20.58.44.png
要約すると、以下のように理解しました。
- 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とします。

screencapture-localhost-3000-datasources-edit-6-2021-01-12-21_13_50.png

8
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4