Impossible d'accéder au point de terminaison REST dans le conteneur Docker à partir d'un autre conteneur Docker

aurelius

J'ai 2 microservices, chacun déployé dans son propre conteneur docker. J'utilise docker compose afin de les déployer et rendre microservice1 conscient de microservice2. Chacun est construit dans son propre projet maven.

Les deux microservices sont déployés avec succès, les conteneurs docker sont créés et démarrés et je peux accéder à chaque point de terminaison racine de base.

Le problème est qu'à partir de microservice1, je souhaite accéder à la racine / à l'URL distante de la racine de base à partir de microservice2. Cela ne fonctionne pas et j'obtiens 404 lorsque l'appel atteint le client REST qui fait l'appel get à microservice2 qui est dans la remote()méthode ci-dessous, voir gras, voir stacktrace ci-dessous.

microservice1 expose 2 points de terminaison REST:

  1. à la racine du chemin pour obtenir la demande;
  2. at / remote pour obtenir la demande.

@RequestMapping("/") public String home() { System.out.println("Hello Docker World " + 1); return "Hello Docker World " + 1; }

@GetMapping("/remote") public String remote() { RestTemplate restTemplate = new RestTemplate(); return restTemplate.getForObject("http://localhost:8080/maven-app2/", String.class); }

microservice2 expose 1 point de terminaison REST:

  1. à la racine du chemin pour obtenir la demande:

@GetMapping("/") public String home() { System.out.println("Hello Docker World " + 2); return "Hello Docker World " + 2; }

Dockerfile pour microservice1

   FROM openjdk:8-jdk-alpine
   VOLUME /tmp
   ARG DEPENDENCY=target/dependency
   COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib
   COPY ${DEPENDENCY}/META-INF /app/META-INF
   COPY ${DEPENDENCY}/BOOT-INF/classes /app
   ENTRYPOINT ["java","-cp","app:app/lib/*","com.mhp.App"]

Dockerfile pour microservice2

   FROM openjdk:8-jdk-alpine
   VOLUME /tmp
   ARG DEPENDENCY=target/dependency
   COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib
   COPY ${DEPENDENCY}/META-INF /app/META-INF
   COPY ${DEPENDENCY}/BOOT-INF/classes /app
   ENTRYPOINT ["java","-cp","app:app/lib/*","com.mhp.App"]

fichier docker-compose dans microservice1:

version: "2"
services:
  microservice2:
    image: microsdocker2/maven-app2:latest
    expose:
      - 8080
    ports:
      - 0.0.0.0:8080:8080/tcp

  microservice1:
    image: microsdocker1/maven-app1:latest
    ports:
      - 0.0.0.0:8090:8080/tcp
    depends_on:
      - microservice2
    links:
      - microservice2

après avoir créé et installé chaque image, j'exécute le docker-compose upet je fais déployer les deux applications avec succès et je peux accéder au point de terminaison racine de base de chaque microservice.

...
    microservice1_1_2f0ac966a94e | 2018-11-26 14:26:08.955  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path '/maven-app1'
    microservice1_1_2f0ac966a94e | 2018-11-26 14:26:08.960  INFO 1 --- [           main] com.mhp.App                              : Started App in 6.63 seconds (JVM running for 7.358)


...
    microservice2_1_fa2376655f8c | 2018-11-26 14:26:08.090  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path '/maven-app2'
    microservice2_1_fa2376655f8c | 2018-11-26 14:26:08.101  INFO 1 --- [           main] com.mhp.App                              : Started App in 6.821 seconds (JVM running for 7.75)

trace de la pile :

 microservice1_1_2f0ac966a94e | 2018-11-27 08:39:33.720 ERROR 1 --- [nio-8080-exec-4] o.a.c.c.C.[.[.[.[dispatcherServlet]      : Servlet.service() for servlet [dispatcherServlet] in context with path [/maven-app1] threw exception [Request processing failed; nested exception is org.springframework.web.client.HttpClientErrorException: 404 null] with root cause
microservice1_1_2f0ac966a94e |
microservice1_1_2f0ac966a94e | org.springframework.web.client.HttpClientErrorException: 404 null
microservice1_1_2f0ac966a94e |  at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:94) ~[spring-web-5.0.9.RELEASE.jar:5.0.9.RELEASE]
microservice1_1_2f0ac966a94e |  at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:79) ~[spring-web-5.0.9.RELEASE.jar:5.0.9.RELEASE]
microservice1_1_2f0ac966a94e |  at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63) ~[spring-web-5.0.9.RELEASE.jar:5.0.9.RELEASE]
microservice1_1_2f0ac966a94e |  at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:730) ~[spring-web-5.0.9.RELEASE.jar:5.0.9.RELEASE]
microservice1_1_2f0ac966a94e |  at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:688) ~[spring-web-5.0.9.RELEASE.jar:5.0.9.RELEASE]
microservice1_1_2f0ac966a94e |  at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:644) ~[spring-web-5.0.9.RELEASE.jar:5.0.9.RELEASE]
microservice1_1_2f0ac966a94e |  at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:296) ~[spring-web-5.0.9.RELEASE.jar:5.0.9.RELEASE]

