Django + ElasticSearch + Docker - таймаут соединения независимо от того, какое имя хоста я использую

У меня проблемы с подключением к моему контейнеру 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,
)

traceback

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)'))

По умолчанию Docker Compose использует сеть bridge для обеспечения межконтейнерного взаимодействия. Вы можете прочитать больше об этой сети в 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

Теперь вы можете подключаться с помощью elasticsearch:9200 вместо 172.18.0.10 из вашего веб-контейнера. Для получения дополнительной информации смотрите эту статью .

Вернуться на верх