用 Docker Compose 快速启动 3 节点 Elasticsearch 集群需统一 cluster.name、正确配置 discovery.seed_hosts 和 cluster.initial_master_nodes、启用 bootstrap.memory_lock 与合理 JVM 堆大小,并设置 xpack.security.enabled=true 及 ELASTIC_PASSWORD;启动后通过 curl 验证节点状态和集群健康度。

用 Docker Compose 快速启动多节点 Elasticsearch 集群是开发和测试环境的高效做法。关键在于正确配置 discovery、网络、JVM 和资源限制,避免脑裂和启动失败。
基础 compose 文件结构(3 节点示例)
以下是一个最小可用的 docker-compose.yml,启动 3 个 ES 节点(es01、es02、es03),共用同一自定义桥接网络:
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=es01,es02,es03
- cluster.initial_master_nodes=es01,es02,es03
- xpack.security.enabled=true
- ELASTIC_PASSWORD=changeme
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- es01_data:/usr/share/elasticsearch/data
ports:
- 9200:9200
networks:
- elastic
<p>es02:
image: docker.elastic.co/elasticsearch/elasticsearch:8.12.2
container_name: es02
environment:</p><ul><li>node.name=es02</li><li>cluster.name=es-docker-cluster</li><li>discovery.seed_hosts=es01,es02,es03</li><li>cluster.initial_master_nodes=es01,es02,es03</li><li>xpack.security.enabled=true</li><li>bootstrap.memory_lock=true</li><li>"ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:</li><li>es02_data:/usr/share/elasticsearch/data
networks:</li><li>elastic</li></ul><p>es03:
image: docker.elastic.co/elasticsearch/elasticsearch:8.12.2
container_name: es03
environment:</p><ul><li>node.name=es03</li><li>cluster.name=es-docker-cluster</li><li>discovery.seed_hosts=es01,es02,es03</li><li>cluster.initial_master_nodes=es01,es02,es03</li><li>xpack.security.enabled=true</li><li>bootstrap.memory_lock=true</li><li>"ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:</li><li>es03_data:/usr/share/elasticsearch/data
networks:</li><li>elastic</li></ul><p>volumes:
es01_data:
es02_data:
es03_data:</p><p>networks:
elastic:
driver: bridge
必须设置的关键配置项
- cluster.name:所有节点必须一致,否则无法加入同一集群
- discovery.seed_hosts:列出所有候选 master 节点主机名(即 service 名),用于初始发现
- cluster.initial_master_nodes:首次启动时参与 master 选举的节点列表(仅首次有效,后续重启可删)
- bootstrap.memory_lock=true + ulimits.memlock:禁用 swap,防止 JVM 内存被交换,ES 强制要求
- ES_JAVA_OPTS:显式设堆大小(建议 ≤ 宿主机内存 50%,且不超过 4GB),避免默认值过大导致启动失败
-
xpack.security.enabled=true:8.x 默认启用安全特性,需设
ELASTIC_PASSWORD,否则会生成随机密码并输出到日志
快速验证集群状态
启动后执行:
docker-compose up -d # 等待约 30 秒(各节点初始化+证书生成+安全配置) curl -u "elastic:changeme" https://localhost:9200/_cat/nodes?v&h=ip,name,role,master,heap.percent --insecure curl -u "elastic:changeme" https://localhost:9200/_cluster/health?pretty --insecure
正常应看到 3 行节点,master 列有一个 *,status 为 green。
常见问题与绕过技巧
-
“max virtual memory areas vm.max_map_count [65530] is too low”:在宿主机运行
sudo sysctl -w vm.max_map_count=262144,并写入/etc/sysctl.conf -
节点反复重启或卡在 “waiting for initial cluster formation”:检查
discovery.seed_hosts是否拼写错误、容器是否在同一网络、DNS 解析是否通(docker exec es01 ping es02) -
想跳过 HTTPS 和证书(仅测试):加环境变量
- xpack.security.http.ssl.enabled=false,并去掉--insecure参数;但 8.x 不推荐关闭 TLS -
需要 Kibana?:在 compose 中追加
kibanaservice,配置ELASTICSEARCH_HOSTS=["https://es01:9200"],并挂载相同网络,同时设ELASTICSEARCH_USERNAME/PASSWORD


















