Carpe Diem

備忘録。https://github.com/jun06t

docker-compose で Kibana 5.x を使う

概要

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を使用します。

stackoverflow.com

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_limitmem_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のポータビリティの恩恵を受けることができます。

ソース