microservice1_1_2f0ac966a94e | à com.mhp.App.remote (App.java:29) ~ [app /: na]

microservice1_1_2f0ac966a94e |  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_181]
microservice1_1_2f0ac966a94e |  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_181]
microservice1_1_2f0ac966a94e |  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_181]
microservice1_1_2f0ac966a94e |  at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_181]
microservice1_1_2f0ac966a94e |  at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209) ~[spring-web-5.0.9.RELEASE.jar:5.0.9.RELEASE]
microservice1_1_2f0ac966a94e |  at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136) ~[spring-web-5.0.9.RELEASE.jar:5.0.9.RELEASE]
microservice1_1_2f0ac966a94e |  at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102) ~[spring-webmvc-5.0.9.RELEASE.jar:5.0.9.RELEASE]
microservice1_1_2f0ac966a94e |  at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:891) ~[spring-webmvc-5.0.9.RELEASE.jar:5.0.9.RELEASE]
microservice1_1_2f0ac966a94e |  at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797) ~[spring-webmvc-5.0.9.RELEASE.jar:5.0.9.RELEASE]
microservice1_1_2f0ac966a94e |  at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.0.9.RELEASE.jar:5.0.9.RELEASE]
microservice1_1_2f0ac966a94e |  at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991) ~[spring-webmvc-5.0.9.RELEASE.jar:5.0.9.RELEASE]
microservice1_1_2f0ac966a94e |  at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925) ~[spring-webmvc-5.0.9.RELEASE.jar:5.0.9.RELEASE]
microservice1_1_2f0ac966a94e |  at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974) ~[spring-webmvc-5.0.9.RELEASE.jar:5.0.9.RELEASE]
microservice1_1_2f0ac966a94e |  at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:866) ~[spring-webmvc-5.0.9.RELEASE.jar:5.0.9.RELEASE]
microservice1_1_2f0ac966a94e |  at javax.servlet.http.HttpServlet.service(HttpServlet.java:635) ~[tomcat-embed-core-8.5.34.jar:8.5.34]
microservice1_1_2f0ac966a94e |  at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851) ~[spring-webmvc-5.0.9.RELEASE.jar:5.0.9.RELEASE]
microservice1_1_2f0ac966a94e |  at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) ~[tomcat-embed-core-8.5.34.jar:8.5.34]
microservice1_1_2f0ac966a94e |  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-8.5.34.jar:8.5.34]
microservice1_1_2f0ac966a94e |  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.34.jar:8.5.34]
microservice1_1_2f0ac966a94e |  at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) ~[tomcat-embed-websocket-8.5.34.jar:8.5.34]
microservice1_1_2f0ac966a94e |  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.34.jar:8.5.34]
microservice1_1_2f0ac966a94e |  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.34.jar:8.5.34]
microservice1_1_2f0ac966a94e |  at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) ~[spring-web-5.0.9.RELEASE.jar:5.0.9.RELEASE]
microservice1_1_2f0ac966a94e |  at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.0.9.RELEASE.jar:5.0.9.RELEASE]
microservice1_1_2f0ac966a94e |  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.34.jar:8.5.34]
microservice1_1_2f0ac966a94e |  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.34.jar:8.5.34]
microservice1_1_2f0ac966a94e |  at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109) ~[spring-web-5.0.9.RELEASE.jar:5.0.9.RELEASE]
microservice1_1_2f0ac966a94e |  at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.0.9.RELEASE.jar:5.0.9.RELEASE]
microservice1_1_2f0ac966a94e |  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.34.jar:8.5.34]
microservice1_1_2f0ac966a94e |  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.34.jar:8.5.34]
microservice1_1_2f0ac966a94e |  at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93) ~[spring-web-5.0.9.RELEASE.jar:5.0.9.RELEASE]
microservice1_1_2f0ac966a94e |  at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.0.9.RELEASE.jar:5.0.9.RELEASE]
microservice1_1_2f0ac966a94e |  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.34.jar:8.5.34]
microservice1_1_2f0ac966a94e |  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.34.jar:8.5.34]
microservice1_1_2f0ac966a94e |  at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) ~[spring-web-5.0.9.RELEASE.jar:5.0.9.RELEASE]
microservice1_1_2f0ac966a94e |  at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.0.9.RELEASE.jar:5.0.9.RELEASE]
microservice1_1_2f0ac966a94e |  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.34.jar:8.5.34]
microservice1_1_2f0ac966a94e |  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.34.jar:8.5.34]
microservice1_1_2f0ac966a94e |  at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) ~[tomcat-embed-core-8.5.34.jar:8.5.34]
microservice1_1_2f0ac966a94e |  at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-8.5.34.jar:8.5.34]
microservice1_1_2f0ac966a94e |  at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493) [tomcat-embed-core-8.5.34.jar:8.5.34]
microservice1_1_2f0ac966a94e |  at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [tomcat-embed-core-8.5.34.jar:8.5.34]
microservice1_1_2f0ac966a94e |  at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) [tomcat-embed-core-8.5.34.jar:8.5.34]
microservice1_1_2f0ac966a94e |  at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [tomcat-embed-core-8.5.34.jar:8.5.34]
microservice1_1_2f0ac966a94e |  at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) [tomcat-embed-core-8.5.34.jar:8.5.34]
microservice1_1_2f0ac966a94e |  at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:800) [tomcat-embed-core-8.5.34.jar:8.5.34]
microservice1_1_2f0ac966a94e |  at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.34.jar:8.5.34]
microservice1_1_2f0ac966a94e |  at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:806) [tomcat-embed-core-8.5.34.jar:8.5.34]
microservice1_1_2f0ac966a94e |  at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498) [tomcat-embed-core-8.5.34.jar:8.5.34]
microservice1_1_2f0ac966a94e |  at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.34.jar:8.5.34]
microservice1_1_2f0ac966a94e |  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_181]
microservice1_1_2f0ac966a94e |  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_181]
microservice1_1_2f0ac966a94e |  at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.34.jar:8.5.34]
microservice1_1_2f0ac966a94e |  at java.lang.Thread.run(Thread.java:748) [na:1.8.0_181]

