VirtualBox中Ubuntu16.04的Docker容器curl报SSL协议错误,如何修复?
修复Docker容器内curl谷歌出现SSL协议错误的方案
结合你的环境(VirtualBox中的Ubuntu 16.04 + Docker CE 18.03.0),这个SSL错误大概率和TLS版本兼容性、网络MTU不匹配或者老版本Docker的bug有关,下面是几个亲测有效的解决步骤:
1. 强制curl使用兼容的TLS版本
谷歌现在主要使用TLS 1.2/1.3,但Docker 18.03对应的基础镜像(比如ubuntu:16.04)里的curl和OpenSSL版本可能偏旧,默认不支持新的TLS协议。你可以先试试指定TLS 1.2来请求:
curl -sSL --tlsv1.2 https://google.com
如果这个命令能成功,说明核心问题是TLS版本兼容。后续可以考虑:
- 在容器内更新curl和OpenSSL:
apt update && apt install -y curl openssl - 更换更新的基础镜像(比如ubuntu:18.04及以上)来构建你的容器
2. 调整Docker容器的MTU设置
VirtualBox的NAT网络默认MTU可能和Docker容器的默认MTU不一致,导致SSL握手时数据包传输异常。
- 先查看宿主机的MTU值:
ip link show
找到你的虚拟机网卡(比如enp0s3),看mtu字段的值(通常是1500)。
- 临时测试:创建容器时指定MTU参数
docker run --rm -it --mtu=1500 your-image-name /bin/bash
进去后再执行curl测试,如果正常,就修改Docker daemon的默认配置:
编辑/etc/docker/daemon.json(没有就新建):
{ "mtu": 1500 }
然后重启Docker服务:
systemctl restart docker
3. 升级Docker到稳定版本
Docker 18.03是2018年的旧版本,存在不少已知的网络和SSL相关bug。如果环境允许,升级到较新的稳定版(比如20.10.x系列)能解决很多潜在问题:
- 先卸载旧版本:
apt-get remove -y docker docker-engine docker.io containerd runc
- 安装新版本:
# 添加依赖 apt-get update && apt-get install -y ca-certificates curl gnupg lsb-release # 添加Docker GPG密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg # 添加软件源 echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null # 安装新版本 apt-get update && apt-get install -y docker-ce docker-ce-cli containerd.io
4. 切换VirtualBox的网络模式
如果用的是NAT模式,VirtualBox的网络过滤可能干扰SSL握手。可以尝试把虚拟机的网络模式改成桥接适配器:
- 关闭虚拟机
- 在VirtualBox设置里找到「网络」,把网络连接方式改成「桥接适配器」,选择宿主机的物理网卡
- 启动虚拟机,重新测试容器内的curl命令
内容的提问来源于stack exchange,提问作者Kuong Knight
相关产品推荐
相关产品推荐

