docker容器内无法正常访问外部网络

时间:2024-03-20 11:16:01

docker之mtu不一致问题
问题:
今天开发部门反映有孚云服务器上的docker容器无法curl成功外部网站,但是Ping是完全没有问题的。
排查:
登录服务器容器,使用curl命令进行测试,果然是不通的,又使用了ping命令测试是正常的,经过多次反复测试,怀疑是容器镜像存在问题,有反复创建容器进行测试,猜测是docker网络桥接有问题,随后将容器的net改为host后就可以正常curl了。
之后是用Ip a 命令查看eth0网卡与docker0网卡的区别,发现eth0的网卡mtu值是1450,而docker0的mtu值是1500,这里存在着这种差异,应该就是导致网络异常的所在,经过查看资料果真如此,随后使用命令强行修改mtu值无果,发现只要重启服务器,mtu值就会还原,这时候想到修改docker0的mtu值,下面就是修改的步骤:
vim /etc/docker/daemon.json
添加: “mtu”: 1450
保存回车
service docker restart
重启docker服务
这时候使用Ip a 命令查看docker0的mtu还是1500,先别急使用docker run命令启动一个测试容器后再使用Ip a 命令看看容器对应网卡的mtu值变成了1450了,那么到这里就算是成功了,在启动一个非测试容器,使用curl命令果然也是OK的,那么问题到这里就结束了。
注:
如果使用者使用的容器网络是自定义的,并未指定mtu值创建,那么需要删除当前网络,重新创建网络并指定mtu值,如:
docker network create --opt com.docker.network.driver.mtu=1450 (网络名)

有人会问,mtu是个什么鬼?作为服务器运维,虽然经常使用ifconfig或者ip a命令去查看网卡信息,但是应该会很少去观察当前网卡的mtu值吧,下面带上相关截图。
docker容器内无法正常访问外部网络
docker容器内无法正常访问外部网络
看到图中两处的不同了吧,如果我使用docker默认的网桥模式,那么在容器内使用ping命令去测试外网肯定是没有问题的,但是使用curl命令或者wget命令的话就会出现问题,下面给出容器网卡的截图。
docker容器内无法正常访问外部网络