由于DOCKER默认虚拟网卡IP地址段导致的网络访问异常问题

在我们使用的阿里云MongoDB服务时,因为阿里提供给我们的连接地址都是域名形式,在服务器上解析成ip地址为 172.17.x.x ,我们在使用的过程中一直没有任何问题。

然而就在有一天,someone在生产服务器上装上了docker并且启动了,于是docker自己创建了虚拟网卡docker0,IP为172.17.0.1,这就出现问题了,用户不断报告服务访问异常,经过我们自己复现异常确实存在,于是开始展开逐步排查,最终发现服务器访问MongoDB有异常,ping一下mongodb服务的地址,如下出现了 Destination Host Unreachable

# ping dds-xxxxx.mongodb.rds.aliyuncs.com
PING dds-xxxxx.mongodb.rds.aliyuncs.com (172.17.10.90) 56(84) bytes of data.
From iz2zecbarncpdr8sqz4kphz (172.17.0.1) icmp_seq=1 Destination Host Unreachable
From iz2zecbarncpdr8sqz4kphz (172.17.0.1) icmp_seq=2 Destination Host Unreachable
From iz2zecbarncpdr8sqz4kphz (172.17.0.1) icmp_seq=3 Destination Host Unreachable

仔细看结果可以看出两点:一是mongodb的IP地址是解析正确了的,二是怎么是从 172.17.0.1 这个地址返回来的信息。

经过排查,原来是因为机器上装了 docker,并且默认docker0网卡IP为 172.17.0.1 ,于是只要是通往172.17.x.x 的通信都从这个 docker0 的网卡出去的,那肯定找不到呀,查看路由表可以看到端倪:

# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.16.1.253    0.0.0.0         UG    0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
172.16.1.0      0.0.0.0         255.255.255.0   U     0      0        0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0

看最后一条记录,目标为172.17.0.0的访问通信,都是从docker0这个接口走的。

解决办法:

修改docker的默认IP配置,如下:

新建/修改docker配置文件 /etc/docker/daemon.json ,将bip改为和我们地址不冲突的网段,内容如下:

{
    "bip": "192.168.200.1/24"
}

重新启动docker:

systemctl restart docker

问题解决。

所以在此要提醒:

在使用docker时一定要注意网络上的设置,不然造成生产异常就麻烦了。

这种情况也只在特定网络环境下出现,平时在本地测试不一定会出现,因为我们本地ip地址通常为 192.168.x.x 这样的地址段,与docker默认的ip段设置不冲突,所以不存在问题,上生产时注意一下就好。

你可能感兴趣的:(开发小笔记)