最近想搭建一个这样的(https://zhuanlan.zhihu.com/p/565631132)文件管理知识库。
佳瑞大佬的界面很漂亮,但是后台是用的SpringBoot,前端用的是vue和我的技术栈相去甚远。所以参考大佬的技术路线,我打算用Django+Elasticsearch+MongoDB+React自己搭建一个。
警告!截止2023年3月7日7.17.9的中文ik分词插件尚未发布,虽然搭建的时候我以下面的内容搭建,但最后退回了7.17.7版本。请注意。
官方文档:
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/docker.html
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.9
先拉镜像下来。
docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.17.9
然后运行一下指令,应该一般都可以运行。
那这里可能就有好奇的小伙伴要问我
“啊,橘子橘子怎么这么拉啊,es都出到8.6版本了怎么你还安装7.17的呢?
我给你看一下官方文档里面的内容,你就知道为什么了。
这是7.x的docker的启动说明:
就一句话运行就完了。
到了8.X版本的呢?
网页缩放到40%截图都截不完,还没到正题。这8.0更新了什么呢?
拜拜了您嘞,咱只是个小项目,已经花了3天时间在搭这个环境上面了,我不配用8.0哈。
早在我测试用Deb模式安装的时候就遇到了权限的问题(遇到的问题会放在最后,我卡了一天没解决,最后才选择了docker)。Es是不允许你用root权限运行的,所以造成在用目录挂载的时候会出现问题。
1.新建一个存放data
、logs
、config
的路径,比如:/home/es_data/
,先不要建立这三个子文件夹。
2.先随便运行一个容器,比如:docker run --name es_test -d -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.17.9
3.把这个容器里面的config文件复制出来:docker cp es_test:/usr/share/elasticsearch/config /home/es_data/
4.建立data和logs文件夹
5.修改文件所有者:chown -R 1000:1000 /home/es_data/
6.执行正式的run指令:
docker run --name es -d -p 9200:9200 -p 9300:9300 -v /home/es_data/data:/usr/share/elasticsearch/data -v /home/es_data/logs:/usr/share/elasticsearch/logs -v /home/es_data/config:/usr/share/elasticsearch/config -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.17.9
官方文档里面写:
mkdir esdatadir
chmod g+rwx esdatadir
chgrp 0 esdatadir
You can also run an Elasticsearch container using both a custom UID and GID. You must ensure that file permissions will not prevent Elasticsearch from executing. You can use one of two options:
Bind-mount the config, data and logs directories. If you intend to install plugins and prefer not to create a custom Docker image, you must also bind-mount the plugins directory.
Pass the --group-add 0 command line option to docker run. This ensures that the user under which Elasticsearch is running is also a member of the root (GID 0) group inside the container.
我英文不太好,这个说明大义应该是说你可以用 --group-add 0
这个参数,让容器里面也是用root来运行。我试了,不行,还是权限问题。(如果有大佬知道怎么处理请指点我一下。)
咱们只能抛开官方文档的方法,自己找办法。
如何查看错误日志呢?:
执行:docker inspect --format '{{.LogPath}}' es
bash会返回一个文件名,这个文件名就是错误信息了。通过查看错误信息,我们可以知道是logs文件没有权限导致docker容器启动失败。
所以先不挂载映射目录,到启动的容器里面查看一下。
root@b7eb1ef36767:/usr/share/elasticsearch# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
...
elasticsearch:x:1000:1000:,,,:/usr/share/elasticsearch:/bin/bash
可以看到容器里面是用这个elsticsearch:x:1000:1000
的账号启动的。
所以只要把我们的目标目录的所有者也修改成1000:1000
就可以了。
修改指令为:
chown -R 1000:1000 /home/es_data/
注意:这里这个-R
是必不可少的,我测试过如果你不加这个-R,那这个目录的权限还是不能使用。
这时候再运行:
docker run --name es_test -d -p 9200:9200 -p 9300:9300 -v /home/es_data/data:/usr/share/elasticsearch/data -v /home/es_data/logs:/usr/share/elasticsearch/logs -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.17.9
data文件和log文件就挂载成功了,默认的log4j配置文件是console输出的,logs文件夹下只会生成gc的日志,如果需要查看es运行的情况可以使用config里面的log4j2.file.properties这个配置文件。
但是依旧存在一个问题:
如果你再加一个参数:
-v /home/es_data/config:/usr/share/elasticsearch/config
要把config文件夹也映射出来,
会返回错误
java.nio.file.NoSuchFileException: /usr/share/elasticsearch/config/jvm.options\n"
文件找不到,我不太清楚原因出在哪里,应该是docker的执行流程的问题。
我能想到的解决办法就是复制一份config出来,这样就可以了。所以有了流程中的docker ps
那一步。
PS:
测试的时候遇到exece进到docker里面,过一会就被自动踢出来的问题。
原因为:
容器里的前台进程挂了,而我又设置了 restart=always 或是 restart=unless-stopped,就会反复在启动 -> 挂掉 -> 退出 -> 重启之间循环了。
kibana就简单多了
1.拉取镜像docker pull kibana:7.17.9
2.测试一下
docker run --name kibana -d --link es:elasticsearch -p 5601:5601 kibana:7.17.9
3.顺便把配置文件复制出来:
docker cp kibana:/opt/kibana/config/ /home/es_data/kibana_config/
4.修改一下kibana.yml
添加:i18n.locale: zh-CN
(注意冒号后面一定要有一个空格)
5.删除掉测试的容器,重新运行一个。
docker run --name kibana -d -v /home/es_data/kibana_config:/opt/kibana/config --link es:elasticsearch -p 5601:5601 kibana:7.17.9
kibana由于没有要写入的文件,所以不用修改config文件夹的权限。
不然其实kibana里面也是用kibana这个用户来执行的。
启动失败
ERROR: Elasticsearch exited unexpectedly
以为是内存的问题:
根据说明在
/etc/elasticsearch/jvm.options.d
下面新建了一个
set_heap.options
-Xms1g
-Xmx1g
确实配置生效了,但是还是启动不了
[2023-03-03T15:34:45.253+0000][1396787][gc,init] Heap Region Size: 1M
[2023-03-03T15:34:45.253+0000][1396787][gc,init] Heap Min Capacity: 1G
[2023-03-03T15:34:45.253+0000][1396787][gc,init] Heap Initial Capacity: 1G
[2023-03-03T15:34:45.253+0000][1396787][gc,init] Heap Max Capacity: 1G
[2023-03-03T15:34:45.253+0000][1396787][gc,init] Pre-touch: Disabled
把配置文件里面所有的enable改成false后,就有日志输出了。
fatal exception while booting Elasticsearchjava.lang.RuntimeException: can not run elasticsearch as root
根据文档要求,用systemctl start elasticsearch执行就可以了。
Temporary directory [/tmp/elasticsearch-16749968039178836198] does not exist or is not accessible
在使用systemctl启动的时候会报这个问题,原因是该目录没有被生成。但是如果直接运行./elasticsearch就会生成tmp目录了。这个问题卡了很久,同时第一个问题又时有时无,会偶发出现,失去耐性,改成用docker部署。
es
docker run --name es -d -p 9200:9200 -p 9300:9300 -v /home/es_data/data:/usr/share/elasticsearch/data -v /home/es_data/logs:/usr/share/elasticsearch/logs -v /home/es_data/config:/usr/share/elasticsearch/config -v /home/es_data/plugins:/usr/share/elasticsearch/plugins -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.17.7
kibana
docker run --name kibana -d -v /home/es_data/kibana_config:/opt/kibana/config --link es:elasticsearch -p 5601:5601 kibana:7.17.7