无法从Docker容器连接到本地Elasticsearch进程

时间:2019-07-17 16:01:38

标签: python docker elasticsearch

编辑

我认为这是在docker进程内的localhost引用了容器自己的localhost,而不是我系统的localhost。那么如何确保当运行容器的应用程序尝试连接到容器的localhost:9200时,它实际上连接到系统的localhost:9200?

当我访问localhost:9200时,我的ES应用程序似乎正在运行。在chrome中看起来像这样:

{
  "name" : "H1YDvcg",
  "cluster_name" : "elasticsearch_jwan",
  "cluster_uuid" : "aAorzRYTQPOI0j_OgMGKpA",
  "version" : {
    "number" : "6.8.1",
    "build_flavor" : "oss",
    "build_type" : "tar",
    "build_hash" : "1fad4e1",
    "build_date" : "2019-06-18T13:16:52.517138Z",
    "build_snapshot" : false,
    "lucene_version" : "7.7.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

我正在终端窗口中运行ES,并且在运行命令elasticsearch之后它可以工作。

我正在使用以下命令运行docker容器:

docker run -e DATALOADER_QUEUE='<some aws SQS queue name'\
             -e ES_HOST='localhost'\
             -e ES_PORT='9200'\
             -e AWS_ACCESS_KEY_ID='<somekey>'\
             -e AWS_SECRET_ACCESS_KEY='<somekey>'\
             -e AWS_DEFAULT_REGION='us-west-2'\
             <application name>

我得到这个错误:

requests.exceptions.ConnectionError: HTTPConnectionPool(host='localhost', port=9200): Max retries exceeded with url: /person/_search (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f36e4189c90>

有人知道发生了什么吗?我不明白为什么即使ti似乎在localhost:9200上运行它也无法连接到ES。

3 个答案:

答案 0 :(得分:1)

您可以使用-p选项docker命令将主机端口绑定到docker端口。因此,在下面的docker命令中,您可以再添加一行以将主机9200端口绑定到docker 9200端口。请注意,我已经添加了-p 9200:9200,并且在第3点this文档中很好地解释了这一点

docker run -p 9200:9200 -e DATALOADER_QUEUE='<some aws SQS queue name'\
             -e ES_HOST='localhost'\
             -e ES_PORT='9200'\
             -e AWS_ACCESS_KEY_ID='<somekey>'\
             -e AWS_SECRET_ACCESS_KEY='<somekey>'\
             -e AWS_DEFAULT_REGION='us-west-2'\
             <application name>

答案 1 :(得分:1)

Elasticsearch在主机上的端口9200上运行,而要访问elasticsearch的应用程序在容器内运行。

默认情况下,Docker容器以bridge网络模式运行,在这种模式下,主机和容器网络不同。因此,容器内的localhost与主机上的localhost不同。

在这里您可以做两件事:

  • 在您的应用程序代码中,尝试使用private/public-ip:9200
  • 访问elasticsearch

OR

  • host网络模式运行docker容器,以使容器内的localhost与主机上的localhost相同。因为在这种模式下,容器使用主机网络。
docker run -e DATALOADER_QUEUE='<some aws SQS queue name'\
             -e ES_HOST='localhost'\
             -e ES_PORT='9200'\
             -e AWS_ACCESS_KEY_ID='<somekey>'\
             -e AWS_SECRET_ACCESS_KEY='<somekey>'\
             -e AWS_DEFAULT_REGION='us-west-2'\
             --net=host \
             <application name>

注意:--net=host选项将告诉Docker容器使用主机联网模式。

答案 2 :(得分:0)

解决方案是在ES主机设置中使用host.docker.internal

我只使用了es_client = Elasticsearch(host=_es_host,,其中es_host = host.docker.internal,并确保在本地而不是https时使用http。