Docker安裝ElasticSearch
一、使用Docker的ElasticSearch鏡像
前置技能是學會Docker使用,這里就不具體說Docker如何使用了,默認讀者掌握了Docker技能
1、查看Docker倉庫中的ElasticSearch
首先查看Docker倉庫中的ElasticSearch,選用自己要用的elaseticsearch
[root@iZ1ejkkkxu2looZ ~]# docker search elasticsearch

2、拉去鏡像到本地
選用自己要用的版本,下載到本地
[root@iZ1ejkkkxu2looZ ~]# docker pull elasticsearch
這里由於我之前已經下載了7.6.1的版本,有部分鏡像文件就不需要下載了。並且這個作為演示,就沒有寫版本號,自動下載最新版。
各位同學如果要下載指定版本,記得 elasticsearch:版本號

檢查一下,鏡像已經被下載好了

3、運行鏡像
運行鏡像的時候,要記得指定運行環境,因為elaticsearch的默認占用內存是1G,而我的這個小學生機只能最多也就1G的空間,要是打開那絕對當場暴斃。需要ES_JAVA_OPTS=-Xms512m -Xmx512m 指定占用內存
另外還需要指定discovery.type=single-node
docker run -it --name myes -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" 5acf0e8da90b
這樣就啟動起來啦~

通過http://ip:9200 進行訪問也是可以的~

二、配置跨域
其實配置跨域還是比較簡單的,僅需要修改一下config文件夾中的elasticsearch.yml文件的參數即可,但是在docker的鏡像中修改卻有些問題,原因在於官方提供的鏡像是沒有vim的,無法進行文件修改。
對此,我們有兩種辦法解決。
方法1
當我們在容器中使用 vim指令時,會得到
root@3961c96d3af4:/usr/share/elasticsearch# ls
NOTICE.txt README.textile bin config data lib logs modules plugins
root@3961c96d3af4:/usr/share/elasticsearch# cd config
root@3961c96d3af4:/usr/share/elasticsearch/config# vim elasticsearch.yml
bash: vim: command not found
既然容器中沒有vim,那么我們就自己下載一個即可。
可是怎么下載呢?
當我第一次安裝的時候,網上搜了很多,說是使用apt-get update與 apt-get vim命令即可,但是我輸入的時候卻提示沒有該命令。后來搜到說centos的軟件安裝工具不是apt-get而是yum,於是我嘗試了下yum vim結果成功了!
不過在我演示的時候,下了最新版的elasticsearch,卻發現apt-get命令可以使用了,人都傻了,容器的底層操作系統都給換了嗎???不明白。
更新好vim后,即可進入elastcsearch.yml進行操作。
cluster.name: "qfcwx-cluster"
network.host: 0.0.0.0
http.cors.enabled: true
http.cors.allow-origin: "*"
一、二行的應該是本來就有的,而三、四行是我們自己加的。
第三行的意思是設置允許跨域,第四行的意思是允許所有的網址跨域請求,*是通配符嘛。
就此,我們的跨域也就配置好了。
方法2
使用容器數據卷來共享數據,在容器外修改以達到修改的目的。
我們要掛載的就是config/elasticsearch.yml文件。
# 0、現在宿主機上創建好對應的文件。
touch elasticsearch.yml
# 1、使用命令在run容器的時候掛載數據卷 -v命令掛載數據卷
docker run -d --name myes_v05 -p 9203:9200 -p 9303:9300 -e "discovery.type=single-node" -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" -v /home/myEs02/elastcsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml 5acf0e8da90b
# 2、然后在宿主機上進行相應的修改
vim elasticsearch.yml
輸入:
cluster.name: "qfcwx-cluster"
network.host: 0.0.0.0
http.cors.enabled: true
http.cors.allow-origin: "*"
# 3、編輯好了之后 運行docker即可
docker start ad82d782f79a

