所有分类
  • 所有分类
  • 未分类

Docker–解决TLS handshake timeout

简介

本文介绍如何解决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.此时再拉镜像就没问题了

0

评论0

请先

显示验证码
没有账号?注册  忘记密码?

社交账号快速登录