web-dev-qa-db-ja.com

Dockerイメージを使用して別のマイクロサービスから1つのマイクロサービスを呼び出す方法

2つのSpringBootマイクロサービスM1(ポート2002)とM2(ポート2004)があります

M1M2は、Eclipse(Java ProjectまたはSpringBootProjectとして実行)として実行)を使用して実行すると、正常に通信しています。

ただし、Docker containerを使用して通信したいと思います。

したがって、次のコマンドを使用して、MicroservicesM1M2)の両方のイメージを作成します。

docker build -f Dockerfile -t image_name .

そして、以下を使用してイメージを実行します。

docker run -p 2004:2004 image_name

注:上記で定義したものと同じポートをDockerから公開しています

しかし、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を使用して別のマイクロサービスから別のマイクロサービスを呼び出す別の良いアプローチがあるのか​​を誰かに教えてもらえますか?

5
Mehraj Malik

他のコンテナと通信しようとしても、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)
6
chris

または、--linkで2つのコンテナをリンクすることもできます。 container1をcontainer2のクライアントとして使用する場合は、以下を使用できます。

Sudo docker run --link container2 --name=container1 -d image_name
2
piy26