【问题标题】:Not able to connect from inside container, but able to connect from host无法从容器内部连接,但能够从主机连接
【发布时间】:2021-08-25 10:08:05
【问题描述】:

我面临一个特殊的情况,无法从网络上找到太多帮助。 我有一个容器(基于 alpine 映像)在 Centos7 主机上以主机网络模式运行,这实际上意味着它与主机共享网络堆栈、/etc/hosts 和 /etc/resolv.conf。

尝试连接到我们组织网络中的远程计算机 (UB1804-MN1-131)(因此不需要代理)。连接调用是 grpc.dial(hostname:port, ..) 调用。 我不断收到以下错误:

code = Unavailable desc = connection error: desc = "transport: Error while dialing dial tcp: i/o timeout"

这种行为本身并不一致。例如有时重试几次后连接成功,有时它只是拒绝连接

从主机本身尝试连接时,同一台远程计算机没有任何问题。

非常感谢您在寻找根本原因方面的任何帮助。作为参考,共享 eth 详细信息、主机和解析详细信息(出于安全原因编辑了其中的一些值):

[user@HOST-21343-135 ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:50:56:9e:7c:15 brd ff:ff:ff:ff:ff:ff
    inet 172.17.65.135/16 brd 172.17.255.255 scope global ens192
       valid_lft forever preferred_lft forever
3: ens224: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 00:50:56:9e:12:a3 brd ff:ff:ff:ff:ff:ff
4: ens256: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 00:50:56:9e:23:0c brd ff:ff:ff:ff:ff:ff
5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:b0:fa:05:37 brd ff:ff:ff:ff:ff:ff
    inet 10.190.64.1/25 scope global docker0
       valid_lft forever preferred_lft forever

[user@HOST-21343-135 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 HOST-21343-135
172.17.65.131   UB1804-MN1-131

[root@ATLAS-21343-135 ~]# cat /etc/resolv.conf
; generated by /usr/sbin/dhclient-script
nameserver 14.110.135.81
nameserver 14.110.135.82
nameserver 14.110.135.83

我已经验证了以上所有数据也是容器共享的。

【问题讨论】:

  • 为了帮助隔离问题,考虑使用 (a) 不同的发行版来构建客户端容器(可能是 Debian 而不是 Alpine;(b) gRPCurl 有一个容器版本(也基于 Alpine):@ 987654321@

标签: docker networking containers grpc alpine


【解决方案1】:

经过一番努力,找到了根本原因。这是由于 /etc/resolv.conf 中存在 DNS IP。当我删除所有 DNS 条目时,它就像魅力一样。所以看起来它正在通过 DNS 服务器路由连接并且它失败了。 但我不明白的是,同样的事情在存在 DNS 的主机上也能正常工作,这意味着它忽略了 DNS 并且只从 /etc/hosts 读取。然而,容器内的同样事情并没有忽略 DNS 条目。我不知道为什么会有这种不同的行为,我不知道。

目前,上面提到的解决方法对我有用。所以我很高兴。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    相关资源
    最近更新 更多