TL;DR
dockerコンテナのログをfluentdに集める方法 の続編です.
この記事から読み始めることもできます.
- Docker logdriverの機能を利用して,コンテナのログをelasticsearchに蓄積する仕組みを作ります
- https://github.com/myoshimi/es-docker-logging にdocker-compose.ymlがあります
- dockerコンテナのログをfluentd形式で送信します(logdriverの設定)
- fluentdコンテナでログを受け取り,elasticsearchに蓄積します
- kibanaで蓄積された情報を可視化,解析できます
コンテナ構成例
- 下記の
Logs
パッケージ部分を作ります.- 3つのコンテナから成ります
- データ転送サーバ Fluentd (fluentd)
- 全文検索エンジン Elasticsearch (es)
- 可視化サーバ Kibana
- 同じホストで稼働させたDockerコンテナのログを,Fluentdで受けて,Elasticsearchに蓄積します
- 蓄積されたデータは,(管理者が)Kibanaを通して確認できます
- コンテナ自体のログは取れませんので,別途,稼働状況を確認する仕組みが必要です
- 3つのコンテナから成ります
コンテナの立ち上げ
事前準備
- elasticsearchコンテナを稼働させるために,
vm.max_map_count
を変更する必要があるかもしれません-
vm.max_map_count = 262144
に設定してください
-
$ sudo vi /etc/sysctl.conf
#以下の行を追加
vm.max_map_count = 262144
# 設定変更を反映
$ sudo sysctl --system
docker-compose.ymlでコンテナの立ち上げ
-
git clone
してdocker-compose.ymlをビルドして立ち上げます- 前掲の図の, Logsのコンテナが立ち上がります
- 受信用fluentdコンテナにuken/fluent-plugin-elasticsearchプラグインをインストールする必要があるので,
docker-compose build
を実行します
$ git clone https://github.com/myoshimi/es-docker-logging
$ cd es-docker-logging
$ docker-compose build
...<snip>....
Building fluentd
Step 1/2 : FROM fluent/fluentd:v1.3.2
---> 9406ff63f205
Step 2/2 : RUN gem install fluent-plugin-elasticsearch
---> Running in c75df6c30c9a
Successfully installed excon-0.62.0
...<snip>....
Successfully tagged es-docker-logging_fluentd:latest
$ docker-compose up -d
立ち上がるコンテナは,以下の3つです
es : Elasticsearch
- oss版コンテナを使用しています
- 9200/tcp, 9300/tcpがexposeされています
- コンテナのログ確認,集約だけであれば,kibana経由で見て,直接見ることはないのでので,portsにはしていません
-
${PWD}/es
が,elasticsearchのデータの不揮発ボリュームとしてマウントされます-
注意: es/{data,config}のディレクトリは,uid=1000, gid=1000である必要があります
- 不安な場合は
sudo chown -R 1000:1000 es
してください
- 不安な場合は
-
注意: es/{data,config}のディレクトリは,uid=1000, gid=1000である必要があります
kibana : Kibana
- oss版コンテナを使用しています
- 5601/tcpでportsしていますので,コンテナ立ち上げ後,
http://<URL>:5601/
にブラウザでアクセスすると,Kibanaにアクセスできます
fluentd : fluentd
-
dockerコンテナのログをfluentdに集める方法のfluentdコンテナとほぼ同じです
- ローカルディレクトリの
log
ディレクトリが不揮発ボリュームとして使用されます
- ローカルディレクトリの
- 24224/tcp, 24224/udpがportsされており,別のコンテナからのfluentd出力を受け付けます
- 読み込むfluent.confのみ,違いがあります(次節で説明)
fluent.confの設定
- 受け付けた
docker.***
タグでマッチしたログを, ローカルディレクトリのlog
に蓄積し,その後,elasticsearchへ転送しています- 実行ログは,
es-docker-logging/log
にファイルとして保存されます - 同じログが,elasticsearchに投入されます
- 実行ログは,
<match docker.**>
@type copy
<store>
@type file
@id output_docker1
path /fluentd/log/docker.*.log
symlink_path /fluentd/log/docker.log
append true
time_slice_format %Y%m%d
time_slice_wait 1m
time_format %Y%m%dT%H%M%S%z
</store>
<store>
@type elasticsearch
host es
port 9200
logstash_format true
</store>
</match>
ログ送信側
-
dockerコンテナのログをfluentdに集める方法の送信側コンテナの設定と同じ方法で,ログがelasticsearchに蓄積されます
-
Docker run
でnginxを立ち上げ,ログを受信側のfluentdに流してesに溜める例
docker run -d \
--log-driver=fluentd \
--log-opt fluentd-address=localhost:24224 \
--log-opt tag=docker.{{.Name}} \
nginx:latest
動作確認
- コンテナのログがfluentd経由でesに蓄積された情報を,kibanaで確認
-
http://<URL>:5601/
で確認できます - kibanaの[Discover]をクリックし,[Index Pattern]として
logstash-*
を入力 - [Time filter field]に
@timestamp
を選択 - [Create Index Pattern]をクリック
- [Discover]に戻ると,データが集まってきていることを確認できます
-