记录一次修改网卡配置,导致的docker内服务无法访问
机器上的docker内部署的服务无法访问,起初以为是防火墙,一查并没有开,然后也顾不上找问题了,先处理吧,就试着把docker服务重启下,然后就没有然后了,一切正常了,找找原因吧。
从资料查询得知,Docker
与宿主机的端口映射是通过iptables
实现的,容器启动时会在iptables
中添加DOCKER
链和n
条DNAT
规则
简单来了解一下,查看一下nat
表的DOCKER
链
1 $ sudo iptables -t nat -nvL DOCKER
从图中可以看到有多条DNAT
规则,规则将宿主机9000
端口的报文转发到172.17.0.2
的9000端口上,而172.17.0.2是分配给docker监控服务
容器的ip
(可以通过docker inspect 容器ID
命令查看)
而这个DNAT
规则需要宿主机开启内核IP转发功能,所以IP转发未开启会导致服务访问失败。
问题的根源找到了,但是产生的原因还没找到。
为什么之前没有手动开启IP转发时DOCKER
服务依然能正常运行?
这是因为Docker daemon
启动时会检查IP_FORWARD
是否开启,如果未开启则临时开启,因为是临时开启所以在network
服务重启后就会失效。服务器断电重启后network服务自然会重启,就有可能导致IP_FORWARD
失效。一般docker
服务正常运行一段时间后却突然访问不了,大不多是因此引起的,可以从这里开始排查。
想起前一日xxl定时任务在执行批量给企业微信推送消息时,发现企业微信的域名无法正常解析,然后就一顿度娘和谷哥,最终方案就是把服务器的DNS地址从114换成了谷哥的8,然后重启网卡后一切正常。其中这重启网卡,是不是这个操作导致的!
自己又重启的试了试,果然不能访问了,查看IP转发是否开启
sysctl net.ipv4.ip_forward
结果是0,未开启,开启应该是1.
行吧,那就先启动一下:
1 echo 'net.ipv4.ip_forward = 1' | sudo tee -a /usr/lib/sysctl.d/50-default.conf
重启network服务
1 systemctl restart network
服务正常,查看IP转发是否开启
已开启,自此服务一切恢复正常,这也是我使用docker这5来年头一次遇见,记录一下。