У меня два микросервиса SpringBoot: M1 (порт 2002) и M2 (порт 2004)
M1 и M2 успешно обмениваются данными, если я запускаю их с помощью eclipse (запускается как Java Project или SpringBoot Project).
Однако я хочу общаться с ними с помощью Docker container.
Поэтому я создаю образы для Microservices (M1 и M2), используя команду:
docker build -f Dockerfile -t image_name .
И запустите изображения, используя:
docker run -p 2004:2004 image_name
Примечание: я выставляю тот же порт из докера, как определено выше.
Но M1 и M2 не могут обмениваться данными.
Я использую RestTemplate
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<Boolean> isUp = restTemplate.getForEntity("http://localhost:2002/apis/test",Boolean.class);
Я получаю исключение ниже:
I/O error on GET request for \"http://localhost:2002/apis/test\": Connection refused (Connection refused); nested exception is java.net.ConnectException: Connection refused (Connection refused)
Однако, если я вызываю другой микросервис, используя свой IP машины, он успешно обменивается данными.
ResponseEntity<Boolean> isUp = restTemplate.getForEntity("http://XX.XX.XX.XXX:2002/apis/test",Boolean.class);
Может ли кто-нибудь сказать, пишу ли я (используя IP-адрес) или есть еще один хороший подход для вызова одного микросервиса из другого с помощью Docker?
@ Бен нет, не могли бы вы добавить это в качестве ответа. А чем я заменяю host?
Поскольку это скорее предложение, а не прямой ответ, комментарий здесь просто прекрасен. И вы уверены, что это не поможет? Потому что в этот момент localhost должен на 100% ссылаться на хост-машину. Ссылка на вопрос это, в принятом ответе очень подробно объясняются вещи.
Хотя ответ Бена, вероятно, сработает, это может быть не лучший вариант. Вы должны сначала прочитать документ docs.docker.com/network
@JinnaBalu Вопрос в том, как работать с Using docker, я знаю, что могу использовать Feign, заменяя RestTemplate. Но это не решает проблему с использованием Docker container.
Эти контейнеры находятся в одной сети? В таком случае они будут общаться с Feign Rest Client. Evn, если они не находятся в одной сети, если IP-адреса и порты открыты между сетью, это будет работать.
Вас также может заинтересовать Docker Compose: docs.docker.com/compose




Попытка связаться с другим контейнером не будет работать с localhost.
Вы должны создать настраиваемую мостовую сеть, которая позволит вам обращаться к контейнерам по имени. И нет необходимости публиковать порты, если вы разговариваете только внутренне.
# create network
docker network create -d bridge mynet
# container 1
docker container run --network mynet --name container1 -d image_name
# container 2
docker container run --network mynet --name container2 -d some_other_image_name
Затем IP-адрес в фрагменте кода можно заменить именем другого контейнера.
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<Boolean> isUp = restTemplate.getForEntity("http://container2:2002/apis/test",Boolean.class)
Кроме того, вы также можете связать два контейнера вместе с помощью --link. Предполагая, что вы хотите, чтобы container1 был клиентом для container2, вы можете использовать ниже:
sudo docker run --link container2 --name=container1 -d image_name
Вы пробовали использовать
--net=host(параметр для запуска докера)? Это должно решить проблему, заключающуюся в том, что localhost ссылается на внутренний IP-адрес контейнера, а не на IP-адрес машины.