Docker ComposeでKibanaが動作する環境を構築する
Docker Composeが使える環境にてKibanaでデータの集計とその可視化をすることになったのですが、minimalなdocker-compose.yml
が見当たらなかった*1ので、Docker Composeのリファレンスを眺めつつdocker-compose.yml
を書いてみました。
お試しなので、Elasticsearchはシングルノードで動かします。
Dockerは18.09.5、Docker Composeは1.24.0、ElasticsearchとKibanaは7.0.0です。
最終的に以下のようなdocker-compose.yml
になりました。
version: '3.3' services: elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:7.0.0 volumes: - es:/usr/share/elasticsearch/data ports: - 9200:9200 environment: - discovery.type=single-node kibana: image: docker.elastic.co/kibana/kibana:7.0.0 ports: - 5601:5601 volumes: es: driver: local
Elasticsearchはデータの操作用に9200番ポートのみを開けています。 シングルノード構成でDockerのネットワーク外のElasticsearchと接続することもないので、9300番ポートは公開しません。 また、データの永続化のためにボリュームを割り当てています。
KibanaはElasticsearchにデータを保存するので、Kibanaはvolumeをマウントする必要はありません。
また、Kibanaが接続しに行くElasticsearchのURLのデフォルト値はelasticsearch:9200
なので、上記のdocker-compose.yml
の場合は接続先の設定をする必要もありません(Docker Composeがネットワークを作成する際、サービス名をホスト名としてDockerが持つDNSに登録するようです)。
あと、networks
を書かなくても自動的に一つのプライベートなネットワークが割り当てられるようなので、networks
も省略しています。
コンテナの作成は以下の通りです。
$ docker-compose up -d
Elasticsearchに対して適当にGETしてみます。以下のような応答が返ってくれば成功です。
$ curl -XGET localhost:9200 { "name" : "c3b6be5bda80", "cluster_name" : "docker-cluster", "cluster_uuid" : "tvBg1C7XQ_S8BlnifjGXmA", "version" : { "number" : "7.0.0", "build_flavor" : "default", "build_type" : "docker", "build_hash" : "b7e28a7", "build_date" : "2019-04-05T22:55:32.697037Z", "build_snapshot" : false, "lucene_version" : "8.0.0", "minimum_wire_compatibility_version" : "6.7.0", "minimum_index_compatibility_version" : "6.0.0-beta1" }, "tagline" : "You Know, for Search" }
あとはブラウザでlocalhost:5601
にアクセスしてKibanaの画面が出れば成功です(もちろん外部からアクセスするときはlocalhost
は読み替えてください)。
コンテナの起動とアクセスのタイミングによってはKibanaがElasticsearchに接続できていなさそうなメッセージが出ますが、少し待ってリロードすると繋がります。
公式のdocker-compose.yml
のように
depends_on: - elasticsearch
と書いていても効果がなかったので、上記のdocker-compose.yml
には書いていません。
*1:この記事を書いているときに見当たりましたが