Docker實戰(八):Docker安裝ElasticSearch環境

NO IMAGE

Docker安裝ElasticSearch環境

基本步驟和之前幾篇文章一樣,請參考前面的相關文章

ElasticSearch安裝
  • 1.安裝ES
  • 2.安裝head,bigdesk外掛
  • 3.安裝ik外掛
  • 4.配置ES叢集
安裝ES(本文使用的是elasticsearch的1.7.2版本)
# 下載ES
$ curl -O https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.7.2.tar.gz
# 解壓ES壓縮包
$ tar -zxvf elasticsearch-1.7.2.tar.gz
# 啟動ES
$ sudo ./elasticsearch -d
安裝head,bigdesk,HQ,kopf外掛(可選擇安裝,建議安裝head和bigdesk)
$ ${ES_HOME}/bin/plugin --install mobz/elasticsearch-head
# 安裝完成訪問:http://localhost:9200/_plugin/head/
$ ${ES_HOME}/bin/plugin --install lukas-vlcek/bigdesk
# 安裝完成訪問:http://localhost:9200/_plugin/bigdesk/#nodes
$ ${ES_HOME}/bin/plugin -install royrusso/elasticsearch-HQ
# 安裝完成訪問:http://localhost:9200/_plugin/HQ/
$ ${ES_HOME}/bin/plugin -install lmenezes/elasticsearch-kopf
# 安裝完成訪問:http://localhost:9200/_plugin/kopf/#!/cluster
安裝ik外掛
# 因為我使用的是老版本的ES,所以ik外掛也使用的是對應老版本的
$ git clone https://github.com/medcl/elasticsearch-analysis-ik
$ cd elasticsearch-analysis-ik
$ mvn clean
$ mvn compile
$ mvn package
$ cd target
$ cp elasticsearch-analysis-ik-xxx.jar ${ES_HOME}/plugins/ik/
$ cd elasticsearch-analysis-ik
$ cp config/ik ${ES_HOME}/config/
配置elasticsearch.yml檔案,在檔案的最後新增下面的配置
index:
analysis:
analyzer:
ik:
alias: [ik_analyzer]
type: org.elasticsearch.index.analysis.IkAnalyzerProvider
ik_max_word:
type: ik
use_smart: false
ik_smart:
type: ik
use_smart: true
index.analysis.analyzer.default.type: ik
index.store.type: niofs
設定ES的記憶體大小
$ {ES_HOME}/bin
$ vi elasticsearch
# 設定ES的最大記憶體,最小記憶體
ES_MIN_MEM=4g
ES_MAX_MEM=4g
注意

如果這裡不設定ES的記憶體大小,後面整合ELK環境的時候,Logstash會無法批量在ES建立索引而報錯,具體錯誤資訊如下。所以在ES啟動時設定ES的記憶體大小,建議是實際記憶體的一半

Got error to send bulk of actions: Connection reset {:level=>:error}

這個記憶體配置不能隨便設定,必須根據實際情況進行設定,否則設定之後ES就啟動不起來了,報記憶體溢位的錯誤,建議儘量不要隨意修改此配置

Dockerfile檔案
############################################
# version : birdben/elasticsearch:v1
# desc : 當前版本安裝的elasticsearch
############################################
# 設定繼承自我們建立的 jdk7 映象
FROM birdben/jdk7:v1
# 下面是一些建立者的基本資訊
MAINTAINER birdben ([email protected])
# 設定環境變數,所有操作都是非互動式的
ENV DEBIAN_FRONTEND noninteractive
# 新增 supervisord 的配置檔案,並複製配置檔案到對應目錄下面。(supervisord.conf檔案和Dockerfile檔案在同一路徑)
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
RUN echo "export LC_ALL=C"
# 設定 ES 的環境變數,若讀者有其他的環境變數需要設定,也可以在這裡新增。
ENV ES_HOME /software/elasticsearch-1.7.2
# 複製 elasticsearch-1.7.2 檔案到映象中(elasticsearch-1.7.2資料夾要和Dockerfile檔案在同一路徑)
ADD elasticsearch-1.7.2 /software/elasticsearch-1.7.2
# 容器需要開放ES的9200和9300埠
EXPOSE 9200
EXPOSE 9300
# 執行supervisord來同時執行多個命令,使用 supervisord 的可執行路徑啟動服務。
CMD ["/usr/bin/supervisord"]
Dockerfile原始檔連結:

https://github.com/birdben/birdDocker/blob/master/elasticsearch/Dockerfile

