搭建 Elasticsearch Docker 环境:详细教程 – wiki大全


搭建 Elasticsearch Docker 环境:详细教程

Elasticsearch 是一个基于 Lucene 的开源、分布式、RESTful 搜索与分析引擎,广泛应用于日志分析、实时搜索、大数据处理等场景。使用 Docker 部署 Elasticsearch 及其生态系统(如 Kibana、Logstash)是当前非常流行且高效的方式。

本教程将详细介绍如何使用 Docker Compose 搭建一个包含 Elasticsearch 和 Kibana 的环境。

1. 前提条件

在开始之前,请确保您的系统已安装以下软件:

  • Docker: Docker Engine 和 Docker CLI。
  • Docker Compose: Docker Compose V2 (现在通常集成在 Docker Desktop 中)。

您可以通过运行以下命令来检查它们的版本:

bash
docker --version
docker compose version

2. 规划与配置

2.1 内存限制

Elasticsearch 是一个内存密集型应用。为了确保其稳定运行,我们需要在 Docker 容器中为 Elasticsearch 分配足够的内存。同时,宿主机也需要有足够的空闲内存。

重要提示:
Elasticsearch 默认使用 JVM,并建议将堆内存(heap size)设置为物理内存的一半,但不超过 32GB。出于安全和性能考虑,宿主机的 vm.max_map_count 参数必须设置得足够大,否则 Elasticsearch 将无法启动。

2.2 宿主机配置 (Linux/macOS)

在 Linux 或 macOS 系统上,您需要在宿主机上执行以下命令以永久设置 vm.max_map_count

对于 Linux:

bash
sudo sysctl -w vm.max_map_count=262144

为了使此设置在系统重启后仍然有效,请将其添加到 /etc/sysctl.conf 文件中:

bash
echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf

对于 macOS (Docker Desktop):

在 Docker Desktop for Mac 中,您通常不需要手动配置 vm.max_map_count,因为 Docker 虚拟化层会处理这些。如果遇到问题,可以尝试进入 Docker Desktop 的设置,搜索 “Advanced” 部分,并确保 “Memory” 和 “Swap” 分配足够。

2.3 宿主机配置 (Windows)

在 Windows 系统上使用 Docker Desktop,vm.max_map_count 的配置通常由 Docker Desktop 内部的 WSL 2 (Windows Subsystem for Linux 2) 虚拟机管理。您可以通过以下步骤来检查或配置它:

  1. 打开 PowerShell 或命令提示符。
  2. 进入 WSL 2 虚拟机:wsl -d docker-desktop (如果您的 WSL 2 实例名称不同,请替换)。
  3. 在 WSL 2 内部执行:sudo sysctl -w vm.max_map_count=262144
  4. 为了永久化,您可能需要在 WSL 2 的启动脚本中添加此配置,或者在 Docker Desktop 的 settings.json 中配置 WSL 2 虚拟机的参数。一个更简单的做法是确保 Docker Desktop 的内存分配充足。

3. 创建 Docker Compose 文件

我们将创建一个 docker-compose.yml 文件来定义 Elasticsearch 和 Kibana 服务。

创建一个新目录,例如 elasticsearch-docker,并在其中创建 docker-compose.yml 文件:

bash
mkdir elasticsearch-docker
cd elasticsearch-docker
touch docker-compose.yml

编辑 docker-compose.yml 文件,并添加以下内容:

“`yaml
version: ‘3.8’

services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.12.0
container_name: elasticsearch
environment:
– discovery.type=single-node
– xpack.security.enabled=false # 禁用安全功能,仅用于开发测试环境
– “ES_JAVA_OPTS=-Xms1g -Xmx1g” # 分配 1GB 堆内存,根据您的宿主机资源调整
ulimits:
memlock:
soft: -1
hard: -1
volumes:
– elasticsearch-data:/usr/share/elasticsearch/data
ports:
– “9200:9200”
– “9300:9300”
networks:
– elastic-network
healthcheck:
test: [“CMD-SHELL”, “curl -f http://localhost:9200 || exit 1”]
interval: 10s
timeout: 10s
retries: 5

kibana:
image: docker.elastic.co/kibana/kibana:8.12.0
container_name: kibana
environment:
– ELASTICSEARCH_HOSTS=http://elasticsearch:9200
ports:
– “5601:5601”
networks:
– elastic-network
depends_on:
elasticsearch:
condition: service_healthy # 确保 Elasticsearch 启动并健康后才启动 Kibana

volumes:
elasticsearch-data:
driver: local

networks:
elastic-network:
driver: bridge
“`

