fluentd + influxdb + grafana 起動用の docker-compose 

Posted: , Modified:   docker fluentd influxdb grafana

概要

この記事 を参考に, Docker コンテナのログを fluentd で収集し influxDBGrafana で 可視化する. 各サービスも Docker コンテナとして実行し, また,ひとまとめに logging サービスとして Systemd で管理させる.

fluentd の設定

fluentd コンテナを用意する. 収集したログを influxDB に出力するためには, fluent-plugin-influxdb プラグインが必要になるが, docker hub で公開されているイメージ には同梱されていないので自前で fluentd イメージを作成する.

次の Dockerfile は, fluent/fluentd:v0.12-onbuild を利用し fluent-plugin-influxdb をインストールする.

FROM fluent/fluentd:v0.12-onbuild

RUN apk add --update --virtual .build-deps sudo build-base ruby-dev \
    && sudo gem install fluent-plugin-influxdb -v "~> 0.3"  --no-document \
    && sudo gem sources --clear-all \
    && apk del .build-deps \
    && rm -rf /var/cache/apk/* /home/fluent/.gem/ruby/2.3.0/cache/*.gem

また,このプラグインを使用した設定を用意しておく. 次の fluent.conf は 24224 ポートで待ち受け,受け取ったログを influxDB へ転送する. なお,influxDB のホスト名として influxdb を, 保存先データベース名として log を使用する予定なので,そのように設定している.

<source>
  @type forward
  @id input1
  @label @mainstream
  port 24224
</source>

<label @mainstream>
  <match **>
    @type influxdb
    @id output_influxdb
    host influxdb
    port 8086
    dbname log
    time_precision s
  </match>
</label>

influxDB と Grafana の設定

これらは共に influxDB イメージGrafana イメージ が用意されているので, そのまま用いることにする.

また,influxDB に保存先データベース log が必要となるので,CREATE DB を実行するサービス createdb を定義する. このサービスは,influxDB の起動を待って実行する必要があるのだが, Docker は各コンテナ内のサービスが待ち受けを開始したか否かまでは通知してくれないので, wait-for-it.sh を使って influxDB の 立ち上がりを待つことにする.

次の Dockerfile は,createdb サービス用に wait-for-it.sh をインストールした イメージを定義する.

FROM influxdb

ADD https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh /root/
RUN chmod u+x /root/wait-for-it.sh
ENTRYPOINT ["/root/wait-for-it.sh"]

このイメージを使って,

$ influxdb:8086 -- \
  curl -i -XPOST http://influxdb:8086/query --data-urlencode "q=CREATE DATABASE log"

というコマンドを実行すると,influxdb:8086 が反応するまで待機し, curl -i -XPOST http://influxdb:8086/query --data-urlencode "q=CREATE DATABASE log" が実行されデータベース log を作成する.

logging サービス

以上3つのサービスをまとめて logging サービスを定義する. fluentd と createdb 用の Dockerfile をそれぞれ fluentd と createdb というフォルダを作り保存する. また,fluentd フォルダには fluent.conf と空の plugins フォルダも保存しておく.

そして,logging サービスを定義する次の docker-compose.yml をルートに保存する.

version: "2"
volumes:
  influxdb:
    driver: "local"
  grafana:
    driver: "local"
services:
  fluentd:
    build: fluentd
    ports:
      - 127.0.0.1:24224:24224
    links:
      - influxdb
  influxdb:
    image: influxdb
    volumes:
      - influxdb:/var/lib/influxdb
  grafana:
    image: grafana/grafana
    ports:
      - 127.0.0.1:3000:3000
    links:
      - influxdb
    volumes:
      - grafana:/var/lib/grafana
  createdb:
    build: createdb
    command: influxdb:8086 -- curl -i -XPOST http://influxdb:8086/query --data-urlencode "q=CREATE DATABASE logging"
    links:
      - influxdb

フォルダ構成は次の様になる.

.
├── createdb
│   └── Dockerfile
├── docker-compose.yml
└── fluentd
    ├── Dockerfile
    ├── fluent.conf
    └── plugins

上記の設定で,24224 ポートが fluentd 用に,3000 ポートが grafana 用に公開される. また,influxdb と grafana のデータ保存用にデータボリュームを定義している.

サービスユニット定義

最後に Systemd 用サービスユニットの定義を用意する. なお,上記で作成した docker-compose.yml やその他のファイルが /var/docker/logging 以下に保存されているとする.

[Unit]
Description=Logging Services
Requires=docker.service
After=docker.service

[Service]
ExecStartPre=-/usr/local/bin/docker-compose -f /var/docker/logging/docker-compose.yml build
ExecStart=/usr/local/bin/docker-compose -f /var/docker/logging/docker-compose.yml up
ExecStop=/usr/local/bin/docker-compose -f /var/docker/logging/docker-compose.yml down

Restart=always
Type=simple

[Install]
WantedBy=multi-user.target