首页 > 解决方案 > 带有两个 Spring Boot 应用程序的 Docker Compose 得到“消息”:“对 \”http://127.0.0.1:8010/...的 GET 请求出现 I/O 错误:连接被拒绝”

问题描述

我有两个小型 Spring Boot 应用程序,它们公开了一个休息 API:

应用程序一

获取请求

 - http://localhost:8010/api/stock/AAPL

回复:

{
    "name": "AAPL",
    "value": 219.9
}

应用程序二

获取请求

 - http://localhost:8080/api/trade/APPL/buy/10

回复

{
    "id": 1,
    "stock": {
        "name": "APPL",
        "value": 219.9
    },
    "quantity": 10,
    "total": 2199.0
}

当我在没有 Docker 的本地主机上运行这两个应用程序时,我从两个 API 中得到了正确的响应。

当我使用 Docker Compose 运行应用程序时,第一个 API 应用程序一响应 OK,但应用程序二返回错误:

"message": "I/O error on GET request for \"http://127.0.0.1:8010/api/stock/APPL\": Connection refused (Connection refused); nested exception is java.net.ConnectException: Connection refused (Connection refused)",
"path": "/api/trade/APPL/buy/10"

这是我的 docker-compose.yml 配置文件:

version: "3.7"
services:
  app-one:
    image: ibercode/app-one
    ports:
    - "8010:8010"
    expose:
      - "8010"
  app-two:
    build: .
    ports:
      - "8080:8080"
    depends_on:
      - app-one      
    environment:
      - APP_ONE_URI=http://127.0.0.1:8010/api/stock/

这是我运行命令后的输出docker-compose up

$ docker-compose up
Starting app-two_app-one_1 ... done
Starting app-two_app-two_1 ... done
Attaching to app-two_app-one_1, app-two_app-two_1
app-one_1  |
app-one_1  |   .   ____          _            __ _ _
app-one_1  |  /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
app-one_1  | ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
app-one_1  |  \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
app-one_1  |   '  |____| .__|_| |_|_| |_\__, | / / / /
app-one_1  |  =========|_|==============|___/=/_/_/_/
app-one_1  |  :: Spring Boot ::        (v2.1.8.RELEASE)
app-one_1  |
app-one_1  | 2019-09-18 08:28:07.287  INFO 1 --- [           main] com.ibercode.AppOneApplication           : Starting AppOneApplication vlatest on a090eb18a661 with PID 1 (/app.jar started by root in /)
app-one_1  | 2019-09-18 08:28:07.291  INFO 1 --- [           main] com.ibercode.AppOneApplication           : No active profile set, falling back to default profiles: default
app-two_1  |
app-two_1  |   .   ____          _            __ _ _
app-two_1  |  /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
app-two_1  | ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
app-two_1  |  \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
app-two_1  |   '  |____| .__|_| |_|_| |_\__, | / / / /
app-two_1  |  =========|_|==============|___/=/_/_/_/
app-two_1  |  :: Spring Boot ::        (v2.1.8.RELEASE)
app-two_1  |
app-two_1  | 2019-09-18 08:28:08.308  INFO 1 --- [           main] com.ibercode.AppTwoApplication           : Starting AppTwoApplication vlatest on 973897f9ea8d with PID 1 (/app.jar started by root in /)
app-two_1  | 2019-09-18 08:28:08.325  INFO 1 --- [           main] com.ibercode.AppTwoApplication           : No active profile set, falling back to default profiles: default
app-one_1  | 2019-09-18 08:28:10.448  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8010 (http)
app-one_1  | 2019-09-18 08:28:10.536  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
app-one_1  | 2019-09-18 08:28:10.537  INFO 1 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.24]
app-one_1  | 2019-09-18 08:28:10.731  INFO 1 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
app-one_1  | 2019-09-18 08:28:10.744  INFO 1 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 3313 ms
app-one_1  | 2019-09-18 08:28:11.283  INFO 1 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
app-two_1  | 2019-09-18 08:28:11.488  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
app-two_1  | 2019-09-18 08:28:11.588  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
app-two_1  | 2019-09-18 08:28:11.588  INFO 1 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.24]
app-one_1  | 2019-09-18 08:28:11.701  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8010 (http) with context path ''
app-one_1  | 2019-09-18 08:28:11.705  INFO 1 --- [           main] com.ibercode.AppOneApplication           : Started AppOneApplication in 5.488 seconds (JVM running for 6.129)
app-two_1  | 2019-09-18 08:28:11.797  INFO 1 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
app-two_1  | 2019-09-18 08:28:11.797  INFO 1 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 3281 ms
app-two_1  | 2019-09-18 08:28:12.077  INFO 1 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
app-two_1  | 2019-09-18 08:28:12.249  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
app-two_1  | 2019-09-18 08:28:12.251  INFO 1 --- [           main] com.ibercode.AppTwoApplication           : Started AppTwoApplication in 5.016 seconds (JVM running for 5.955)

有什么想法或建议吗?谢谢

标签: spring-bootdockerdocker-compose

解决方案


您似乎正在尝试使用 URL http://127.0.0.1:8010/api/stock/APPL 从 app-2 访问 app-1。但是,您不能从另一个容器访问 127.0.0.1 下的另一个容器。

您可以通过服务名称访问撰写文件中的另一个服务。这意味着,您需要配置您的 app-2 应用程序以查找主机app-one,即APP_ONE_URI=http://app-one/api/stock/.

您可以在此处阅读有关撰写网络的更多信息https://docs.docker.com/compose/networking/


推荐阅读