Django + ElasticSearch + Docker - 无论我使用啥主机名,连接超时

Posted

技术标签:

【中文标题】Django + ElasticSearch + Docker - 无论我使用啥主机名,连接超时【英文标题】:Django + ElasticSearch + Docker - Connection Timeout no matter what hostname I useDjango + ElasticSearch + Docker - 无论我使用什么主机名,连接超时 【发布时间】:2022-01-06 06:23:51 【问题描述】:

从第一天起,我就遇到了连接 Elasticsearch 容器的问题。 首先我使用elasticsearch作为主机名,然后我尝试了容器名称web_elasticsearch_1,最后我为容器设置了一个静态IP地址并将其传递到我的配置文件中。

PYPI 包:

django==3.2.9 elasticsearch==7.15.1 elasticsearch-dsl==7.4.0

docker-compose.yml

version: "3.3"

services:

  web:
    build:
      context: .
      dockerfile: local/Dockerfile
    image: project32439/python
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    env_file:
      - local/python.env
    depends_on:
      - elasticsearch

  elasticsearch:
    image: elasticsearch:7.10.1
    environment:
      - xpack.security.enabled=false
      - discovery.type=single-node
    networks:
      default:
        ipv4_address: 172.18.0.10

settings.py

# Elasticsearch
ELASTICSEARCH_HOST = "172.18.0.10"
ELASTICSEARCH_PORT = 9200

service.py

from django.conf import settings
from elasticsearch import Elasticsearch, RequestsHttpConnection

es = Elasticsearch(
    hosts=["host": settings.ELASTICSEARCH_HOST, "port": settings.ELASTICSEARCH_PORT],
    use_ssl=False,
    verify_certs=False,
    connection_class=RequestsHttpConnection,
)

追溯

HTTPConnectionPool(host='172.18.0.10', port=9200): Max retries exceeded with url: / (Caused by ConnectTimeoutError(<urllib3.connection.HTTPConnection object at 0x7f1973ebd6d0>, 'Connection to 172.18.0.10 timed out. (connect timeout=5)'))

【问题讨论】:

使用服务名作为主机应该可以elasticsearch,也许你需要暴露端口? 在 docker-compose 中?我试试,谢谢 【参考方案1】:

默认情况下,Docker Compose 使用桥接网络来提供容器间通信。您可以在 Debian Wiki 上阅读有关此网络的更多信息。

对你来说重要的是,默认情况下 Docker Compose 会创建一个与 docker-compose.yml 文件中的服务名称相同的主机名。所以更新你的文件:

version: "3.3"
services:

  web:
    build:
      context: .
      dockerfile: local/Dockerfile
    image: project32439/python
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    env_file:
      - local/python.env
    depends_on:
      - elasticsearch

  elasticsearch:
    image: elasticsearch:7.10.1
    environment:
      - xpack.security.enabled=false
      - discovery.type=single-node

现在您可以从您的 Web 容器连接到 elasticsearch:9200 而不是 172.18.0.10。有关更多信息,请参阅article。

【讨论】:

以上是关于Django + ElasticSearch + Docker - 无论我使用啥主机名,连接超时的主要内容,如果未能解决你的问题,请参考以下文章

Django + Elasticsearch——搜索精彩的TED演讲

Django + ElasticSearch + Docker - 无论我使用啥主机名,连接超时

第15篇-使用Django进行ElasticSearch的简单方法

django使用haystack来调用Elasticsearch搜索引擎

Graphene Django 查询 Elasticsearch

使用 Django 和 Elasticsearch 索引新对象