dockerコンテナのログをelasticsearchに集めて解析する方法

# TL;DR

[dockerコンテナのログをfluentdに集める方法](https://qiita.com/myoshimi/items/87fca5a4f9b1df78bb48) の続編です．
この記事から読み始めることもできます．

* 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を通して確認できます
    * コンテナ自体のログは取れませんので，別途，稼働状況を確認する仕組みが必要です

![docker-es.jpg](https://qiita-image-store.s3.amazonaws.com/0/309617/d0c9a2c9-5fed-58b9-b630-d3313ae691d1.jpeg)

# コンテナの立ち上げ

# 事前準備

* elasticsearchコンテナを稼働させるために， ```vm.max_map_count```を変更する必要があるかもしれません
    * ```vm.max_map_count = 262144``` に設定してください

```bash
$ 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](https://github.com/uken/fluent-plugin-elasticsearch)プラグインをインストールする必要があるので， ```docker-compose build``` を実行します

```shell
$ 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``` してください

## kibana : Kibana

* oss版コンテナを使用しています
* 5601/tcpでportsしていますので，コンテナ立ち上げ後，```http://<URL>:5601/```にブラウザでアクセスすると，Kibanaにアクセスできます
    * ホストのポートが開いている場合
    * <img src="https://qiita-image-store.s3.amazonaws.com/0/309617/024268ba-d9cf-5844-1435-ab1d9ec3f235.jpeg" width=50%>

## fluentd : fluentd

* [dockerコンテナのログをfluentdに集める方法](https://qiita.com/myoshimi/items/87fca5a4f9b1df78bb48)のfluentdコンテナとほぼ同じです
    * ローカルディレクトリの ```log``` ディレクトリが不揮発ボリュームとして使用されます
* 24224/tcp, 24224/udpがportsされており，別のコンテナからのfluentd出力を受け付けます
    * 読み込むfluent.confのみ，違いがあります（次節で説明）

### fluent.confの設定

* 受け付けた ```docker.***``` タグでマッチしたログを， ローカルディレクトリの ```log``` に蓄積し，その後，elasticsearchへ転送しています
    * 実行ログは， ```es-docker-logging/log``` にファイルとして保存されます
    * 同じログが，elasticsearchに投入されます

```bash
  <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に集める方法](https://qiita.com/myoshimi/items/87fca5a4f9b1df78bb48)の[送信側コンテナの設定](https://qiita.com/myoshimi/items/87fca5a4f9b1df78bb48#fluentd%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E5%81%B4%E3%81%AE%E8%A8%AD%E5%AE%9A)と同じ方法で，ログがelasticsearchに蓄積されます

* ```Docker run```でnginxを立ち上げ，ログを受信側のfluentdに流してesに溜める例

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

![elastic0.jpg](https://qiita-image-store.s3.amazonaws.com/0/309617/b777ba08-066a-93b1-6edd-22811cb30448.jpeg)

# 参考

* [dockerコンテナのログをfluentdに集める方法](https://qiita.com/myoshimi/items/87fca5a4f9b1df78bb48)