versions:

spring-boot version 2.0.5.RELEASE
docker version 18.09.0
docker compose version 1.23.1 
cheville sombre

Utilisez le nom du service microservice2au lieu delocalhost

@GetMapping("/remote")
public String remote() {
    RestTemplate restTemplate = new RestTemplate();
    return restTemplate.getForObject("http://microservice2:8080/maven-app2/", String.class);
}

https://docs.docker.com/compose/networking/

Par défaut, Compose configure un seul réseau pour votre application. Chaque conteneur d'un service rejoint le réseau par défaut et est à la fois accessible par d'autres conteneurs sur ce réseau et détectable par eux à un nom d'hôte identique au nom du conteneur.

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

TOP liste

  1. 1

    Comment afficher du texte au milieu de div avec une couleur d'arrière-plan différente?

  2. 2

    Modbus Python Schneider PM5300

  3. 3

    Comment faire une recherche partielle et obtenir un score pertinent dans Elasticsearch

  4. 4

    Autocomplete avec java, Redis, Recherche élastique, Mongo

  5. 5

    Comment choisir le nombre de fragments et de répliques Elasticsearch

  6. 6

    Comment utiliser HttpClient avec TOUT cert ssl, quelle que soit la « mauvaise » est

  7. 7

    Existe-t-il un moyen de voir si mon bot est hors ligne ?

  8. 8

    optimiser les opérations du serveur avec elasticsearch: traitement des filigranes de disque bas

  9. 9

    MasterService d'ElasticSearch prend trop de temps pour calculer l'état du cluster et lancer ProcessClusterEventTimeoutException

  10. 10

    Spring @RequestParam DateTime format comme ISO 8601 Date Heure facultative

  11. 11

    Quelque chose dans le cluster Elasticsearch 7.4 devient de plus en plus lent avec les délais de lecture de temps en temps

  12. 12

    Microsoft.WebApplication.targets

  13. 13

    Comment analyser un hachage Ruby plat en un hachage imbriqué?

  14. 14

    Comment changer la couleur de la police dans R?

  15. 15

    Comment créer une nouvelle application dans Dropbox avec des autorisations complètes

  16. 16

    Comment vérifier si un utilisateur spécifique a un rôle? Discord js

  17. 17

    Exporter la table de l'arborescence vers CSV avec mise en forme

  18. 18

    Résultat de l'échantillonneur JMeter : comprendre le temps de chargement, le temps de connexion et la latence

  19. 19

    Ajustement non linéaire avec R

  20. 20

    comment copier du contenu et le mettre dans un pdf nouvellement créé en utilisant iText

  21. 21

    php ajouter et fusionner des données de deux tables

chaudétiquette

Archive