You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Docker容器连接故障:应用容器无法连接ElasticSearch-5.5.3容器

解决Docker业务容器与ElasticSearch-5.5.3容器连接被拒绝的问题

这种容器间通信失败的情况很常见,我来给你梳理几个最可能的解决方向,按优先级推荐:

1. 优先使用Docker自定义网络实现容器间通信

你现在用的是端口映射到宿主机的方式,但容器间直接通过Docker内部网络通信才是更可靠、更符合Docker设计的方案。步骤如下:

  • 先创建一个自定义的Docker网络:
    docker network create app-es-network
    
  • 启动ElasticSearch容器时,加入这个网络并指定容器名(方便后续访问):
    docker run -i --name es-instance --network app-es-network -p 9200:9200 elasticsearch:5.5.3
    
  • 启动你的业务应用容器时,同样加入这个网络:
    docker run -i --name app-instance --network app-es-network -p 9000:9000 [你的应用镜像名]
    
  • 最后修改业务应用里的ElasticSearch连接地址为 http://es-instance:9200 —— 因为在同一个自定义网络里,容器可以直接通过容器名互相访问,不需要走宿主机的端口映射。

2. 如果坚持用宿主机端口映射,需要排查这些点

如果你一定要通过宿主机的9200端口连接,得确认以下几个问题:

  • ElasticSearch配置是否允许外部访问:ES 5.x默认只绑定127.0.0.1,这会导致容器外(包括其他容器)无法访问。你需要修改ES容器内的elasticsearch.yml配置:
    • 添加或修改 network.host: 0.0.0.0
    • 添加 discovery.type: single-node(5.x版本如果不设置单节点模式,会因为无法发现集群节点而启动失败)
      可以通过挂载配置文件的方式修改,比如启动命令改成:
    docker run -i -p 9200:9200 -v /宿主机路径/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml elasticsearch:5.5.3
    
  • 容器内访问宿主机的地址是否正确:容器里的127.0.0.1是容器自己的回环地址,不是宿主机的。你需要用宿主机的实际IP,或者Docker提供的host.docker.internal(Docker 18.03+版本支持,Linux可能需要加上--add-host host.docker.internal:host-gateway参数启动容器)。比如应用里的连接地址改成http://host.docker.internal:9200
  • 宿主机防火墙是否开放9200端口:检查宿主机的防火墙(比如ufw、iptables),确保9200端口允许容器访问。

3. 先确认ElasticSearch容器本身是否正常运行

不管用哪种方式,先确保ES容器已经正常启动并监听9200端口:

  • 查看ES容器日志:docker logs es-instance,看有没有启动失败的报错。
  • 在宿主机上测试:curl http://localhost:9200,如果能返回类似下面的JSON,说明ES服务没问题:
    {
      "name" : "some-node-name",
      "cluster_name" : "elasticsearch",
      "cluster_uuid" : "...",
      "version" : { ... },
      "tagline" : "You Know, for Search"
    }
    

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

火山引擎 最新活动