Docker 部署 Elasticsearch 8.10.3 踩坑指南
前言
使用 Docker 部署 Elasticsearch 并非一句 docker run 可以成功,无论是使用 -v 参数映射目录乃至编辑配置文件 elasticsearch.yml 和 Kibana 的部署处处都是坑。下面我将我的踩坑过程列举,希望可以帮助后人。
部署 Elasticsearch
设置较大的 max_map_count 值(可选)
max_map_count 是 Linux 中的一个系统参数,用于控制进程可以创建的虚拟内存区域的数量。为了确保 Elasticsearch 能够成功启动,需要设置一个较大的值。使用命令 cat /proc/sys/vm/max_map_count
来查看当前系统 max_map_count 值,一般为 65530
。现在使用命令 sysctl -w vm.max_map_count=262144
来临时将 max_map_count 值设置为 262144
。
手动创建和赋权给启动容器需要映射的目录
一般将 data 数据目录,plugins 插件目录,logs 目录映射到实机。使用以下命令创建目录:
mkdir -p /root/es/data /root/es/plugins /root/es/logs
接着使用 chmod 命令给所有用户赋可读写权限:
chmod 777 /root/es/data
chmod 777 /root/es/plugins
chmod 777 /root/es/logs
由于 Elasticsearch 容器不是使用 root 来启动应用,如果没有对目录赋权,Elasticsearch 容器启动将报错:
报错:docker failed to obtain node locks, tried [/usr/share/elasticsearch/data]
启动容器
使用以下命令启动容器:
docker run -d \
--restart=always \
--name elasticsearch \
-p 9200:9200 \
-p 9300:9300 \
-v /root/elasticsearch/data:/usr/share/elasticsearch/data \
-v /root/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-v /root/elasticsearch/logs:/usr/share/elasticsearch/logs \
-e "discovery.type=single-node" \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
-e "TAKE_FILE_OWNERSHIP=true" \
elasticsearch:8.10.3
查看容器日志
使用以下命令查看容器日志:
docker logs -f elasticsearch
正常启动后,在浏览器访问实机 https://IP:9200 ,如果弹出 basic auth 验证窗口则表明容器运行成功
修改 Elasticsearch 配置
配置文件 elasticsearch.yml 在容器内 /usr/share/elasticsearch/config 目录,修改它有两种方法:
方法一:使用>
和 >>
重定向输出的符号
使用命令进入容器:
docker exec -it elasticsearch /bin/bash
使用重定向输出符号将配置项覆盖或追加至 elasticsearch.yml 文件,例如:
echo 'xpack.security.enabled: false' >> /usr/share/elasticsearch/config/elasticsearch.yml
方法二:安装并使用 vim 编辑器
由于容器内没有 vim、nano 等编辑器,因此需要预先安装。但直接进入容器的 bash 后默认是 elasticsearch 用户,没有 apt 命令的执行权限,此时需要加上 -u 0 参数使用 root 用户进入容器 bash:
docker exec -u 0 -it elasticsearch /bin/bash
更新和安装 vim:
apt update
apt install -y vim
之后使用 vim 编辑 elasticsearch.yml
一些常用的 Elasticsearch 配置
根据个人需要配置即可
允许跨域
http.cors.enabled: true
http.cors.allow-origin: "*"
关闭 SSL
xpack.security.transport.ssl:
enabled: false
xpack.security.http.ssl:
enabled: false
关闭安全验证
xpack.security.enabled: false
重置密码
进入 Elasticsearch 容器后执行:
/usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive
设置六个账户的密码,设置为一样即可
重启服务:
docker restart elasticsearch
设置完成后,访问 https://IP:9200,使用 elastic 账户和刚刚设置的密码登录可验证是否设置成功
部署 Kibana
Kibana 是 Elasticsearch 的 Web 可视化前端,部署版本必须和 Elasticsearch 相同的
启动容器
使用以下命令启动 Kibana
docker run -d \
--restart=always \
--name kibana \
-p 5601:5601 \
kibana:8.10.3
使用浏览器访问 https://IP:5601,提示需要配置 Enrollment token。需要进入 elasticsearch 容器,使用以下命令获取:
/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token --scope kibana
token 配置完成后使用上一节重置的密码继续配置账户
修改 UI 为中文
按照上一章节,在容器内的配置文件 /usr/share/kibana/config/kibana.yml
追加配置:
i18n.locale: "zh-CN"
之后重启容器即可
安装 ik 分词器
ik 分词器为 elasticsearch 的常用插件,安装的版本也必须和 Elasticsearch 相同
下载 ik 分词器插件
访问如下 releases 页面:
https://github.com/infinilabs/analysis-ik/releases
搜索和 Elasticsearch 部署版本一致的 release,如果没有,需要自行打包或找第三方打包的插件:
https://github.com/infinilabs/analysis-ik/issues/1028
下载后在 Elasticsearch 映射目录的 plugins 内新建 ik 文件夹,将下载好的 ik 分词器插件解压至 plugins 目录,重启 Elasticsearch 即可