Docker容器通过http进行通信

我有两个应该通过http进行通信的Spring web服务。 他们都在我的机器上运行openjdk上的dcoker容器:8-al-alpine。 这是POST查询失败,“连接被拒绝”:

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这里是其他服务的相应控制器:

 @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); } 

我只是用run -p 8080:8080和'8090:8090'来运行这两个容器。 正如我之前所说的“拒绝连接”如何正确设置通信?
注意:如果我用Intellij运行,它工作正常。

默认的Docker桥接networking不提供没有“链接”的容器之间的直接通信。 链接已被弃用,build议使用用户定义的networking 。

为容器创build用户定义的networking ,并通过容器的名称访问每个服务

 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 

然后,您可以ping其他容器或连接到networking服务

 # 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 

同样的定义也可以用Compose来完成,它根据yaml config为你configurationnetworking和服务名称。

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