基于 Docker 部署 Elasticsearch 8.x 集群与 Kibana 实践记录
今天,我将记录一次完整的基于 Docker 部署 Elasticsearch 8.x 的过程。从单点部署开始,逐步扩展到三节点的集群,并最终部署 Kibana 作为可视化管理工具。Elasticsearch 8 版本在安全性和集群搭建方面做了很多优化,整个过程比旧版本要方便得多,特别是其基于令牌的注册机制,非常值得体验。
环境说明:
操作系统:Ubuntu
依赖软件: Docker Engine
部署版本: Elasticsearch 8.18.3, Kibana 8.18.3
第一部分:单节点 Elasticsearch 部署
首先,我从部署一个单节点的 Elasticsearch 开始。这是后续搭建集群和部署其他组件的基础。
步骤一:创建 Docker 网络
为了让 Elasticsearch、Kibana 等容器能够方便地相互通信,我们首先创建一个自定义的 Docker 网络。
# 创建名为 "elastic" 的 bridge 网络
[root@elk91 ~]# docker network create elastic
62c2988843eebae50481dcd8a33b88109289ac6a86022a9ba3f02376da35e7e6
# 查看网络列表,确认创建成功
[root@elk91 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
...
62c2988843ee elastic bridge local
...步骤二:获取 Elasticsearch 镜像
你可以选择在线拉取或者从本地加载镜像文件。
方式一:在线拉取
docker pull docker.elastic.co/elasticsearch/elasticsearch:8.18.3方式二:离线加载 (如果已提前下载好)
# 假设镜像包已上传至服务器
[root@elk91 ~]# docker load -i oldboyedu-elasticsearch-v8.18.3.tar.gz步骤三:运行单节点 ES 容器
现在,我们运行第一个 Elasticsearch 节点。ES8 默认会开启安全特性,包括密码认证和 HTTPS 通信。
# 运行容器,命名为 es01,加入 elastic 网络,并将主机的 19200 端口映射到容器的 9200 端口
[root@elk91 ~]# docker run --name es01 -d --net elastic -p 19200:9200 -it -m 2GB docker.elastic.co/elasticsearch/elasticsearch:8.18.3--name es01: 为容器指定一个易于识别的名称。
-d: 后台运行容器。
--net elastic: 将容器连接到我们创建的 elastic 网络。
-p 19200:9200: 将主机的 19200 端口映射到容器的 9200 端口。
-m 2GB: 限制容器最大使用 2GB 内存。
步骤四:重置 elastic 超级用户密码
容器首次启动时,会为 elastic 用户生成一个随机密码并打印在日志中。为了方便管理,我们通常会立即重置它。
# 进入 es01 容器执行密码重置命令
[root@elk91 ~]# docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic
# ... 省略警告信息 ...
This tool will reset the password of the [elastic] user to an autogenerated value.
The password will be printed in the console.
Please confirm that you would like to continue [y/N]y
# 这是新生成的密码,务必记录下来!
+SzNgpoVnnYcOqjyjRLr步骤五:拷贝 CA 证书
由于 ES8 默认启用 HTTPS,客户端(如 curl 或浏览器)需要信任其证书。我们需要将 CA 证书从容器中拷贝到宿主机。
# 将容器内的 CA 证书拷贝到当前目录
[root@elk91 ~]# docker cp es01:/usr/share/elasticsearch/config/certs/http_ca.crt .步骤六:测试单点部署
使用 curl 命令验节点是否正证常工作。
# 使用 CA 证书和新密码进行验证
[root@elk91 ~]# curl --cacert http_ca.crt -u elastic:+SzNgpoVnnYcOqjyjRLr https://localhost:19200
{
"name" : "4a080ccaa240",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "cSErCUHISh6rg-dmeXrMaA",
"version" : { ... },
"tagline" : "You Know, for Search"
}
# 查看节点信息,-k 参数可以忽略证书验证,在临时测试时更方便
[root@elk91 ~]# curl -k -u elastic:+SzNgpoVnnYcOqjyjRLr https://localhost:19200/_cat/nodes
172.18.0.2 62 90 12 0.23 0.31 0.19 cdfhilmrstw * 4a080ccaa240看到类似上面的输出,说明我们的单节点 ES 已经成功运行了!
第二部分:搭建 Elasticsearch 集群
在单节点的基础上,我们可以非常方便地扩展为集群。ES8 的令牌机制让新节点加入变得异常简单。
步骤一:创建节点加入令牌 (Enrollment Token)
在 es01 节点上生成一个用于新节点加入的令牌。
注意:该令牌默认有效期为 30 分钟。
# 在 es01 容器内为新 node 创建一个注册令牌
[root@elk91 ~]# docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s node
# 这是一长串的令牌,复制它
eyJ2ZXIiOiI4LjE0LjAiLCJhZHIiOlsiMTcyLjE4LjAuMjo5MjAwIl0sImZnciI6IjNlODgxODE3YmNmYWVjNjI5ZDNiNWVhYjgzYmE0ZjRiYjQ1M2Q3ZmUzZjgwNWNmOTcyNzE1NTExNDFlNjJmYjQiLCJrZXkiOiJLbWxLeEpjQko1Nmh1a3pYR3VvWjp5WjZnRG5aZGU4SWMyM25SYXBJLWV3In0=步骤二:启动新节点并加入集群
使用上一步生成的令牌,启动 es02 和 es03 节点。它们会自动发现并加入由 es01 创建的集群。
# 启动 es02 节点,通过环境变量传入令牌
[root@elk91 ~]# docker run -e ENROLLMENT_TOKEN="<这里粘贴你的令牌>" --name es02 -d --net elastic -it -m 1GB docker.elastic.co/elasticsearch/elasticsearch:8.18.3
# 启动 es03 节点,使用同一个令牌
[root@elk91 ~]# docker run -e ENROLLMENT_TOKEN="<这里粘贴你的令牌>" --name es03 -d --net elastic -it -m 1GB docker.elastic.co/elasticsearch/elasticsearch:8.18.3新节点启动时,会使用令牌中的信息连接到 es01,并自动完成证书交换和集群配置。
步骤三:验证集群状态
稍等片刻,待新节点启动并加入集群后,再次查询节点信息。
# 再次通过 es01 的端口查询集群节点
[root@elk91 ~]# curl --cacert http_ca.crt -u elastic:+SzNgpoVnnYcOqjyjRLr https://localhost:19200/_cat/nodes
172.18.0.3 59 71 24 1.11 0.55 0.31 cdfhilmrstw - a8fd0587a255
172.18.0.2 53 76 24 1.11 0.55 0.31 cdfhilmrstw * 4a080ccaa240
172.18.0.4 45 99 58 1.11 0.55 0.31 cdfhilmrstw - 4bd05528d38f可以看到,输出中包含了三个节点的信息,其中 es01 (IP 172.18.0.2) 是主节点(由 * 标识)。至此,一个三节点的 ES 集群就搭建完成了。
第三部分:部署 Kibana 并连接至集群
Kibana 是 Elastic Stack 的官方可视化工具,部署它来管理我们的新集群。
步骤一:获取 Kibana 镜像
同样,可以选择在线拉取或离线加载。
# 方式一:在线拉取
[root@elk91 ~]# docker pull docker.elastic.co/kibana/kibana:8.18.3
# 方式二:离线加载
[root@elk91 ~]# docker load < oldboyedu-kibana-v8.18.3.tar.gz
步骤二:运行 Kibana 容器
# 运行 Kibana 容器,同样连接到 elastic 网络,并映射 5601 端口
[root@elk91 ~]# docker run --name kib01 --net elastic -d -p 15601:5601 docker.elastic.co/kibana/kibana:8.18.3步骤三:为 Kibana 生成注册令牌
Kibana 连接 ES 集群也需要一个专用的令牌。
# 在 es01 上为 kibana 生成一个注册令牌
[root@elk91 ~]# docker exec -it es01 /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana
# 复制这个 Kibana 专用令牌
eyJ2ZXIiOiI4LjE0LjAiLCJhZHIiOlsiMTcyLjE4LjAuMjo5MjAwIl0sImZnciI6IjI5Mjk4ODdlOWYxNmIwYTcxNTE2NTk3MWE3OWI0MzJmZWQyOThkOWFjZTA5ZTg2NDgyMjk1MzFkNjkzMDA2MGUiLCJrZXkiOiI1SmNpeEpjQlFzM1lXZ0hteFhuczo4Wi12VFlwSnA3VnpTbnF0VThpRXRBIn0=步骤四:配置 Kibana 连接
打开浏览器,访问 Kibana 的 Web UI:http://<你的宿主机IP>:15601。
Kibana 会提示 "Configure Elastic to get started",要求输入一个注册令牌。将上一步生成的 Kibana 令牌 粘贴进去,点击 "Configure Elastic"。
步骤五:输入验证码
令牌验证通过后,Kibana 会要求输入一个验证码以完成配对。
# 在宿主机上执行命令,获取 Kibana 的验证码
[root@elk91 ~]# docker exec kib01 bin/kibana-verification-code
Your verification code is: 214 112 将这个验证码(例如 214 112)输入到 Web UI 中。
步骤六:登录 Kibana
验证成功后,会跳转到登录页面。使用我们之前重置的 elastic 用户和密码 (+SzNgpoVnnYcOqjyjRLr) 登录即可。
步骤七:(可选) 将 Kibana 设置为中文界面
为了方便使用,我们可以修改 Kibana 的配置文件,将其界面语言设置为中文。
# 1. 进入 Kibana 容器
[root@elk91 ~]# docker exec -it kib01 bash
# 2. 在容器内,将中文配置追加到 kibana.yml 文件
kibana@f49381b1e6c6:~$ echo 'i18n.locale: "zh-CN"' >> config/kibana.yml
kibana@f49381b1e6c6:~$ exit
# 3. 退出容器后,在宿主机上重启 Kibana 容器使配置生效
[root@elk91 ~]# docker restart kib01稍等片刻,再次刷新 Kibana 页面,你就会看到熟悉的中文界面了。

总结
通过以上步骤,我们成功地使用 Docker 部署了一个三节点的 Elasticsearch 8.x 集群,并配置了 Kibana 作为其可视化管理工具。整个过程得益于 ES8 的新特性,变得非常标准化和高效。希望这篇实践记录对你有所帮助!