fluentd + influxdb + grafana 起動用の docker-compose
Posted: , Modified: docker fluentd influxdb grafana
概要
この記事 を参考に, Docker コンテナのログを fluentd で収集し influxDB と Grafana で 可視化する. 各サービスも 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