2つのSpringBoot
マイクロサービスM1
(ポート2002)とM2
(ポート2004)があります
M1
とM2
は、Eclipse
(Java ProjectまたはSpringBootProjectとして実行)として実行)を使用して実行すると、正常に通信しています。
ただし、Docker container
を使用して通信したいと思います。
したがって、次のコマンドを使用して、Microservices
(M1
とM2
)の両方のイメージを作成します。
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を使用して別のマイクロサービスから別のマイクロサービスを呼び出す別の良いアプローチがあるのかを誰かに教えてもらえますか?
他のコンテナと通信しようとしても、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
で2つのコンテナをリンクすることもできます。 container1をcontainer2のクライアントとして使用する場合は、以下を使用できます。
Sudo docker run --link container2 --name=container1 -d image_name