supervisor配置檔案內容
# 配置檔案包含目錄和程序
# 第一段 supervsord 配置軟體本身,使用 nodaemon 引數來執行。
# 第二段包含要控制的 2 個服務。每一段包含一個服務的目錄和啟動這個服務的命令。
[supervisord]
nodaemon=true
[program:sshd]
command=/usr/sbin/sshd -D
# 修改supervisor配置方式如下,修改為不自動重啟ES,並且改成非daemon,DFOREGROUND的方式執行,supervisor就可以監控到了
[program:elasticsearch]
command=/bin/bash -c "exec ${ES_HOME}/bin/elasticsearch -DFOREGROUND"
注意supervisor配置
# 之前一直在supervisor使用如下配置來啟動ES,但是仔細觀察Docker的控制檯輸出會發現如下的錯誤
[program:elasticsearch]
command=/{ES_HOME}/bin/elasticsearch -d
INFO success: elasticsearch entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
INFO exited: elasticsearch (exit status 1; not expected)
INFO spawned: 'elasticsearch' with pid 12
INFO exited: elasticsearch (exit status 1; not expected)
INFO spawned: 'elasticsearch' with pid 13
INFO exited: elasticsearch (exit status 1; not expected)
INFO gave up: elasticsearch entered FATAL state, too many start retries too quickly
# 這裡使用supervisorctl status檢視supervisor監控的所有服務,就會發現ES沒有處於被監控狀態
$ supervisorctl status
elasticsearch                    FATAL      Exited too quickly (process log may have details)
sshd                             RUNNING    pid 6, uptime 0:01:49
tomcat                           RUNNING    pid 8, uptime 0:01:49
# 所以這裡修改supervisor配置方式如下,修改為不自動重啟ES,並且改成非daemon,DFOREGROUND的方式執行,supervisor就可以監控到了
[program:elasticsearch]
startsecs = 0
autorestart = false
command=/bin/bash -c "exec ${ES_HOME}/bin/elasticsearch -DFOREGROUND"
# 這裡說明一下supervisor啟動多個服務,要求所有啟動的服務都是非daemon的方式啟動,否則就會遇到如上的問題,autorestart設定為false只是為了讓supervisor啟動報錯的時候不會重複啟動,只要改成非daemon的方式啟動ES,可以設定autorestart為true

參考文章

控制檯終端
# 構建映象
$ docker build -t="birdben/elasticsearch:v1" .
# 執行已經構件好的映象
$ docker run -p 9999:22 -p 9200:9200 -p 9300:9300 -t -i 'birdben/elasticsearch:v1'
訪問ElasticSearch的外掛測試
http://10.211.55.4:9200/_plugin/head/
http://10.211.55.4:9200/_plugin/bigdesk/#nodes
User索引的mapping
{
"mappings": {
"user": {
"dynamic" : "strict",
"properties": {
"id": {
"type": "string",
"index": "not_analyzed"
},
"name": {
"type": "string",
"index_analyzer": "ik",
"search_analyzer": "ik_smart"
},
"age": {
"type": "integer"
},
"job": {
"type": "string",
"index_analyzer": "ik",
"search_analyzer": "ik_smart"
},
"createTime": {
"type": "long"
}
}
}
}
}
新建索引測試ik分詞
# 嘗試建立user索引
$ curl -XPOST 'http://10.211.55.4:9200/user?pretty' -d '{
"mappings": {
"user": {
"dynamic" : "strict",
"properties": {
"id": {
"type": "string",
"index": "not_analyzed"
},
"name": {
"type": "string",
"index_analyzer": "ik",
"search_analyzer": "ik_smart"
},
"age": {
"type": "integer"
},
"job": {
"type": "string",
"index_analyzer": "ik",
"search_analyzer": "ik_smart"
},
"createTime": {
"type": "long"
}
}
}
}
}'
# 如果遇到下面的錯誤,原因是${ES_HOME}/lib/下需要引入httpclient-4.5.jar, httpcore-4.4.1.jar
{
"error" : "IndexCreationException[[user] failed to create index]; nested: NoClassDefFoundError[org/apache/http/client/ClientProtocolException]; nested: ClassNotFoundException[org.apache.http.client.ClientProtocolException]; ",
"status" : 500
}
# 建立索引成功後,檢視索引資訊
$ curl -XGET 'http://10.211.55.4:9200/_cat/indices?pretty'
green open user 5 1 0 0 970b 575b
# 測試ik分詞效果
$ curl -XGET 'http://10.211.55.4:9200/user/_analyze?analyzer=ik&pretty=true' -d '{"text":"世界如此之大"}'
# 測試ik_smart分詞效果
$ curl -XGET 'http://10.211.55.4:9200/user/_analyze?analyzer=ik_smart&pretty=true' -d '{"text":"世界如此之大"}'

參考文章: