Docker: java.net.ConnectException: соединение отклонено - приложение, работающее на порту 8083, не может получить доступ к другому приложению на порту 3000 - PullRequest
0 голосов
/ 14 февраля 2019

Мне нужно использовать внешний API отдыха (используя restTemplate.exchange) с Spring Boot.My rest API работает на порте 8083 с URL http://localhost:8083/myrest (команда Docker: docker run -p 8083:8083 myrest-app)

Внешний API доступен в виде общедоступного образа Docker, и после выполнения команды ниже, я могупотяните и запустите его локально.

 docker pull dockerExternalId/external-rest-api docker
    run -d -p 3000:3000 dockerExternalId/external-rest-api

a) Если я введу URL-адрес внешнего API для отдыха, например, http://localhost:3000/externalrestapi/testresource непосредственно в Chrome, то получу действительные данные JSON.

б) Если я вызову его с помощью моего самого приложения из eclipse (Spring Boot Application), я получу действительный ответ JSON.(Я использую платформу Windows, чтобы проверить это)

c) Но если я запустил его на Docker и запустил myrest service (скажем, http://localhost:8083/myrest),, то я столкнулся с java.net.ConnectException: Connection refused

Подробнее:

org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://localhost:3000/externalrestapi/testresource": Connection refused (Connection refused); nested exception is java.net.ConnectException: Connection refused (Connection refused)

PS - я использую Docker в Windows.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Из вашего myrest-app контейнера, если вы попытаетесь получить доступ к http://localhost:3000/externalrestapi/testresource, он попытается получить доступ к 3000 порту того же myrest-app container.

Поскольку каждый контейнер является отдельной работающей операционной системой и имеет собственный сетевой интерфейс, файловую систему и т. Д.

Docker is all about Isolation.

Существует 3 способа, с помощью которыхВы можете получить доступ к API из другого контейнера.

  1. Вместо localhost укажите IP-адрес внешнего хост-компьютера (т. е. IP-адрес вашего компьютера, на котором работает докер)
  2. Создайте сеть докеров и присоедините эти два контейнера.Затем вы можете указать container_name вместо localhost.
  3. Использование - ссылка при запуске контейнера (устарело)
0 голосов
/ 14 февраля 2019

# Проблема

Вы запускаете с:

docker run -p 8083:8083 myrest-app

Но вам нужно бежать как:

docker run --network "host" --name "app" myrest-app

Таким образом, передавая флаг --network со значением host позволит вам использовать контейнер для доступа к вашей компьютерной сети.

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

Лучшая альтернатива

Создайте сеть для использования обоими контейнерами:

docker network create external-api

Затем запустите оба контейнера с флагом --network external-api.

docker run --network "external-api" --name "app" -p 8083:8083 myrest-app

и

docker run -d --network "external-api" --name "api" -p 3000:3000 dockerExternalId/external-rest-api

Использование флага -p для публикации портов для контейнера api необходимо только в том случае, если вы хотите получить к нему доступ из браузера компьютеров, в противном случае просто не указывайте их, посколькуони не нужны для связи двух контейнеров в сети external-api.

TIP : извлечение Docker не требуется, при запуске Docker попытается извлечь образ, еслине нашел его в вашем компьютере.Дайте мне знать, как все прошло ...

Вызов внешнего API

Итак, в обоих решениях я добавил флаг --name, чтобы мы могли добраться до другого контейнера всеть.

Таким образом, чтобы получить доступ к внешнему API из моего приложения отдыха, вам нужно использовать URL http://api:3000/externalrestapi/testresource.

Обратите внимание, как я заменил localhost на api, который соответствует значениюдля --name флаг команды docker run для вашего внешнего API.

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