2017-12-17 8 views
0

私は2つのSpring Webサービスを持っており、httpで通信する必要があります。どちらも私のマシン上でopenjdk:8-jre-alpine上のdcokerコンテナで実行されています。ここで「接続が拒否した」で失敗POSTクエリされる:「私は単にrun -p 8080:8080で両容器を実行しているドッカーコンテナの通信はhttp:

@RequestMapping(
     path = "create", 
     method = RequestMethod.POST, 
     consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) 
@ResponseStatus(HttpStatus.OK) 
public ResponseEntity<Long> create(@RequestParam("playerCount") int playerCount) { 
    long gameId = gameService.create(playerCount); 
    HttpHeaders headers = new HttpHeaders(); 
    headers.add("Access-Control-Allow-Origin", "*"); 
    return new ResponseEntity<>(gameId, headers, HttpStatus.OK); 
} 

と:

public String createPost(int playerCount) { 
    String uri = URI + "/create"; 
    UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(uri) 
      .queryParam("playerCount", playerCount); 
    HttpEntity<?> entity = new HttpEntity<>(headers); 
    ResponseEntity<String> response = rest.exchange(
      builder.build().encode().toUri(), 
      HttpMethod.POST, 
      entity, 
      String.class); 
    logger.info("Create request"); 
    return response.getBody(); 
} 

URIがここhttp://localhost:8090/game では、他のサービスのコントローラーに対応しています8090:8090 '。そして、私が以前に言ったように、「接続が拒否されました」。通信を正しく設定する方法は?
注: Intellijで実行すると正常に動作します。

+1

私はこれを見てきました[このSOポスト](https://stackoverflow.com/questions/19897743/exposing-a-port-on-a-live-docker-container) – DevDio

答えて

0

default Docker bridge networkは、「リンク」なしのコンテナ間の直接通信を行いません。リンクは推奨されておらず、user defined networkを使用することをおすすめします。

次にあなたが同じことを他の容器にpingを実行またはネットワーク・サービス

# First to second 
docker exec first ping second 
docker exec first nc second 8090 

# Second to first 
docker exec second ping first 
docker exec second nc first 8080 

に接続することができ、容器のためのuser defined networkを作成し、コンテナ

docker network create spring 
docker run --detach --network=spring --name first -p 8080:8080 busybox \ 
    nc -llp 8080 0.0.0.0 -e echo first 
docker run --detach --network=spring --name second -p 8090:8090 busybox \ 
    nc -llp 8090 0.0.0.0 -e echo second 

の名前を経由して、各サービスにアクセスしますyaml configに基づいてネットワーク名とサービス名を設定するComposeで定義することもできます。

version: "2.1" 
services: 
    first: 
    image: first 
    ports: 
     - '8080:8080' 
    second: 
    image: second 
     - '8090:8090' 
+0

を見て、でも、内部でhttpクエリを実行するためにどのURLを使用すべきですか? – asap

+0

http:// first:8080/'または' http:// second:8090/' – Matt

関連する問題