【问题标题】:Docker Containers NoRouteToHostException: Host is unreachableDocker 容器 NoRouteToHostException:主机无法访问
【发布时间】:2020-02-29 11:42:38
【问题描述】:

我在 CentOS-8 上并且有几个 spring-boot 服务:demo-client 通过 spring RestTemplate 在 HTTP 上调用 demo-server。这在没有 Docker 容器的情况下工作正常。 但是当我将它们部署为具有默认网络的 docker-compose 时,演示客户端无法调用演示服务器。我尝试使用服务名称和容器的 IP 地址,但在两种情况下都出现相同的错误:

演示客户端_1 | 2020-02-29 10:23:55.165 错误 1 ​​--- [nio-8082-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]:Servlet.service() 用于 servlet [dispatcherServlet] path [] 抛出异常 [请求处理失败;嵌套异常是 org.springframework.web.client.ResourceAccessException:**“http://172.24.0.2:8081/hello”的 GET 请求出现 I/O 错误:主机无法访问(主机无法访问);** 嵌套异常是java.net.NoRouteToHostException: Host is unreachable (Host unreachable)] 根本原因 演示客户端_1 | 演示客户端_1 | java.net.NoRouteToHostException:主机不可达(主机不可达) 演示客户端_1 |在 java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.8.0_212] 演示客户端_1 |在 java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_212]*

Docker 撰写文件:

docker-compose.yml:
version: '3'
services:
  demo-client:
    build: ./demo-client
    ports:
      - "8082:8082"
    depends_on:
      - demo-server
  demo-server:
    build: ./demo-server
    ports:
      - "8081:8081"

我尝试按照之前一些帖子中的建议执行与防火墙相关的操作:

sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reload
firewall-cmd --permanent --zone=trusted --add-interface=docker0
firewall-cmd --reload
service firewalld restart*

这些都不起作用。我认为是直截了当的事情结果变得更加复杂。

【问题讨论】:

  • 在使用防火墙之前,请将其重置为默认值并尝试缩小可能性。连接到客户端应用程序并 ping 应用程序,然后尝试卷曲它。使用docker exec -ti YOUR_CONTAINER sh 连接到它。
  • 您应该能够从demo-client 连接到demo-server,使用demo-server 作为主机名;您不需要更改 docker-compose.yml 或更改主机防火墙设置。还要仔细检查服务器是否正在侦听 0.0.0.0:8081(“所有接口”)而不是 127.0.0.1:8081(“仅限容器私有 localhost 接口”)。
  • @DavidMaze 我该如何检查:还要仔细检查服务器是否正在监听 0.0.0.0:8081(“所有接口”)而不是 127.0.0.1:8081(“容器私有仅限本地主机接口”)。 *** 我在“docker ps”结果中看到这个:a64a617f0841 explore_demo-client “java -jar /app.jar” 8 分钟前 7 分钟前 0.0.0.0:8082->8082/tcp explore_demo-client_1 2ae0a4e75933 explore_demo-server “ java -jar /app.jar" 8 分钟前 8 分钟前 0.0.0.0:8081->8081/tcp explore_demo-server_1
  • @davidxxx: 你好,我可以 ping 两个容器:[user@localhost explore]$ docker exec -ti 88a10e840cf0 sh '/# ping demo-server PING demo -server (172.27.0.2): 56 data bytes 64 bytes from 172.27.0.2: seq=0 ttl=64 time=0.137 ms [user@localhost explore]$ docker exec -ti fcad3882f0e3 sh / # ping demo-client PING demo-client (172.27.0.3): 56 个数据字节 64 个字节来自 172.27.0.3: seq=0 ttl=64 time=0.113 ms 64 个字节来自 172.27.0.3: seq=1 ttl=64 time=0.112毫秒
  • 这似乎是 CentOS-8 的问题。相同的代码在 CentOS-7 上运行良好。

标签: docker docker-compose containers


【解决方案1】:

问题出在 Centos-8 上,同样的代码在 CentOS-7 上运行良好。所以,现在我搬回了 Centos-7。 CentOS-8 引入 Podman 作为官方容器工具而不是 Docker

【讨论】:

    【解决方案2】:

    在我的例子中,防火墙阻止了容器的弹性端口。我停止了防火墙并重新启动了它工作的应用程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多