Docker环境安装Elasticsearch8.5.3(ik分词器 + 单节点模式 + 集群模式)+ Kibana8.5.3
2023/01/14
Docker
Elasticsearch
Kibana
# Elasticsearch > 官方教程:[Install Elasticsearch with Docker](https://www.elastic.co/guide/en/elasticsearch/reference/8.5/docker.html) ## 镜像拉取 ```bash docker pull docker.elastic.co/elasticsearch/elasticsearch:8.5.3 ``` > 因为 `Spring Boot 3.0.1` 对应的 `Spring Data Elasticsearch 5.0.0` 对应的 `Elasticsearch` 的版本为 `8.5.3` ,所以本文以此版本为例 ## 系统配置 ### 修改 sysctl.conf 编辑配置文件 ```bash vim /etc/sysctl.conf ``` 添加如下设置 ```bash vm.max_map_count = 262144 net.ipv4.tcp_retries2=5 ``` 保存后执行以下命令立即生效 ```bash sysctl -p ``` ### 检查 ulimits 的 nofile 和 nproc 运行一个测试容器(运行时会拉取 `centos` 镜像,请耐心等待),输出默认值 ```bash docker run --rm centos:7 /bin/bash -c 'ulimit -Hn && ulimit -Sn && ulimit -Hu && ulimit -Su' ``` 默认情况下,会输出如下内容 - 前两位代表:最多可开启的文件数,最小要求65536 - 后两位代表:进程开启多少个线程,最小要求4096,`unlimited` 代表不受限制 ``` 65536 65536 unlimited unlimited ``` 若出现被限制的值,则需要在执行 `docker run` 时添加如下参数 ```bash --ulimit nofile=65536:65536 --ulimit nproc=4096:4096 ``` ### 禁用 swap 分区 若已关闭则忽略 #### 方案1:关闭宿主机的 swap (推荐) 1. 临时关闭 ```bash swapoff -a ``` 2. 永久关闭 ```bash #编辑配置文件 vim /etc/fstab # 在/etc/fstab中swap分区这行前加 # # /dev/mapper/centos-swap swap swap defaults 0 0 ``` #### 方案2:关闭容器的 swap 在执行 `docker run` 时添加如下参数 ```bash -e "bootstrap.memory_lock=true" --ulimit memlock=-1:-1 ``` ### 端口映射 | 端口 | 协议 | 作用 | | ---- | ---- | ------------ | | 9200 | tcp | 客户端访问 | | 9300 | tcp | 集群数据通信 | 在执行 `docker run` 时添加 `-p` 参数完成端口映射,如果是单节点,9300可以不用映射,如果不需要外部访问,仅容器之间访问,9200也可以不用映射 ### 检查Docker存储驱动程序 不建议使用 `loop-lvm` 驱动,执行以下命令查看驱动 ```bash docker info | grep Storage ``` 查看结果是否如下,默认情况下,驱动为 `overlay2` ```bash Storage Driver: overlay2 ``` 如若出现 `loop-lvm`,请参考[Docker storage drivers](https://docs.docker.com/storage/storagedriver/select-storage-driver/)相关文档 ## 其他配置 ### 自定义网络 创建一个网络,方便后续的其他服务连接进来,网络名称( `elk-birdge` )可自定义 ```bash docker network create elk-birdge ``` ### 文件夹准备 ```bash # 创建 elasticsearch 文件夹 mkdir -p /work/elasticsearch # 进入该文件夹(下文中的命令均以该目录为基础!) cd /work/elasticsearch # 创建自定义 image 文件夹,并创建ik分词器文件夹 mkdir -p image/ik ``` ### 添加 elasticsearch-analysis-ik > ik中文分词器,推荐安装 #### 下载 下载地址:[https://github.com/medcl/elasticsearch-analysis-ik/releases](https://github.com/medcl/elasticsearch-analysis-ik/releases) 需要下载对应的 `8.5.3` 版本`zip`包。注意!是`zip`包!下载完成后上传至服务器 PS:由于作者未更新至 `8.5.3` ,所以只能下载 `8.5.2` 的包 #### 解压 ```bash # 安装解压工具(若已安装,则忽略此步) yum -y install zip unzip # 解压 unzip elasticsearch-analysis-ik-8.5.2.zip -d /work/elasticsearch/image/ik/ # 删除 rm -rf elasticsearch-analysis-ik-8.5.2.zip ``` #### 配置 ```bash # 修改 ik 分词器的配置 vim /work/elasticsearch/image/ik/plugin-descriptor.properties # 将文档结尾的 elasticsearch.version=8.5.2 改为 elasticsearch.version=8.5.3 并保存 ``` ### 制作自定义镜像(含时区和自定义插件) #### 编写 Dockerfile 新建一个Dockerfile文件 ```bash vim ./image/Dockerfile ``` 添加如下内容 ```dockerfile FROM docker.elastic.co/elasticsearch/elasticsearch:8.5.3 # 切换至 root USER root # 设置为国内源,更新源、安装 tzdata 、设置时区 RUN curl -o /etc/apt/sources.list http://mirrors.cloud.tencent.com/repo/ubuntu20_sources.list \ && apt-get update -y && apt-get upgrade -y \ && ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && echo "Asia/Shanghai" > /etc/timezone \ && apt-get install -y tzdata \ && dpkg-reconfigure -f noninteractive tzdata \ && apt-get clean \ && apt-get autoclean # 回到 elasticsearch 用户 USER elasticsearch ADD ik /usr/share/elasticsearch/plugins/ik/ ``` #### 执行制作镜像 ```bash docker build -t elasticsearch-ik:8.5.3 ./image/ ``` ## 单节点模式启动 ### 创建文件夹 创建数据存储文件夹,并修改文件夹所有者。说明:默认情况下,容器运行使用 `elasticsearch` 用户并且 `uid:gid` 为 `1000:0` ,所以使用 `-v` 绑定本地数据卷时,需要修改文件夹访问权限以允许容器访问 ```bash mkdir data chmod g+rwx data chgrp 0 data ``` ### 启动容器 ```bash docker run -d --name elasticsearch -h elasticsearch --restart always \ -v /work/elasticsearch/data/:/usr/share/elasticsearch/data \ --network elk-birdge -p 9200:9200 \ -e "network.host=0.0.0.0" \ -e "network.publish_host=192.168.220.101" \ -e "discovery.type=single-node" \ -e "ingest.geoip.downloader.enabled=false" \ -e ES_JAVA_OPTS="-Xms512m -Xmx512m" \ elasticsearch-ik:8.5.3 ``` 启动脚本注意如下事项 - `ulimit` 相关设置根据情况自行添加 - `swap` 相关设置根据情况自行添加 - 如果后面搭建的 `Kibana` 和 `Elasticsearch` 在同一台服务器同一个网络下,则无需添加 `-e "network.publish_host=192.168.220.101" \` ,其中 `192.168.220.101` 为宿主机的 `IP` - `-e "discovery.type=single-node"` :使用单节点模式 - `-e "ingest.geoip.downloader.enabled=false"` :关闭 `geoip` 数据下载 - `-e ES_JAVA_OPTS="-Xms512m -Xmx512m"` : `JVM` 内存设置,根据实际情况调整,但是 `Xms` 和 `Xmx` 的值一定要相等 - 端口根据需要进行映射 ### 查看日志 跟踪日志,当日志停止输出且中途未出现 `ERROR` 即可表示容器启动成功,此时可以按 `Ctrl + c` 退出跟踪 ```bash docker logs -f elasticsearch ``` ### 重置初始密码 由于启动时使用了 `-d` 参数,首次启动时生成的默认密码不会在控制台输出,所以需要重置密码。执行以下脚本 ```bash docker exec -it elasticsearch /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic ``` 根据提示输入 `y` 并回车,新密码将在控制台显示 ### 访问 浏览器访问:`https://[ip]:9200`,注意是 `https` 协议,默认用户名为 `elastic` ,密码在上文生成的密码,访问成功后可以看到如下类似信息 ```json { "name" : "elasticsearch", "cluster_name" : "docker-cluster", "cluster_uuid" : "3VEaabgoSzuiBUbDHj07zA", "version" : { "number" : "8.5.3", "build_flavor" : "default", "build_type" : "docker", "build_hash" : "4ed5ee9afac63de92ec98f404ccbed7d3ba9584e", "build_date" : "2022-12-05T18:22:22.226119656Z", "build_snapshot" : false, "lucene_version" : "9.4.2", "minimum_wire_compatibility_version" : "7.17.0", "minimum_index_compatibility_version" : "7.0.0" }, "tagline" : "You Know, for Search" } ``` ## 集群模式启动 以四台服务器三个节点为例,环境如下 | IP | 服务 | | --------------- | -------------- | | 192.168.220.101 | elasticsearch1 | | 192.168.220.102 | elasticsearch2 | | 192.168.220.103 | elasticsearch3 | | 192.168.220.104 | kibana | PS:如果需要在一台服务器上完成以上四个服务的搭建(测试可以,生产环境不推荐),需要至少 `8G` 内存,在下文的教程中,需要注意数据文件目录以及节点启动命令需要删除 `-e "network.publish_host=xxx" \` 配置。 ### 创建文件夹 在 `elasticsearch` 的节点上创建数据存储文件夹,并修改文件夹所有者。说明:默认情况下,容器运行使用 `elasticsearch` 用户并且 `uid:gid` 为 `1000:0` ,所以使用 `-v` 绑定本地数据卷时,需要修改文件夹访问权限以允许容器访问 ```bash mkdir data chmod g+rwx data chgrp 0 data ``` ### 启动容器 #### 启动主节点 在主节点的机器上执行一下命令 ```bash docker run -d --name elasticsearch1 -h elasticsearch1 --restart always \ -v /work/elasticsearch/data/:/usr/share/elasticsearch/data \ --network elk-birdge -p 9200:9200 -p 9300:9300 \ -e "cluster.name=es_cluster" \ -e "network.host=0.0.0.0" \ -e "network.publish_host=192.168.220.101" \ -e "ingest.geoip.downloader.enabled=false" \ -e ES_JAVA_OPTS="-Xms512m -Xmx512m" \ elasticsearch-ik:8.5.3 ``` 启动脚本注意如下事项 - `ulimit` 相关设置根据情况自行添加 - `swap` 相关设置根据情况自行添加 - `es_cluster` 是集群名称,可自定义,集群名称相同才能加入 - `192.168.220.101` 为宿主机的 `IP` - `-e "ingest.geoip.downloader.enabled=false"` :关闭 `geoip` 数据下载 - `-e ES_JAVA_OPTS="-Xms512m -Xmx512m"` : `JVM` 内存设置,根据实际情况调整,但是 `Xms` 和 `Xmx` 的值一定要相等 - 多台服务器时,两个端口都需要映射 跟踪日志,当日志停止输出且中途未出现 ERROR 即可表示容器启动成功,此时可以按 Ctrl + c 退出跟踪 ```bash docker logs -f elasticsearch1 ``` #### 生成从节点加入 token 由于启动时使用了 `-d` 参数,首次启动时生成的默认 `token` 不会在控制台输出,所以需要手动重置一下。 `token` 有效期为半小时,可多次使用。 ```bash docker exec -it elasticsearch1 /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s node ``` #### 启动从节点 启动时,需要将脚本中的 `token` 更换成上文生成的 > 从节点1 ```bash docker run -d --name elasticsearch2 -h elasticsearch2 --restart always \ -v /work/elasticsearch/data/:/usr/share/elasticsearch/data \ --network elk-birdge -p 9200:9200 -p 9300:9300 \ -e "cluster.name=es_cluster" \ -e "network.host=0.0.0.0" \ -e "network.publish_host=192.168.220.102" \ -e ENROLLMENT_TOKEN="token" \ -e "ingest.geoip.downloader.enabled=false" \ -e ES_JAVA_OPTS="-Xms512m -Xmx512m" \ elasticsearch-ik:8.5.3 ``` > 从节点2 ```bash docker run -d --name elasticsearch3 -h elasticsearch3 --restart always \ -v /work/elasticsearch/data/:/usr/share/elasticsearch/data \ --network elk-birdge -p 9200:9200 -p 9300:9300 \ -e "cluster.name=es_cluster" \ -e "network.host=0.0.0.0" \ -e "network.publish_host=192.168.220.103" \ -e ENROLLMENT_TOKEN="token" \ -e "ingest.geoip.downloader.enabled=false" \ -e ES_JAVA_OPTS="-Xms512m -Xmx512m" \ elasticsearch-ik:8.5.3 ``` ### 重置初始密码 由于启动时使用了 `-d` 参数,首次启动时生成的默认密码不会在控制台输出,所以需要重置密码,在主节点执行以下命令 ```bash docker exec -it elasticsearch1 /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic ``` 根据提示输入 `y` 并回车,新密码将在控制台显示 ### 访问 浏览器访问:`https://[ip]:9200` ,注意是 `https` 协议,默认用户名为 `elastic` ,密码在上文生成的密码,访问成功后可以看到如下类似信息 ```json { "name" : "elasticsearch1", "cluster_name" : "es_cluster", "cluster_uuid" : "e4IGny9-T8i7yrO5Ucx5OQ", "version" : { "number" : "8.5.3", "build_flavor" : "default", "build_type" : "docker", "build_hash" : "4ed5ee9afac63de92ec98f404ccbed7d3ba9584e", "build_date" : "2022-12-05T18:22:22.226119656Z", "build_snapshot" : false, "lucene_version" : "9.4.2", "minimum_wire_compatibility_version" : "7.17.0", "minimum_index_compatibility_version" : "7.0.0" }, "tagline" : "You Know, for Search" } ``` # Kibana 官方教程:[Install Kibana with Docker](https://www.elastic.co/guide/en/kibana/8.5/docker.html) ## 镜像拉取 ```bash docker pull docker.elastic.co/kibana/kibana:8.5.3 ``` ## 启动容器 ### 创建 token 执行以下脚本创建 `token` ;集群模式时,在 `elasticsearch` 节点上执行,注意容器名称 ```bash docker exec -it elasticsearch /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana ``` 将新生成的 `token` 记录下来,下文需要使用 ### 创建容器 ```bash docker run -d --name kibana -h kibana --restart always -p 5601:5601 --network elk-birdge docker.elastic.co/kibana/kibana:8.5.3 ``` ### 访问与配置 在容器启动后,查看启动日志 ```bash docker logs -f kibana ``` 1. 当在日志中看到 `Go to http://0.0.0.0:5601/?code=261687 to get started.` 信息时,代表容器启动成功( `code` 代码每个人都不同) 2. 直接访问 `http://[ip]:5601` 进入 `Kibana` 配置页面;也可以复制日志中的 `http://0.0.0.0:5601/?code=261687` 这段信息粘贴到浏览器,并将 `0.0.0.0` 改为宿主机的 `IP` 后进入配置页面 3. 之后看到信息提示输入 `token` ,将上文中生成的那段 `token` 粘贴进去(粘贴之后就可以看到 `elasticsearch` 的地址信息)并点击 `Configure Elastic` 完成配置,如果在上一步访问时 `url` 没有携带 `code` 则此时会提示输入,完成输入并确定即可配置成功
65