Получение ошибки подключения при запуске эластичного поиска с помощью 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'
}
}