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
из вашего веб-контейнера. Для получения дополнительной информации смотрите эту статью .