Docker 部署 Elasticsearch 8.10.3 踩坑指南

117

前言

使用 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 即可