Docker安装ElasticSearch
- 2020 年 6 月 13 日
- 筆記
- ElasticSarch
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
这样就启动起来啦~
通过//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!