Mastering Elasticsearch in Docker: A Comprehensive Tutorial – wiki基地


精通 Docker 中的 Elasticsearch:一篇详尽的教程

Elasticsearch 是一个功能强大的开源、分布式、RESTful 风格的搜索和数据分析引擎。Docker 是一个领先的容器化平台,它允许开发者将应用及其依赖打包到一个可移植的容器中。将这两者结合使用,可以极大地简化 Elasticsearch 集群的部署、管理和扩展过程。

本教程将引导您完成从运行单个 Elasticsearch 节点到使用 Docker Compose 部署多节点集群并集成 Kibana 的全过程。

目录

  1. 先决条件
  2. 第一部分:运行单节点 Elasticsearch
    • 拉取 Elasticsearch 镜像
    • 启动容器
    • 验证安装
  3. 第二部分:数据持久化
    • 使用 Docker 卷
  4. 第三部分:自定义配置
    • 通过环境变量配置
    • 通过绑定配置文件配置
    • 配置 JVM 堆大小
  5. 第四部分:使用 Docker Compose 部署多节点集群
    • 创建 docker-compose.yml 文件
    • 启动并管理集群
    • 验证多节点集群
  6. 第五部分:集成 Kibana
    • 更新 docker-compose.yml
    • 访问 Kibana
  7. 第六部分:安全注意事项
    • 禁用安全功能(仅限开发环境)
  8. 结论

先决条件

在开始之前,请确保您的系统已安装并运行 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.typesingle-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 文件,并将其挂载到容器中。

  1. 在您的项目目录中创建一个 elasticsearch.yml 文件:

    “`yaml

    elasticsearch.yml

    cluster.name: my-es-cluster
    node.name: my-node-1
    network.host: 0.0.0.0
    “`

  2. 使用绑定挂载(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
“`

如果一切顺利,您应该能看到 es01es02 两个节点都已加入集群。

第五部分:集成 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 进行数据摄取、设置监控和警报,以及为生产环境进行性能调优和安全加固。

滚动至顶部