配置说明:

  • version: '3.8': Docker Compose 文件格式版本。
  • services: 定义了两个服务:elasticsearchkibana
  • elasticsearch 服务:
    • image: 指定 Elasticsearch 镜像及其版本。请确保 Elasticsearch 和 Kibana 的版本保持一致,以避免兼容性问题。
    • container_name: 容器的名称。
    • environment:
      • discovery.type=single-node: 将 Elasticsearch 配置为单节点模式,适用于开发测试环境。
      • xpack.security.enabled=false: 重要! 禁用 Elasticsearch 的安全功能(如用户认证、SSL/TLS)。仅在开发或测试环境中使用此设置。生产环境中应启用并正确配置安全功能。
      • "ES_JAVA_OPTS=-Xms1g -Xmx1g": 设置 JVM 堆内存的初始大小和最大大小。这里设置为 1GB。请根据您的宿主机可用内存进行调整。 确保它不超过宿主机物理内存的一半,并且小于 32GB。
    • ulimits: 增加了内存锁定限制,以防止 JVM 交换到磁盘,提高性能。
    • volumes:
      • elasticsearch-data:/usr/share/elasticsearch/data: 将宿主机上名为 elasticsearch-data 的 Docker 卷挂载到容器内的 /usr/share/elasticsearch/data 目录,用于持久化 Elasticsearch 的数据。这样即使容器被删除,数据也不会丢失。
    • ports: 映射宿主机端口到容器端口:
      • 9200:9200: Elasticsearch 的 REST API 端口。
      • 9300:9300: Elasticsearch 的节点间通信端口。
    • networks: 将 Elasticsearch 容器连接到 elastic-network
    • healthcheck: 定义了健康检查,Docker Compose 会等待 Elasticsearch 容器通过健康检查后才认为其已启动。
  • kibana 服务:
    • image: 指定 Kibana 镜像及其版本,与 Elasticsearch 保持一致。
    • container_name: 容器的名称。
    • environment:
      • ELASTICSEARCH_HOSTS=http://elasticsearch:9200: Kibana 连接 Elasticsearch 的地址。elasticsearch 是 Docker Compose 网络中的服务名称,可以直接解析。
    • ports: 映射宿主机 5601 端口到容器 5601 端口,用于访问 Kibana Web 界面。
    • networks: 将 Kibana 容器连接到 elastic-network
    • depends_on: kibana 依赖于 elasticsearchcondition: service_healthy 确保 Kibana 仅在 Elasticsearch 容器被标记为健康后才启动,这有助于避免 Kibana 启动时连接不到 Elasticsearch 的问题。
  • volumes: 定义了 Docker 卷 elasticsearch-data,由 Docker 管理其存储。
  • networks: 定义了一个名为 elastic-network 的自定义桥接网络,用于服务间的通信。

4. 启动 Docker 环境

docker-compose.yml 文件所在的目录中,打开终端或命令提示符,执行以下命令:

bash
docker compose up -d

  • -d 参数表示在后台运行容器。

Docker Compose 将会拉取所需的镜像(如果本地没有),然后创建并启动 elasticsearchkibana 服务。这个过程可能需要一些时间,具体取决于您的网络速度。

您可以使用以下命令检查容器的运行状态:

bash
docker compose ps

您应该会看到 elasticsearchkibana 容器都在运行中 (Up)。

5. 验证安装

5.1 验证 Elasticsearch

等待几分钟,直到 Elasticsearch 完全启动并变得健康。

