今天,我将记录一次完整的基于 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 连接

  1. 打开浏览器,访问 Kibana 的 Web UI:http://<你的宿主机IP>:15601

  2. 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 的新特性,变得非常标准化和高效。希望这篇实践记录对你有所帮助!