在 Docker 中使用 elasticsearch:无法建立新连接
Using elasticsearch inside Docker: Failed to establish a new connection
我目前正在尝试容器化一个应用程序,其中包括使用 Elasticsearch 写入数据库,但遇到连接问题。 docker-compose.yml
文件目前看起来像这样:
version: "3"
services:
es:
image: docker.elastic.co/elasticsearch/elasticsearch:7.5.1
container_name: es
environment:
- node.name=es
- cluster.name=es-docker-cluster
- cluster.initial_master_nodes=es
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
ports:
- 9200:9200
volumes:
- esdata:/usr/share/elasticsearch/data
networks:
- dash-network
dash:
build: .
depends_on:
- es
ports:
- 5000:5000
volumes:
- .:/usr/src/dash
networks:
- dash-network
volumes:
esdata:
driver: local
networks:
dash-network:
driver: bridge
我的 Python 代码包括以下内容:
import elasticsearch
es = elasticsearch.Elasticsearch([{'host': 'es', 'port': 9200}])
es.index(index="spam", body={'eggs': 11})
当我运行docker-compose up
的时候,那段代码的最后一行出现如下错误:
esmqtt_1 | elasticsearch.exceptions.ConnectionError: ConnectionError(<urllib3.connection.HTTPConnection object at 0x7f2f60b53dd0>: Failed to establish a new connection: [Errno 111] Connection refused) caused by: NewConnectionError(<urllib3.connection.HTTPConnection object at 0x7f2f60b53dd0>: Failed to establish a new connection: [Errno 111] Connection refused)
作为实验,我暂停了脚本很长时间,然后 运行 这段代码,shell 进入容器,运行 这三个命令中的每一个顺序。有效:
elliot@elliot-VirtualBox:~/path/to/dash$ sudo docker exec -it dash_dash_1 sh
# python
Python 3.7.6 (default, Jan 3 2020, 23:24:26)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import elasticsearch
>>> es = elasticsearch.Elasticsearch([{'host': 'es', 'port': 9200}])
>>> es.index(index="spam", body={'eggs': 11})
{'_index': 'spam', '_type': '_doc', '_id': '3Ey5zm8B7hzXos4SVZsF', '_version': 1, 'result': 'created', '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 0, '_primary_term': 1}
我不知道为什么我的代码在 Dockerfile 运行 时失败,但是当我 shell 时,它可以工作。为什么前一个连接失败,后一个连接成功?欢迎所有提示或建议!
它尝试同时 运行 不同的容器,导致 dash
容器在 Elasticsearch 完成设置之前尝试连接。我现在使用以下循环来检查它是否已准备好,然后再继续。
while True:
try:
es.search(index="")
break
except (
elasticsearch.exceptions.ConnectionError,
elasticsearch.exceptions.TransportError
):
time.sleep(1)
我目前正在尝试容器化一个应用程序,其中包括使用 Elasticsearch 写入数据库,但遇到连接问题。 docker-compose.yml
文件目前看起来像这样:
version: "3"
services:
es:
image: docker.elastic.co/elasticsearch/elasticsearch:7.5.1
container_name: es
environment:
- node.name=es
- cluster.name=es-docker-cluster
- cluster.initial_master_nodes=es
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
ports:
- 9200:9200
volumes:
- esdata:/usr/share/elasticsearch/data
networks:
- dash-network
dash:
build: .
depends_on:
- es
ports:
- 5000:5000
volumes:
- .:/usr/src/dash
networks:
- dash-network
volumes:
esdata:
driver: local
networks:
dash-network:
driver: bridge
我的 Python 代码包括以下内容:
import elasticsearch
es = elasticsearch.Elasticsearch([{'host': 'es', 'port': 9200}])
es.index(index="spam", body={'eggs': 11})
当我运行docker-compose up
的时候,那段代码的最后一行出现如下错误:
esmqtt_1 | elasticsearch.exceptions.ConnectionError: ConnectionError(<urllib3.connection.HTTPConnection object at 0x7f2f60b53dd0>: Failed to establish a new connection: [Errno 111] Connection refused) caused by: NewConnectionError(<urllib3.connection.HTTPConnection object at 0x7f2f60b53dd0>: Failed to establish a new connection: [Errno 111] Connection refused)
作为实验,我暂停了脚本很长时间,然后 运行 这段代码,shell 进入容器,运行 这三个命令中的每一个顺序。有效:
elliot@elliot-VirtualBox:~/path/to/dash$ sudo docker exec -it dash_dash_1 sh
# python
Python 3.7.6 (default, Jan 3 2020, 23:24:26)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import elasticsearch
>>> es = elasticsearch.Elasticsearch([{'host': 'es', 'port': 9200}])
>>> es.index(index="spam", body={'eggs': 11})
{'_index': 'spam', '_type': '_doc', '_id': '3Ey5zm8B7hzXos4SVZsF', '_version': 1, 'result': 'created', '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 0, '_primary_term': 1}
我不知道为什么我的代码在 Dockerfile 运行 时失败,但是当我 shell 时,它可以工作。为什么前一个连接失败,后一个连接成功?欢迎所有提示或建议!
它尝试同时 运行 不同的容器,导致 dash
容器在 Elasticsearch 完成设置之前尝试连接。我现在使用以下循环来检查它是否已准备好,然后再继续。
while True:
try:
es.search(index="")
break
except (
elasticsearch.exceptions.ConnectionError,
elasticsearch.exceptions.TransportError
):
time.sleep(1)