centos7之Docker容器无法联网排坑

组学之美 2022年01月19日 1,960次浏览

因为工作需要,需要使用shinyproxy 配合docker 部署shiny app,成功运行shinyproxy之后,发现shiny页面无法访问,报Container did not respond in time 错误。

经过各种排查之后发现,是因为docker本身无法联网而导致的问题。
docker运行容器之后,在容器内无法ping通宿主机,宿主机也无法ping通容器,但容器之间可以相互ping通,说明是docker0网桥存在问题。

brctl show

brctl.png

docker0网桥 bridge id 为8000.0000000000,各种排查无果。

百度之后发现,这些人遇到的问题比较类似:
docker ping 不通 docker0_Docker问题之网桥8000.000000000000
Docker 容器不能ping通默认网关(172.17.0.1)

他们都采用了升级内核的方式解决,但网桥故障的具体原因没有讲清楚。

于是查看内核发现,当前系统为3.10.0.327linux内核。
在同款Linux内核的云服务器上,Docker 启动时报br_netfilter模块缺失的错误。

brctl.png

进一步分析发现,在3.10.0-327 linux内核中,br_netfilter 以build-in的方式编码在系统中,没法以独立的模块运行,从而导致docker启动异常。

这个问题似乎只能通过升级内核解决

centos7升级内核

centos7升级内核可以通过yum命令实现

# 升级内核
sudo yum update kernel

# 查看已安装内核
rpm -qa | grep kernel

# 查看开机启动可选内核
sudo cat /boot/grub2/grub.cfg |grep menuentry

# 查看默认加载内核(升级之后,自动修改为最新内核)
sudo grub2-editenv list

重启系统,Docker0网桥正常,Docker联网正常。