Получение ошибки подключения при запуске эластичного поиска с помощью docker в проекте django

Я недавно изучаю docker. Я хочу запустить elasticsearch с помощью docker. Все работает нормально, когда я только добавляю код для запуска эластичного поиска в файл docker-compose.yml. Но я получаю Connection error caused by: ConnectionError(Connection error caused by: NewConnectionError, когда обновляю файл docker-compose.yml, чтобы запустить сервер, базу данных postgresql и эластичный поиск.

Вот полный журнал ошибок, когда я пытаюсь использовать функцию поиска в своем проекте. ConnectionError at / Connection error caused by: ConnectionError(Connection error caused by: NewConnectionError(<urllib3.connection.HTTPConnection object at 0x7f4935a81fa0>: Failed to establish a new connection: [Errno 111] Connection refused))

Ниже приведен код для файла dockerfile и docker-compose.yml.

Dockerfile

FROM python:3.8-slim-buster
ENV PYTHONUNBUFFERED=1
WORKDIR /code
COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt
COPY . /code/

docker-compose.yml

version: '3'

services:
  db:
    image: postgres:13
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: myproject
      POSTGRES_USER: myprojectuser
      POSTGRES_PASSWORD: password

  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db
      - es
    environment:
      - DATABASE_URL=postgres://myprojectuser:password@db:5432/myproject

  es:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.14.0
    environment:
      - discovery.type=single-node
    ports:
      - "9200:9200"
    volumes:
      - es_data:/usr/share/elasticsearch/data

volumes:
  postgres_data:
  es_data:

settings.py

ELASTICSEARCH_DSL = {
    'default': {
        'hosts': 'http://localhost:9200'
    }
}

Может ли кто-нибудь помочь мне исправить эту ошибку?

Я пробовал запускать только контейнер эластичного поиска, он работает нормально. Но когда я обновляю файл docker-compose.yml, чтобы запустить сервер django, pg db и elastic search, я получаю проблему.

По умолчанию elasticsearch прослушивает только localhost, что в вашей докерной установке означает, что он не будет доступен за пределами докерного контейнера. Поэтому вам нужно добавить

    environment:
      - discovery.type=single-node
      - network.host=0.0.0.0

Это должно сделать Elasticsearch доступным на http://es:9200/, если я правильно понял вашу конфигурацию, то это должно быть:

settings.py

ELASTICSEARCH_DSL = {
    'default': {
        'hosts': 'http://es:9200'
    }
}
Вернуться на верх