Доступ к docker портам из контейнера внутри другого контейнера на локальном хосте - PullRequest
1 голос
/ 15 января 2020

У меня есть установка, в которой я собираю 2 докера с docker -compose.

1 контейнер - это веб-приложение. Я могу получить к нему доступ через порт 8080. Другой контейнер - ElasticSearch; он доступен через порт 9200.

Это содержимое моего docker-compose.yml файла:

version: '3'
services:
  serverapplication:
    build: "serverapplication"
    entrypoint:
      - bash
      - -x
      - init.sh
    command: ["jdbcUrl=${jdbcUrl} dbUser=${dbUser} dbUserPassword=${dbUserPassword}"]
    ports:
      - "8080:8080"
      - "8443:8443"
      - "8787:8787"
  elasticsearch:
    build: "elasticsearch"
    environment:
      - discovery.type=single-node
    ports:
      - "9200:9200"
      - "9300:9300"

При просмотре http://localhost: 8080 / serverapplication Я вижу свое серверное приложение. Когда я перехожу к http://localhost: 9200 / , я вижу страницу по умолчанию ElasticSearch.

Но когда я пытаюсь получить доступ к ElasticSearch изнутри сервоприложения, я получаю «отказано в соединении» , Кажется, что порт 9200 недоступен на локальном хосте для серверного приложения.

Как я могу это исправить?

Ответы [ 2 ]

1 голос
/ 15 января 2020

Никогда не безопасно использовать localhost, поскольку localhost означает что-то еще для вашей хост-системы, дляasticsearch и для вашего серверного приложения. Вы можете получить доступ к контейнерам только с локального хоста вашего хоста, потому что вы отображаете порты контейнеров на порты вашего хоста.

  1. поместите их в одну сеть
  2. , чтобы контейнеры name
  3. доступ кasticsearch через его имя контейнера, которое Docker автоматически разрешает текущий IP-адрес вашего контейнераasticsearch.

Код:

version: '3'
services:
  serverapplication:
    container_name: serverapplication
    build: "serverapplication"
    entrypoint:
      - bash
      - -x
      - init.sh
    command: ["jdbcUrl=${jdbcUrl} dbUser=${dbUser} dbUserPassword=${dbUserPassword}"]
    ports:
      - "8080:8080"
      - "8443:8443"
      - "8787:8787"
    networks:
      - my-network

  elasticsearch:
    container_name: elasticsearch
    build: "elasticsearch"
    environment:
      - discovery.type=single-node
    ports:
      - "9200:9200"
      - "9300:9300"
    networks:
      - my-network

networks:
  my-network:
    driver: bridge
0 голосов
/ 15 января 2020

Ваше серверное приложение должно использовать имя хоста elasticsearch для доступа к службеasticsearch, т. Е., http://elasticsearch:9200

Ваше сервоприложение и эластичный поиск работают в разных контейнерах. localhost из serverapplication отличается от localhost из elasticsearch.

docker-compose устанавливает сеть между контейнерами так, чтобы к ним можно было получить доступ с помощью имен их служб. Итак, из вашего serverapplication вы должны использовать имя «asticsearch »для подключения к нему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...