大功告成!!
這里得着重說一下這里有幾個坑點。
由於我對docker不是很熟悉,所以犯了很多錯誤。在這里寫出來,希望大家能引以為戒。
坑點1:
一開始我沒有做第0步,就是直接執行docker run的語句,結果報錯了。
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "process_linux.go:449: container init caused \"rootfs_linux.go:58: mounting \\\"/home/myEs03/elastcsearch.yml\\\" to rootfs \\\"/var/lib/docker/overlay2/ebdec218f44d495d05b5f265745fec5e53c57a1e3d43858f5f338d92a52ccc34/merged\\\" at \\\"/var/lib/docker/overlay2/ebdec218f44d495d05b5f265745fec5e53c57a1e3d43858f5f338d92a52ccc34/merged/usr/share/elasticsearch/config/elasticsearch.yml\\\" caused \\\"not a directory\\\"\"": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.
對這個結果我很疑惑為什么會這樣呢?看了錯誤提示,他說試圖將目錄掛載到文件上,我有些蒙蔽,我明明是制定了.yml文件的呀!
然后我就去了相應目錄看了

結果是這樣的。按道理說結合上面的錯誤提示和這個藍色的標識,我就應該想到這個.yml文件其實是一個文件夾!
然而由於我對linux不熟悉,還以為文件就是這樣的,然后又在網上查啊查,查了好久才發現,我這個.yml是個文件夾!不得不說太具有迷惑性了。。。我怪我自己對linux系統太不熟悉,以至於搞出這樣的笑話。
於是我touch了一個正常的yml,這才不報這個錯誤,然而又一個錯誤不期而至。
坑點2:
解決了坑點1之后,我就准備看看運行成功后的結果啦,然而事情又有波折。
再次報錯:
[2020-06-13T08:19:44,278][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler] [] uncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: java.lang.IllegalArgumentException: unknown setting [uster.name] did you mean [clust
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:136) ~[elasticsearch-5.6.12.jar:5.6.12]
at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:123) ~[elasticsearch-5.6.12.jar:5.6.12]
at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:70) ~[elasticsearch-5.6.12.jar:5.6.1
at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:134) ~[elasticsearch-5.6.12.jar:5.6.12]
at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-5.6.12.jar:5.6.12]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:91) ~[elasticsearch-5.6.12.jar:5.6.12]
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:84) ~[elasticsearch-5.6.12.jar:5.6.12]
Caused by: java.lang.IllegalArgumentException: unknown setting [uster.name] did you mean [cluster.name]?
at org.elasticsearch.common.settings.AbstractScopedSettings.validate(AbstractScopedSettings.java:293) ~[elasticsearch-5.6.
at org.elasticsearch.common.settings.AbstractScopedSettings.validate(AbstractScopedSettings.java:256) ~[elasticsearch-5.6.
at org.elasticsearch.common.settings.SettingsModule.<init>(SettingsModule.java:139) ~[elasticsearch-5.6.12.jar:5.6.12]
at org.elasticsearch.node.Node.<init>(Node.java:344) ~[elasticsearch-5.6.12.jar:5.6.12]
at org.elasticsearch.node.Node.<init>(Node.java:245) ~[elasticsearch-5.6.12.jar:5.6.12]
at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:233) ~[elasticsearch-5.6.12.jar:5.6.12]
at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:233) ~[elasticsearch-5.6.12.jar:5.6.12]
at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:342) ~[elasticsearch-5.6.12.jar:5.6.12]
at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:132) ~[elasticsearch-5.6.12.jar:5.6.12]
... 6 more
核心的報錯是unknown setting [uster.name] did you mean [clust
經過研究后發現,可能是我的空格引起的,yml中的配置我是直接復制的,可能我的文本編輯環境的空格和linux的空格不一樣,所以產生這種情況。
我再次打開yml文件,將里面的空格重新輸入了一遍就解決了這個問題!
坑點3:
解決了坑點2之后,我就准備看看運行成功后的結果啦,然而事情又有波折。
我在執行docker run之后,又報了錯誤。
ERROR: [1] bootstrap checks failed
[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
這次的報錯也簡單易懂,擁有的內存分配太少了
但是我不知道為什么會這樣,之前運行都是直接運行的,從來沒有報過這種錯誤。有沒有大佬能告訴下為什么會這樣呢?
不過這個報錯還好解決,百度了下,只需要設置一下即可。
切換到root用戶
執行命令:
sysctl -w vm.max_map_count=262144
查看結果:
sysctl -a|grep vm.max_map_count
顯示:
vm.max_map_count = 262144
三個坑點解決之后,我就成功運行起了elasticsearch!
大功告成~
NICE!
