搭建 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) 虚拟机管理。您可以通过以下步骤来检查或配置它:
- 打开 PowerShell 或命令提示符。
- 进入 WSL 2 虚拟机:
wsl -d docker-desktop(如果您的 WSL 2 实例名称不同,请替换)。 - 在 WSL 2 内部执行:
sudo sysctl -w vm.max_map_count=262144 - 为了永久化,您可能需要在 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: 定义了两个服务:elasticsearch和kibana。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依赖于elasticsearch。condition: 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 将会拉取所需的镜像(如果本地没有),然后创建并启动 elasticsearch 和 kibana 服务。这个过程可能需要一些时间,具体取决于您的网络速度。
您可以使用以下命令检查容器的运行状态:
bash
docker compose ps
您应该会看到 elasticsearch 和 kibana 容器都在运行中 (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.yml 和 kibana.yml 文件中配置相关参数,并使用 bin/elasticsearch-setup-passwords 工具设置密码。
7.2 性能调优
- 堆内存(Heap Size): 根据您的实际使用场景和宿主机资源,合理调整
ES_JAVA_OPTS中的堆内存大小。 - 存储: 使用高性能的 SSD 存储来存放 Elasticsearch 的数据卷,可以显著提升读写性能。
- 集群: 对于生产环境,通常需要部署多节点 Elasticsearch 集群以实现高可用性和水平扩展。这需要更复杂的 Docker Compose 配置,包括多节点发现、集群配置等。
7.3 持久化配置文件
除了数据卷,您还可以将 Elasticsearch 和 Kibana 的配置文件也持久化到宿主机。例如,您可以创建 config/elasticsearch.yml 和 config/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 提供了极大的便利。请记住,在生产环境中部署时,务必考虑安全性、高可用性和性能优化等因素。