打开浏览器或使用 curl 命令访问 Elasticsearch 的 REST API:

bash
curl http://localhost:9200

您应该会看到类似以下的 JSON 响应,其中包含 Elasticsearch 的版本信息和集群状态:

json
{
"name" : "elasticsearch",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "...",
"version" : {
"number" : "8.12.0",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "...",
"build_date" : "2024-02-12T13:46:09.141380922Z",
"build_snapshot" : false,
"lucene_version" : "9.9.2",
"minimum_wire_compatibility_version" : "7.17.0",
"minimum_index_compatibility_version" : "7.0.0"
},
"tagline" : "You Know, for Search"
}

5.2 验证 Kibana

打开您的 Web 浏览器,访问 http://localhost:5601

如果一切顺利,您应该能看到 Kibana 的登录页面或主界面。在我们的配置中,由于禁用了安全功能,Kibana 可能会直接进入主页,或者提示您创建第一个索引模式。

6. 停止与删除环境

6.1 停止容器

如果您想停止服务但保留数据,可以在 docker-compose.yml 文件所在的目录执行:

bash
docker compose stop

这将停止所有容器,但不会删除它们及其关联的卷。

6.2 启动已停止的容器

要重新启动已停止的容器,再次运行:

bash
docker compose start

6.3 删除容器和网络

要删除容器和网络,同时保留数据卷(elasticsearch-data),执行:

bash
docker compose down

6.4 彻底删除所有内容(包括数据)

如果要彻底删除所有容器、网络和数据卷,执行:

bash
docker compose down -v

警告: -v 参数会删除 elasticsearch-data 卷,这意味着您所有的 Elasticsearch 数据都将丢失!请谨慎使用。

7. 进一步配置与优化

7.1 安全性 (生产环境)

本教程为了简化,禁用了 Elasticsearch 的安全功能。在生产环境中,强烈建议启用并配置 X-Pack 安全功能,包括:

  • 用户认证与授权: 创建用户、角色,并为不同用户分配不同的权限。
  • SSL/TLS 加密: 为 Elasticsearch 和 Kibana 之间的通信以及客户端与服务端的通信启用加密。
  • IP 过滤: 限制只有特定 IP 地址可以访问 Elasticsearch。

您可以参考 Elasticsearch 官方文档了解如何配置 X-Pack Security。通常,这涉及到在 elasticsearch.ymlkibana.yml 文件中配置相关参数,并使用 bin/elasticsearch-setup-passwords 工具设置密码。

7.2 性能调优

  • 堆内存(Heap Size): 根据您的实际使用场景和宿主机资源,合理调整 ES_JAVA_OPTS 中的堆内存大小。
  • 存储: 使用高性能的 SSD 存储来存放 Elasticsearch 的数据卷,可以显著提升读写性能。
  • 集群: 对于生产环境,通常需要部署多节点 Elasticsearch 集群以实现高可用性和水平扩展。这需要更复杂的 Docker Compose 配置,包括多节点发现、集群配置等。

7.3 持久化配置文件

除了数据卷,您还可以将 Elasticsearch 和 Kibana 的配置文件也持久化到宿主机。例如,您可以创建 config/elasticsearch.ymlconfig/kibana.yml,然后将其挂载到容器中:

“`yaml

elasticsearch:
# …
volumes:
– elasticsearch-data:/usr/share/elasticsearch/data
– ./config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml # 挂载配置文件
# …

kibana:
# …
volumes:
– ./config/kibana.yml:/usr/share/kibana/config/kibana.yml # 挂载配置文件
# …
“`

这将允许您在宿主机上直接修改配置文件,而无需重新构建镜像。

8. 总结

通过本教程,您已经成功地使用 Docker Compose 搭建了一个包含 Elasticsearch 和 Kibana 的环境。这为您进行本地开发、测试和学习 Elasticsearch 提供了极大的便利。请记住,在生产环境中部署时,务必考虑安全性、高可用性和性能优化等因素。


滚动至顶部