精通 Docker 中的 Elasticsearch:一篇详尽的教程
Elasticsearch 是一个功能强大的开源、分布式、RESTful 风格的搜索和数据分析引擎。Docker 是一个领先的容器化平台,它允许开发者将应用及其依赖打包到一个可移植的容器中。将这两者结合使用,可以极大地简化 Elasticsearch 集群的部署、管理和扩展过程。
本教程将引导您完成从运行单个 Elasticsearch 节点到使用 Docker Compose 部署多节点集群并集成 Kibana 的全过程。
目录
- 先决条件
- 第一部分:运行单节点 Elasticsearch
- 拉取 Elasticsearch 镜像
- 启动容器
- 验证安装
- 第二部分:数据持久化
- 使用 Docker 卷
- 第三部分:自定义配置
- 通过环境变量配置
- 通过绑定配置文件配置
- 配置 JVM 堆大小
- 第四部分:使用 Docker Compose 部署多节点集群
- 创建
docker-compose.yml文件 - 启动并管理集群
- 验证多节点集群
- 创建
- 第五部分:集成 Kibana
- 更新
docker-compose.yml - 访问 Kibana
- 更新
- 第六部分:安全注意事项
- 禁用安全功能(仅限开发环境)
- 结论
先决条件
在开始之前,请确保您的系统已安装并运行 Docker。您可以通过在终端中运行以下命令来验证:
bash
docker --version
如果您看到了 Docker 的版本信息,那么说明已准备就绪。
第一部分:运行单节点 Elasticsearch
对于开发或测试环境,单个 Elasticsearch 节点通常就足够了。
1. 拉取 Elasticsearch 镜像
首先,我们从 Elastic 的官方 Docker 仓库中拉取 Elasticsearch 镜像。建议使用明确的版本号以确保环境的一致性。
bash
docker pull docker.elastic.co/elasticsearch/elasticsearch:8.12.2
2. 启动容器
使用 docker run 命令来启动一个 Elasticsearch 容器。
bash
docker run --name es-node01 --net elastic -p 9200:9200 -it -m 1GB -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:8.12.2
让我们分解一下这个命令:
* --name es-node01:为容器指定一个易于识别的名称。
* --net elastic:将容器连接到一个名为 elastic 的 Docker 网络。如果该网络不存在,Docker 会自动创建它。这对于后续的多节点部署至关重要。
* -p 9200:9200:将主机的 9200 端口映射到容器的 9200 端口。这是 Elasticsearch REST API 的默认端口。
* -it:以交互模式运行容器,并分配一个伪 TTY。
* -m 1GB:限制容器最多使用 1GB 的内存。
* -e "discovery.type=single-node":设置环境变量 discovery.type 为 single-node。这告诉 Elasticsearch 它是一个单节点集群,无需进行节点发现。
注意:从 Elasticsearch 8.x 版本开始,安全功能默认开启。首次启动时,它会在终端输出中生成 elastic 用户的密码和一个用于 Kibana 注册的令牌。请务必复制并妥善保管这些信息。
3. 验证安装
容器启动后,您可以打开一个新的终端窗口,使用 curl 命令或浏览器来验证 Elasticsearch 是否正在运行。
bash
curl -k --user elastic:<Your-Generated-Password> https://localhost:9200
* 将 <Your-Generated-Password> 替换为上一步中生成的密码。
* -k 标志用于忽略自签名证书的验证。
如果一切正常,您将看到类似以下的 JSON 响应:
json
{
"name" : "es-node01",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "...",
"version" : { ... },
"tagline" : "You Know, for Search"
}
第二部分:数据持久化
默认情况下,当您删除 Docker 容器时,其中存储的所有数据都会丢失。为了持久化数据,我们需要使用 Docker 卷。
使用 Docker 卷
Docker 卷是持久化 Docker 容器生成和使用的数据的首选机制。
首先,停止并删除之前创建的容器:
bash
docker stop es-node01
docker rm es-node01
然后,使用 -v 标志创建一个新的容器,并将一个卷挂载到 Elasticsearch 的数据目录 (/usr/share/elasticsearch/data)。
bash
docker run --name es-node01 --net elastic -p 9200:9200 -it -m 1GB \
-v esdata01:/usr/share/elasticsearch/data \
-e "discovery.type=single-node" \
docker.elastic.co/elasticsearch/elasticsearch:8.12.2
* -v esdata01:/usr/share/elasticsearch/data:这将创建一个名为 esdata01 的 Docker 卷(如果它尚不存在),并将其挂载到容器内的 /usr/share/elasticsearch/data 路径。
现在,即使您停止并删除了 es-node01 容器,只要 esdata01 卷存在,您的数据就会被保留。当您下次使用相同的卷启动新容器时,数据将恢复。
第三部分:自定义配置
您可以通过多种方式来自定义 Elasticsearch 的配置。
1. 通过环境变量配置
对于一些简单的配置,可以直接使用 -e 或 --env 标志设置环境变量。
bash
docker run --name es-node01 --net elastic -p 9200:9200 -it -m 1GB \
-e "cluster.name=my-es-cluster" \
-e "node.name=my-node-1" \
-e "bootstrap.memory_lock=true" \
-e "discovery.type=single-node" \
-v esdata01:/usr/share/elasticsearch/data \
docker.elastic.co/elasticsearch/elasticsearch:8.12.2
2. 通过绑定配置文件配置
对于更复杂的配置,最佳实践是创建一个本地的 elasticsearch.yml 文件,并将其挂载到容器中。
-
在您的项目目录中创建一个
elasticsearch.yml文件:“`yaml
elasticsearch.yml
cluster.name: my-es-cluster
node.name: my-node-1
network.host: 0.0.0.0
“` -
使用绑定挂载(bind mount)来运行容器,将本地文件映射到容器内的配置文件路径:
bash
docker run --name es-node01 --net elastic -p 9200:9200 -it -m 1GB \
-v "$(pwd)/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml" \
-v "esdata01:/usr/share/elasticsearch/data" \
-e "discovery.type=single-node" \
docker.elastic.co/elasticsearch/elasticsearch:8.12.2
*-v "$(pwd)/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml":将当前目录下的elasticsearch.yml文件挂载到容器内正确的位置。
3. 配置 JVM 堆大小
JVM 堆大小是影响 Elasticsearch 性能的最重要设置。推荐的实践是将最小堆(Xms)和最大堆(Xmx)大小设置为相同的值,并且不超过物理 RAM 的 50%。
您可以通过 ES_JAVA_OPTS 环境变量来设置它:
bash
docker run --name es-node01 --net elastic -p 9200:9200 -it \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
-e "discovery.type=single-node" \
-v esdata01:/usr/share/elasticsearch/data \
docker.elastic.co/elasticsearch/elasticsearch:8.12.2
* -e "ES_JAVA_OPTS=-Xms512m -Xmx512m":将 JVM 堆大小设置为 512MB。
第四部分:使用 Docker Compose 部署多节点集群
当您需要一个具有高可用性的生产级环境时,就需要部署一个多节点集群。Docker Compose 是定义和运行多容器 Docker 应用程序的绝佳工具。
1. 创建 docker-compose.yml 文件
在您的项目根目录创建一个名为 docker-compose.yml 的文件,并添加以下内容。这个配置定义了一个包含两个 Elasticsearch 节点的服务。
“`yaml
version: ‘3.8’
services:
es01:
image: docker.elastic.co/elasticsearch/elasticsearch:8.12.2
container_name: es01
environment:
– node.name=es01
– cluster.name=es-docker-cluster
– discovery.seed_hosts=es02
– cluster.initial_master_nodes=es01,es02
– ES_JAVA_OPTS=-Xms512m -Xmx512m
– xpack.security.enabled=false # 仅用于开发环境
volumes:
– esdata01:/usr/share/elasticsearch/data
ports:
– 9200:9200
networks:
– elastic
es02:
image: docker.elastic.co/elasticsearch/elasticsearch:8.12.2
container_name: es02
environment:
– node.name=es02
– cluster.name=es-docker-cluster
– discovery.seed_hosts=es01
– cluster.initial_master_nodes=es01,es02
– ES_JAVA_OPTS=-Xms512m -Xmx512m
– xpack.security.enabled=false # 仅用于开发环境
volumes:
– esdata02:/usr/share/elasticsearch/data
networks:
– elastic
volumes:
esdata01:
driver: local
esdata02:
driver: local
networks:
elastic:
driver: bridge
``cluster.name
关键配置解释:
*: 两个节点必须具有相同的集群名称。discovery.seed_hosts
*: 列出集群中其他节点的地址以进行发现。由于我们在同一个 Docker 网络中,可以直接使用服务名 (es01,es02)。cluster.initial_master_nodes
*: 在首次启动集群时,指定哪些节点有资格成为主节点。xpack.security.enabled=false`: 警告:为了简化教程,这里禁用了安全功能。在生产环境中,您应该启用安全并妥善管理凭据。
*
2. 启动并管理集群
在包含 docker-compose.yml 文件的目录中,运行以下命令:
“`bash
以后台模式启动集群
docker-compose up -d
查看正在运行的服务
docker-compose ps
查看特定服务的日志
docker-compose logs es01
停止并删除服务、网络和卷
docker-compose down -v
“`
3. 验证多节点集群
等待一两分钟让集群完全启动,然后向任意一个节点发送请求来检查集群状态。
“`bash
检查集群健康状态
curl http://localhost:9200/_cluster/health?pretty
列出集群中的所有节点
curl http://localhost:9200/_cat/nodes?v
“`
如果一切顺利,您应该能看到 es01 和 es02 两个节点都已加入集群。
第五部分:集成 Kibana
Kibana 是一个用于 Elasticsearch 的数据可视化和探索工具。让我们将其添加到我们的 Docker Compose 栈中。
1. 更新 docker-compose.yml
编辑您的 docker-compose.yml 文件,在 services 部分添加 Kibana 服务:
“`yaml
… (es01 和 es02 服务保持不变) …
kibana:
image: docker.elastic.co/kibana/kibana:8.12.2
container_name: kibana
environment:
– ELASTICSEARCH_HOSTS=http://es01:9200 # 告知 Kibana 如何连接到 Elasticsearch
ports:
– 5601:5601
networks:
– elastic
depends_on: # 确保 Kibana 在 Elasticsearch 之后启动
– es01
– es02
“`
2. 访问 Kibana
保存文件后,重新启动您的 Docker Compose 应用:
bash
docker-compose up -d
现在,在您的浏览器中打开 http://localhost:5601。您将看到 Kibana 的欢迎界面。您可以从这里开始探索您的数据,或者使用 Dev Tools 控制台以图形化方式与 Elasticsearch API 交互。
第六部分:安全注意事项
如前所述,从 8.x 版本开始,Elasticsearch 默认启用安全功能。在我们的 Docker Compose 示例中,我们通过设置 xpack.security.enabled=false 禁用了它,这在开发环境中是可接受的。
在生产环境中,强烈建议您启用安全功能。 这通常涉及以下步骤:
1. 从第一个启动的 Elasticsearch 节点的日志中获取自动生成的密码。
2. 为 Kibana 和其他客户端生成并使用服务令牌。
3. 配置 TLS 以加密节点之间的通信。
这是一个更高级的主题,但了解其重要性至关重要。
结论
通过本教程,您学习了如何在 Docker 中从零开始部署和管理 Elasticsearch。我们涵盖了从运行单个节点、持久化数据、自定义配置,到使用 Docker Compose 构建一个包含 Kibana 的多节点集群。
Docker 为运行 Elastic Stack 提供了一个无与伦比的灵活、可移植和可扩展的环境。现在您已经掌握了基础知识,可以继续探索更高级的主题,例如使用 Logstash 进行数据摄取、设置监控和警报,以及为生产环境进行性能调优和安全加固。