简介
本文介绍如何解决docker在pull的时候报TLS handshake timeout的问题。
问题复现
用docker创建容器时,报错了:TLS handshake timeout
原因分析
K8s 网络,OpenStack 网络或者其他 SDN 网络会使用各种各样的封包技术,结果便是 Host Pod 或者 Host VM 网卡 MTU 会小于 1500。
而 docker0 bridge 默认 MTU 为 1500,当 docker0 bridge MTU 1500 大于 Host MTU(如 1400)时,会出现「小包可通,大包不通」的情况,直观来说就是 ping 8.8.8.8 能通,但是网站打不开、apt update 卡住不动、更无法下载文件。
查看docker的mtu
docker network inspect bridge
结果:
测试外网mtu
在坏的主机上ping 1422+28=1450 字节(28字节是ICMP协议的头大小):
docker run --rm -it nicolaka/netshoot:latest /bin/bash
ping -c 3 -M do -s 1422 baidu.com
结果
PING baidu.com (220.181.38.148) 1422(1450) bytes of data. 1430 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=1 ttl=48 time=27.6 ms
可以看到结果正常,如果ping 1423+28=1451字节,就不行了:
ping -c 3 -M do -s 1423 baidu.com
PING baidu.com (39.156.69.79) 1423(1451) bytes of data. ping: local error: message too long, mtu=1450
这个就说明mtu最大只能是1450。
解决方案
将mtu改小。本处我直接改为1300:
修改/etc/docker/daemon.json(如果没有则新建此文件)
1.添加一项配置
{ ... 其他配置不变 "mtu": 1300 }
2.重新加载并重启docker
sudo systemctl daemon-reload
sudo systemctl restart docker
3.验证
运行
docker network inspect bridge
结果
4.此时再拉镜像就没问题了
请先
!