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]に戻ると,データが集まってきていることを確認できます
 
- 



