You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Docker部署跨多主机的Elasticsearch集群并实现节点互通

跨主机部署ES Docker集群解决方案

前置准备

  • 3台主机IP分别记为:主机A(es01):192.168.1.10、主机B(es02):192.168.1.11、主机C(es03):192.168.1.12
  • 三台主机之间互相放开9200(ES HTTP服务端口)、9300(ES节点内部通信端口)的入站/出站规则
  • 所有主机安装相同版本的Docker、Docker Compose

方案1:主机网络模式(轻量场景首选,无需Docker集群配置)

原来的单机配置用的是本地bridge网络,只能在单主机内通信,改用主机网络后容器直接复用主机IP和端口,不需要额外网络配置,是跨主机部署最简单的实现方式。
你需要把原来的docker-compose拆分为3个独立的配置文件,分别部署到3台主机上:

主机A(运行es01)的docker-compose.yaml

version: '2.2'
services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.15.0
    container_name: es01
    environment:
      - node.name=es01
      - cluster.name=es-docker-cluster
      # 这里填另外两台主机的IP
      - discovery.seed_hosts=192.168.1.11,192.168.1.12
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      # 绑定所有网卡,同时对外公布当前主机IP供其他节点发现
      - network.host=0.0.0.0
      - network.publish_host=192.168.1.10
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data01:/usr/share/elasticsearch/data
    # 主机网络模式不需要单独映射端口
    network_mode: host

volumes:
  data01:
    driver: local

主机B(运行es02)的docker-compose.yaml

version: '2.2'
services:
  es02:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.15.0
    container_name: es02
    environment:
      - node.name=es02
      - cluster.name=es-docker-cluster
      # 填另外两台主机的IP
      - discovery.seed_hosts=192.168.1.10,192.168.1.12
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - network.host=0.0.0.0
      - network.publish_host=192.168.1.11
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data02:/usr/share/elasticsearch/data
    network_mode: host

volumes:
  data02:
    driver: local

主机C(运行es03)的docker-compose.yaml

version: '2.2'
services:
  es03:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.15.0
    container_name: es03
    environment:
      - node.name=es03
      - cluster.name=es-docker-cluster
      # 填另外两台主机的IP
      - discovery.seed_hosts=192.168.1.10,192.168.1.11
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - network.host=0.0.0.0
      - network.publish_host=192.168.1.12
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data03:/usr/share/elasticsearch/data
    network_mode: host

volumes:
  data03:
    driver: local

启动后执行curl http://192.168.1.10:9200/_cat/nodes即可看到3个节点均正常加入集群。

方案2:Docker Swarm Overlay网络(适合容器编排场景)

如果需要统一管理多主机容器,可以用Docker Swarm的跨主机overlay网络实现:

  1. 在主机A执行docker swarm init,按提示在另外两台主机执行命令加入Swarm集群
  2. 手动创建跨主机可访问的overlay网络:docker network create -d overlay --attachable elastic-overlay
  3. 修改原来的docker-compose.yaml,增加部署约束将每个ES节点调度到不同主机,discovery.seed_hosts仍可直接填节点服务名(overlay网络支持跨主机服务名解析),网络改为创建好的elastic-overlay即可。

注意事项

  • 集群第一次启动完成后,可删除cluster.initial_master_nodes配置,避免后续节点重启时出现选主冲突
  • 不要跨主机挂载ES数据卷,ES原生的副本机制已经能保障数据可靠性,跨主机挂载会带来额外的性能损耗和故障风险
  • 生产环境建议将ES_JAVA_OPTS调整为物理机内存的一半,最大不要超过31G

内容的提问来源于stack exchange,提问作者minglyu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 21:18:04