簡體   English   中英

無法從 docker 容器連接到本地 elasticsearch 進程

[英]Not able to connect to local elasticsearch process from docker container

編輯

我認為正在發生的事情是 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。

解決方案是在 ES 主機設置中使用host.docker.internal

我只是使用了es_client = Elasticsearch(host=_es_host, where es_host = host.docker.internal並確保在本地時使用 http 而不是 https。

Elasticsearch 運行在您主機上的9200端口,並且想要訪問 elasticsearch 的應用程序正在容器內運行。

docker 容器默認運行在橋接網絡模式下,其中主機和容器網絡是不同的。 因此容器內的 localhost 與主機上的不同。

在這里你可以做兩件事:

  • 在您的應用程序代碼中嘗試使用private/public-ip:9200訪問 elasticsearch

或者

  • 主機網絡模式下運行 docker 容器,以便容器內的 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選項將告訴--net=host容器使用主機網絡模式。

您可以使用 -p option docker 命令將主機端口綁定到 docker 端口。 因此,在您下面的 docker 命令中,您可以再添加一行以將主機 9200 端口綁定到 docker 9200 端口。 注意我添加了-p 9200:9200並且在這個文檔的第 3 點中很好地解釋了同樣的內容

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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM