使用 Docker 部署 Elasticsearch 教程
引言
Elasticsearch 是一个功能强大的开源分布式搜索和分析引擎,能够处理不断增长的用例。作为 Elastic Stack 的核心,它集中存储您的数据,以实现闪电般的快速搜索、精细调整的相关性和强大的分析功能。
Docker 是一个利用操作系统级虚拟化技术交付软件的平台,它将软件打包成称为容器的独立单元。容器彼此隔离,并捆绑自己的软件、库和配置文件;它们可以通过明确定义的通道相互通信。
使用 Docker 部署 Elasticsearch 具有多项优势:
* 可移植性: 在不同环境(开发、测试、生产)中一致地运行 Elasticsearch。
* 隔离性: 容器将 Elasticsearch 与主机系统上的其他应用程序隔离。
* 易于设置: 快速启动和关闭 Elasticsearch 实例,便于开发和测试。
本教程将指导您如何使用 Docker 部署 Elasticsearch,我们将介绍使用 docker run 的基本单节点设置,以及使用 Docker Compose 部署包含 Kibana 的更健壮设置。
先决条件
在开始之前,请确保您已安装以下软件并进行相应配置:
- Docker Desktop: 包含 Docker Engine 和 Docker Compose。请从官方 Docker 网站下载并安装适用于您操作系统的版本。
- 内存分配: 确保为 Docker Desktop 分配至少 4GB 内存。您可以在 Docker Desktop 设置中通过
Settings > Resources进行调整。 vm.max_map_count设置: Elasticsearch 在 Linux 主机上需要特定的内核设置。如果您在 Linux(或 Windows 上的 WSL2)上运行 Docker,需要增加vm.max_map_count的值。- 临时设置(重启后失效):
bash
sudo sysctl -w vm.max_map_count=262144 - 永久设置(跨重启):
将vm.max_map_count=262144添加到/etc/sysctl.conf文件中,然后运行sudo sysctl -p使其生效。
- 临时设置(重启后失效):
基本单节点 Elasticsearch 部署 (使用 docker run)
此方法适用于快速测试和开发环境。
-
创建 Docker 网络:
为您的服务创建一个专用的 Docker 网络是一个好习惯,这允许它们通过名称进行通信。
bash
docker network create elastic -
拉取 Elasticsearch Docker 镜像:
我们将使用8.12.2版本以保持一致性。您可以根据需要选择其他版本。
bash
docker pull docker.elastic.co/elasticsearch/elasticsearch:8.12.2 -
运行 Elasticsearch 容器:
此命令启动一个单节点的 Elasticsearch 实例。
bash
docker run --name es01 --net elastic -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e "xpack.security.enabled=false" \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
-m 1GB \
docker.elastic.co/elasticsearch/elasticsearch:8.12.2--name es01: 为容器指定名称。--net elastic: 将容器连接到elastic网络。-p 9200:9200 -p 9300:9300: 将 Elasticsearch 的 HTTP API 端口 (9200) 和节点间通信端口 (9300) 从容器映射到您的主机。-e "discovery.type=single-node": 将 Elasticsearch 配置为单节点集群,这对于开发设置是必需的。-e "xpack.security.enabled=false": 禁用安全功能以方便本地测试。 不建议在生产环境中使用此设置。-e "ES_JAVA_OPTS=-Xms512m -Xmx512m": 为 Elasticsearch 设置 Java 虚拟机 (JVM) 堆大小。根据您的可用内存调整这些值。-m 1GB: 为 Docker 容器设置内存限制。
-
验证 Elasticsearch 是否正在运行:
打开一个新的终端并运行:
bash
curl localhost:9200
您应该会收到一个 JSON 响应,其中包含有关您的 Elasticsearch 节点的信息。 -
停止并移除容器:
要停止正在运行的容器(在运行容器的终端中按Ctrl+C,或在另一个终端中使用docker stop):
bash
docker stop es01
docker rm es01
Elasticsearch 和 Kibana 部署 (使用 Docker Compose)
Docker Compose 是定义和运行多容器 Docker 应用程序的理想工具。此设置将同时包含 Elasticsearch 和 Kibana,后者是用于 Elasticsearch 的数据可视化和管理工具。
-
创建项目目录:
bash
mkdir elastic-stack-tutorial
cd elastic-stack-tutorial -
创建
.env文件:
此文件将存储环境变量,包括 Elasticsearch 版本和elastic用户的密码。请将your_strong_password_here替换为安全的密码。
dotenv
# .env
STACK_VERSION=8.12.2
ELASTIC_PASSWORD=your_strong_password_here -
创建
docker-compose.yml文件:
此文件定义了 Elasticsearch 和 Kibana 服务、它们的配置以及它们如何交互。
“`yaml
# docker-compose.yml
version: ‘3.8’services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
container_name: elasticsearch
environment:
– discovery.type=single-node
– xpack.security.enabled=true # 启用安全
– ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
– ES_JAVA_OPTS=-Xms1g -Xmx1g # 分配 1GB 堆内存
ulimits:
memlock:
soft: -1
hard: -1
nofile:
soft: 65536
hard: 65536
volumes:
– elasticsearch-data:/usr/share/elasticsearch/data
ports:
– “9200:9200”
– “9300:9300”
networks:
– elastic-net
healthcheck:
test: [“CMD-SHELL”, “curl -s –cacert /usr/share/elasticsearch/config/certs/http_ca.crt -u elastic:${ELASTIC_PASSWORD} https://localhost:9200/_cluster/health | grep -q ‘\”status\”:\”green\”‘”]
interval: 10s
timeout: 10s
retries: 120kibana:
image: docker.elastic.co/kibana/kibana:${STACK_VERSION}
container_name: kibana
environment:
– ELASTICSEARCH_HOSTS=https://elasticsearch:9200
– ELASTICSEARCH_USERNAME=kibana_system
– ELASTICSEARCH_PASSWORD=${ELASTIC_PASSWORD} # 为简化教程,使用 elastic 密码
– KIBANA_SYSTEM_PASSWORD=${ELASTIC_PASSWORD} # 用于 Kibana 内部用户
ports:
– “5601:5601”
networks:
– elastic-net
depends_on:
elasticsearch:
condition: service_healthy
healthcheck:
test: [“CMD-SHELL”, “curl -s http://localhost:5601/api/status | grep -q ‘\”overall\”:{\”state\”:\”green\”}'”]
interval: 10s
timeout: 10s
retries: 120volumes:
elasticsearch-data:
driver: localnetworks:
elastic-net:
driver: bridge
``elasticsearch
* **服务:**image
*: 使用STACK_VERSION中指定的 Elasticsearch Docker 镜像。environment
*:discovery.type=single-node
*: 用于单节点集群。xpack.security.enabled=true
*: 启用安全功能,这是最新 Elasticsearch 版本的默认设置。这需要身份验证。ELASTIC_PASSWORD
*: 设置内置elastic超级用户的密码。ES_JAVA_OPTS
*: 设置 JVM 堆大小。ulimits
*: 配置容器的资源限制,这对于 Elasticsearch 的稳定性至关重要。volumes
*:elasticsearch-data是一个命名的 Docker 卷,即使容器被移除,也能持久化 Elasticsearch 数据。ports
*: 将容器端口映射到主机端口。networks
*: 连接到elastic-net网络。healthcheck
*: 确保 Elasticsearch 在 Kibana 尝试连接之前完全启动并健康。kibana
* **服务:**image
*: 使用与 Elasticsearch 版本匹配的 Kibana Docker 镜像。environment
*:ELASTICSEARCH_HOSTS
*: 指定 Kibana 连接 Elasticsearch 的 URL。请注意,由于启用了安全功能,此处使用https。ELASTICSEARCH_USERNAME
*、ELASTICSEARCH_PASSWORD、KIBANA_SYSTEM_PASSWORD: Kibana 用于与 Elasticsearch 进行身份验证的凭据。ports
*: 将 Kibana 的 Web 界面端口 (5601) 映射到主机。networks
*: 连接到elastic-net网络。depends_on
*: 确保 Elasticsearch 健康后 Kibana 才启动。healthcheck
*: 确保 Kibana 完全启动并健康。volumes
* **和networks` 部分:** 定义用于数据持久化的命名卷和用于服务间通信的自定义网络。 -
启动 Elastic Stack:
在终端中导航到您的elastic-stack-tutorial目录,并运行:
bash
docker compose up -d
此命令将下载必要的镜像,创建卷和网络,并在分离模式下启动 Elasticsearch 和 Kibana。 -
访问 Kibana:
一旦服务运行(可能需要几分钟才能变得健康),打开您的 Web 浏览器并导航到http://localhost:5601。
系统将提示您登录。使用用户名elastic和您在.env文件中设置的ELASTIC_PASSWORD。 -
停止并移除 Stack:
要停止服务:
bash
docker compose down
要停止并移除容器、网络和卷(这将删除您的 Elasticsearch 数据):
bash
docker compose down -v
重要注意事项
- 数据持久性: 始终使用 Docker 卷(如 Docker Compose 示例中所示)来存储 Elasticsearch 数据。如果没有卷,当容器被移除时,您的数据将会丢失。
- 内存分配: Elasticsearch 是内存密集型应用。请确保您的 Docker Desktop 分配了足够的内存,并相应地配置
ES_JAVA_OPTS。vm.max_map_count设置对于性能和稳定性至关重要。 - 安全性: 对于生产环境,
xpack.security.enabled=true是必不可少的。您还应该配置 TLS/SSL,使用强密码,并考虑更高级的安全功能。docker run示例中使用的xpack.security.enabled=false设置仅用于快速本地开发。 - 生产部署: 本教程中描述的单节点设置不适用于生产环境。生产级 Elasticsearch 集群需要多个节点(专用主节点、数据节点和摄入节点)、强大的监控、备份和高级安全配置。
- 版本兼容性: 始终确保您的 Elasticsearch 和 Kibana 版本兼容。在
.env文件中使用相同的STACK_VERSION有助于保持这种兼容性。