一次因为光猫桥接后路由器接口变化导致docker内容器无法联网问题的解决
2021-05-24 15:06:45 update
实际上这有可能是 docker 的一个bug,重启了宿主机之后也需要重启一下 dockerd 容器才可以联网。不过也有可能是开机自启脚本有问题,但是前者的可能性更大。/etc/init.d/dockerd restart
重启一下 dockerd 就好啦
2021-04-24 19:52:15 update
写这篇文章的过程中我脑海中就一直在发问,为什么有 dns 的问题,明明已经返回了正确的 ip 了,但就是 icmp 包没有返回,全都丢失,这为什么是 dnsmasq 的问题呢,为什么要监听 eth4 的 ip? 没有必要呀,docker中的容器将 dns query 发给 软路由的 lan 口,lan有到wan的路由通路,dnsmasq 根本就不需要监听 eth4 的ip 了。事实证明是因为 wan 那边原本是通过光猫 拨号 这边 dhcp 获取的ip,前两天改成了光猫桥接 这边 wan(也就是 eth4)通过 PPPoE 拨号上网的,dockerd 需要重启才能获得网络,我没有重启dockerd 导致没网的。
讨论见这个帖子:ping 域名返回了ip 但是ping不通是为什么?
实际上对于本文的标题,解决方法很简单,重启 dockerd 就好了
以下是原文:
我说昨晚微信没有收到 server酱 的一个推送,平常都是准时准点的,但是昨晚并没有推送消息到微信,我还以为docker容器(代称容器A,就是发现容器A无法联网,才知道所有容器都没法联网了,影响很大)挂掉了 或者 docker daemon 挂掉了。刚通过日志确认,应该是容器无法访问网络了的原因。日志如下图
还有这段日志
2021-04-23 20:50:08 ERROR : org.apache.http.conn.HttpHostConnectException: Connect to sc.ftqq.com:443 [sc.ftqq.com/220.181.136.120] failed: Connection refused (Connection refused),
由于此时这个容器没有网络,所以我们也不能安装 ping
工具包测试,我们使用其他自带 ping
工具的镜像/容器 测试。
# 此时在openwrt中,进入 emby 这个镜像的容器中 ping 测试看看
docker exec -it emby /bin/ash
# 执行完上面的命令就已经进入了 emby 的容器,emby 是容器的名称(你也可以使用容器id)
# ping baidu.com -c 4
PING baidu.com (220.181.38.148): 56 data bytes
--- baidu.com ping statistics ---
4 packets transmitted, 0 packets received, 100% packet loss
没有 ICMP 包返回,说明网络不通。
想想和之前有何不同?那肯定是光猫改了桥接啊?️,现在我的软路由的 eth0 到 eth4 接口有所变化,上面的ping返回了ip地址但是没有 icmp 包返回。问题还是出在dns 上?
看看目前软路由和光猫连接的 eth4 接口信息
# ifconfig eth4
eth4 Link encap:Ethernet HWaddr 00:E0:70:2A:3F:59
inet addr:192.168.1.254 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:13129963 errors:0 dropped:18497 overruns:0 frame:0
TX packets:20642219 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:9423348725 (8.7 GiB) TX bytes:23961982092 (22.3 GiB)
因为设置了软路由 eth4(wan, PPPoE 拨号的接口)直通光猫 192.168.1.1,所以设置了 eth4 的ip地址是 192.168.1.254。见这篇文章:光猫桥接模式下使用openwrt路由器访问光猫配置教程
从容器中 traceroute 10.10.10.1
或者 192.168.1.254
再到 192.168.1.1
都是通的,说明这里路由表没问题,问题还是出在docker的宿主机(也就是 openwrt)dns 的监听。
查看一下 /etc/dnsmasq.conf
resolv-file=/etc/resolv.dnsmasq.conf
strict-order
listen-address=127.0.0.1,10.10.10.1,172.10.10.1,192.168.20.1
addn-hosts=/etc/dnsmasq.hosts
将 listen-address 中添加 eth4 的 IP,因为这个接口是wan,通向光猫然后直到 Internet 的接口,修改好之后是
resolv-file=/etc/resolv.dnsmasq.conf
strict-order
listen-address=127.0.0.1,10.10.10.1,172.10.10.1,192.168.20.1,192.168.1.254
addn-hosts=/etc/dnsmasq.hosts
改好了之后重启 dnsmasq
和 dockerd
/etc/init.d/dnsmasq restart
/etc/init.d/dockerd restart
再进入容器A,这个容器使用 debian 系的软件包管理方式,默认没有安装 ping
ifconfig
等程序,我们自己安装一下确认吧(此时已经修复好了容器的网络了)
# 更新一下软件源列表
apt-get update
# 安装 ifconfig
apt-get install net-tools
# 安装 ping
apt-get install iputils-ping
ifconfig 一下看看
# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.10.10.0 netmask 255.255.0.0 broadcast 172.10.255.255
ether 02:42:ac:0a:0a:00 txqueuelen 0 (Ethernet)
RX packets 7019 bytes 9321265 (8.8 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 5005 bytes 366618 (358.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 28 bytes 2098 (2.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 28 bytes 2098 (2.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
容器A 的 ip 是 172.10.10.0,容器使用的网络网关地址是 172.10.10.1,这个地址在 dnsmasq 的监听列表中,没问题~
ping 一下看看
# ping baidu.com -c 4
PING baidu.com (220.181.38.148) 56(84) bytes of data.
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=1 ttl=49 time=22.8 ms
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=2 ttl=49 time=22.5 ms
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=3 ttl=49 time=22.9 ms
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=4 ttl=49 time=23.2 ms
--- baidu.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 6ms
rtt min/avg/max/mdev = 22.511/22.846/23.174/0.299 ms
ok 好耶,解决了
本文的记录或分享结束,end.