2017-12-17 3 views
0

Ich habe zwei Spring-Web-Dienste, die über http kommunizieren sollten. Beide laufen auf meinem Rechner in dcoker containern über openjdk: 8-jre-alpine. Hier ist die POST-Abfrage, die mit fehlschlägt "Connection refused":Docker Container Kommunikation über http

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 ist http://localhost:8090/game Hier entspricht Steuerung anderer Service:

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

ich einfach bin mit beiden Behälter mit run -p 8080:8080 und ' 8090: 8090 '. Und wie ich schon sagte "Verbindung abgelehnt" Wie man Kommunikation richtig einrichten?
HINWEIS: es funktioniert gut, wenn ich es mit Intellij laufen lasse.

+1

haben einen Blick auf [diese SO Beitrag] (https://stackoverflow.com/questions/19897743/exposing-a-port-on-a-live-docker-container) – DevDio

Antwort

0

Die default Docker bridge network bietet keine direkte Kommunikation zwischen Containern ohne "Links". Links sind veraltet und es wird empfohlen, user defined network zu verwenden.

erstellen user defined network für die Behälter und Zugriff auf alle Dienste über den Namen des Containers

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 

Dann können Sie dann den anderen Behälter ping oder zu einem Netzwerkdienst verbinden

# 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 

der gleichen Die Definition kann auch mit Compose erfolgen, die die Netzwerk- und Servicenamen für Sie basierend auf yaml config konfiguriert.

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

ich das gesehen habe , aber immer noch, welche URL sollte ich verwenden, um http-Abfrage innerhalb auszuführen? – asap

+0

'http: // zuerst: 8080 /' oder 'http: // Sekunde: 8090 /' – Matt

Verwandte Themen