概要
Kibanaを5.xにメジャーアップデートする際、Elastic社公式のdocker imageも用意されたのでdocker-composeでまとめて作ることにしました。
その際調べたこと、ハマったことをまとめます。
環境
- docker 17.03.1-ce
- docker-compose 1.11.2
- Elasticsearch 5.3.0
- Kibana 5.3.0
docker-compose.yml
まずは全体のソースを貼ります。
後ほどポイントを説明します。
version: '2.1' services: elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:5.3.0 container_name: elasticsearch environment: - cluster.name=dev-kibana-cluster - node.name=dev-kibana-01 - bootstrap.memory_lock=true - xpack.security.enabled=false - xpack.monitoring.enabled=true - xpack.watcher.enabled=false - xpack.graph.enabled=false - xpack.monitoring.history.duration=1d - "ES_JAVA_OPTS=-Xms1g -Xmx1g" ulimits: memlock: soft: -1 hard: -1 nofile: soft: 65536 hard: 65536 mem_limit: 2g memswap_limit: 2g cap_add: - IPC_LOCK volumes: - es_data1:/usr/share/elasticsearch/data ports: - 9200:9200 networks: - kibana_net logging: driver: "json-file" options: max-size: "10m" max-file: "10" kibana: image: docker.elastic.co/kibana/kibana:5.3.0 container_name: kibana environment: ELASTICSEARCH_URL: "http://elasticsearch:9200" XPACK_MONITORING_ELASTICSEARCH_URL: "http://elasticsearch:9200" XPACK_SECURITY_ENABLED: "false" ports: - 80:5601 networks: - kibana_net mem_limit: 2g memswap_limit: 2g depends_on: - elasticsearch logging: driver: "json-file" options: max-size: "10m" max-file: "10" volumes: es_data1: driver: local networks: kibana_net: driver: bridge ipam: driver: default config: - subnet: 172.18.0.0/24 gateway: 172.18.0.1
ポイント
まず方針として以前のバージョンまでのようにconfigファイルを用意するのでなく、環境変数で設定をしています。
docker-compose yaml
最新はversion 3ですが、version 3はSwarmモード以外はリソースの制限ができなくなったので、それ以前の2.1
を使用します。
Elasticsearch
ES_JAVA_OPTSを設定
ES5からES_HEAP_SIZE
は無くなって、ES_JAVA_OPTS
でメモリを指定するようになったので設定します。
X-Packの設定
- xpack.security.enabled=false - xpack.monitoring.enabled=true - xpack.watcher.enabled=false - xpack.graph.enabled=false - xpack.monitoring.history.duration=1d
トライアル1ヶ月で、以降は有料になるため基本的にはOFFにしています。
security
はONの場合認証が挟まるのでちょっと手間になります。
ulimitsを設定
Important System Configuration | Elasticsearch Reference [5.4] | Elasticで説明されている重要なカーネル系パラメータを設定しています。
mem_limit, memswap_limitの設定
メモリ上限の設定です。基本的にES_JAVA_OPTS
の倍の値にします。
memswap_limit
はmem_limit
を含んだ値で、例えば
mem_limit | memswap_limit | 実際のスワップ |
---|---|---|
1G | 2G | 1G |
2G | 2G | 0 |
となります。今回スワップを無くしているのは、AWSのEC2上で実行する必要性があり、EC2インスタンスにはスワップが存在しないためです。
memswap_limit
を指定しない場合は自動的にmem_limit
の2倍のスワップを割り当てられるので、
mem_limit | memswap_limit | 実際のスワップ |
---|---|---|
1G | - | 2G |
となります。
volumesの指定
別でdata volumeを用意しています。
volumes: es_data1: driver: local
Docker Data Volume を理解する - Carpe Diemでも書きましたが、今のバージョンのdockerはdata volumeの機能が充実しているので、特別な理由がなければ利用した方が良いです。
このdata volumeはホスト側で永続化してくれるので、docker-compose.yml
に変更がでて
$ docker-compose up -d
でコンテナの再作成が走ったりした場合も、
$ docker-compose down
でコンテナを削除した場合も消えることはありません。
Kibana
mem_limitは最低2G(スワップありなら1G)
動かしてみて知ったのですが、新しいKibanaは起動時にOptimize処理が走ります。
これが非常にメモリを喰う処理で、スワップ含め最低2G無いとメモリが足りずに落ちます。OOM Killerに殺されるので静かに死にます。
Network
subnetを指定
Docker network周りでハマった話|株式会社CAリワードでも言及されていますが、defaultのままだと自動で設定されますがこれがホスト側と被る可能性もあるのでできるだけ指定した方が良いです。
デプロイ
docker-compose.ymlで環境変数などを変更した場合は
$ docker-compose up -d
でOK。
新しいdocker imageが出た場合は、
$ docker-compose pull $ docker-compose up -d
すればOKです。
docker-composeにして良かった点
アップデートが非常に楽です。docker-compose.ymlのimage
ところを修正して、あとはデプロイするだけで更新できます。
またローカルにも同じ環境がサクッと作れるので、dockerのポータビリティの恩恵を受けることができます。