Ошибка Elasticsearch: не удалось подключиться к локальному порту 9200: подключение отклонено

Я пытаюсь создать образ Docker с установленным Elasticsearch. Я знаю, что у Elasticsearch уже есть собственный образ Docker, но мне нужно использовать ту же среду AWS Lambda Function с установленным Python 3.6.5. Поэтому мне пришлось расширить образ AWS Docker и установить службу Elasticsearch.

Здесь вы можете найти мой Dockerfile:

FROM lambci/lambda-base:build

ENV PATH=/var/lang/bin:$PATH \
    LD_LIBRARY_PATH=/var/lang/lib:$LD_LIBRARY_PATH \
    AWS_EXECUTION_ENV=AWS_Lambda_python3.6 \
    PYTHONPATH=/var/runtime \
    PKG_CONFIG_PATH=/var/lang/lib/pkgconfig:/usr/lib64/pkgconfig:/usr/share/pkgconfig

RUN rm -rf /var/runtime /var/lang && \
  curl https://lambci.s3.amazonaws.com/fs/python3.6.tgz | tar -xz -C / && \
  sed -i '/^prefix=/c\prefix=/var/lang' /var/lang/lib/pkgconfig/python-3.6.pc && \
  curl https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tar.xz | tar -xJ && \
  cd Python-3.6.8 && \
  LIBS="$LIBS -lutil -lrt" ./configure --prefix=/var/lang && \
  make -j$(getconf _NPROCESSORS_ONLN) libinstall libainstall inclinstall && \
  cd .. && \
  rm -rf Python-3.6.8

EXPOSE 9200 9300

# Add these as a separate layer as they get updated frequently
RUN pip install -U pip setuptools --no-cache-dir && \
    pip install -U virtualenv pipenv --no-cache-dir && \
    pip install -U awscli boto3 aws-sam-cli==0.10.0 aws-lambda-builders==0.1.0 --no-cache-dir && \
    yum install wget -y && \
    echo "vm.max_map_count=262144" >> /etc/sysctl.conf && \
    # I try to install elasticsearch manually
    wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.6.1.rpm && \
    rpm --install elasticsearch-6.6.1.rpm && \
    service elasticsearch start && \
    chkconfig --add elasticsearch && \
    sed -i -e "s/#network.host: 192.168.0.1/network.host: 127.0.0.1/g" /etc/elasticsearch/elasticsearch.yml && \
    sed -i -e "s/#http.port: 9200/http.port: 9200/g" /etc/elasticsearch/elasticsearch.yml && \
    sed -i -e "s/# Elasticsearch performs poorly when the system is swapping the memory./network.bind_host: 127.0.0.1\nnetwork.publish_host: localhost/g" /etc/elasticsearch/elasticsearch.yml

RUN service elasticsearch start && \
    service elasticsearch status && \
    service elasticsearch status

Когда я создаю образ, образ создается правильно, и служба elasticsearch работает. Я вижу журнал: elasticsearch (pid 87) is running.... Проблема в том, что я не могу сделать вызов API для http://localhost:9200, потому что он говорит: Failed to connect to localhost port 9200: Connection refused

Мне нужно использовать службу elasticsearch внутри контейнера, а не снаружи. Что я делаю не так?


person chicco.caste21    schedule 07.03.2019    source источник
comment
Вы не можете запускать фоновые службы в Dockerfile (они не сохраняются в образе). Типичное использование service в Docker не работает по нескольким причинам, и вам следует запустить службу напрямую. (Попробуйте другую команду RUN service elasticsearch status и посмотрите, что она скажет.)   -  person David Maze    schedule 07.03.2019
comment
Также параметр bind_host: 127.0.0.1 является гарантией того, что сервис будет недоступен снаружи контейнера. Обычно вам нужен 0.0.0.0 в Docker.   -  person David Maze    schedule 07.03.2019
comment
@DavidMaze ты прав. Если я запускаю другую команду RUN service elasticsearch status, я получаю elasticsearch dead but pid file exists. Как я могу запустить службу напрямую? Мне не нужно использовать службу вне контейнера, но мне нужно использовать службу elasticsearch внутри контейнера.   -  person chicco.caste21    schedule 08.03.2019
comment
@DavidMaze Я также добавил команду CMD elasticsearch start && bash в конец Dockerfile, но ошибка та же.   -  person chicco.caste21    schedule 08.03.2019


Ответы (2)


Вы не указываете, как вы на самом деле запускаете контейнер докеров. Просто открыть порт в файле докера недостаточно. Вы также должны работать с опцией -p. Например:

docker run -p 9200:9200 <image name here>

См. https://docs.docker.com/engine/reference/commandline/run/ для получения подробной информации.

person Andrew White    schedule 07.03.2019
comment
К сожалению, я не могу решить, как запустить контейнер докера, потому что я использую этот образ в AWS CodeBuild. В этом сервисе вы можете только выбрать образ, который будет использоваться, а затем он запускается автоматически. - person chicco.caste21; 08.03.2019

Что вы хотите сделать, так это использовать внутренний IP-адрес вашего приложения. Вот как вы это понимаете

dokku elasticsearch:info <Your elasticsearch container name here>

Теперь вы можете сделать

curl http://172.75.0.7:9200

Предполагая, что ваш внутренний IP-адрес 172.75.0.7

person AMANi    schedule 13.05.2019
comment
Да, я хочу использовать внутренний IP-адрес своего приложения. Я обнаружил, что это проблема AWS CodeBuild. В этой службе вы не можете использовать слово localhost и внутренний IP-адрес, потому что есть сетевое ограничение. (это ответ от архитектора решений AWS). Единственное, что мне нужно было сделать, это создать новый контейнер Docker с установленным сервисом Elasticsearch и открыть порт. Теперь я могу выполнять вызовы API из своего контейнера Docker в Elasticsearch Docker. - person chicco.caste21; 21.05.2019