今天早上,网访问我像往常一样准备拉取一个nginx镜像,网访问结果浏览器直接给我来了个“无法访问此网站”。网访问Docker Hub官网又挂了。网访问这已经不是网访问第一次了,而且频率越来越高,网访问每次都是网访问“Connection timed out”或者干脆DNS解析失败。
我试了试ping docker.com,网访问丢包率100%。网访问再试docker.io,网访问一样。网访问不是网访问我的网络问题——我同时能正常打开GitHub和Google。这就是网访问典型的Docker Hub在中国大陆地区的访问障碍。
说句实话,网访问这事已经困扰国内开发者好几年了。网访问2019年之前还好,基本能直连,虽然偶尔慢点。但后来情况恶化,现在基本稳定处于“可碰运气”的状态。早上九点可能能打开,下午两点就超时。上周三我同事在办公室拉一个Python镜像,硬是重试了七次才成功。
问题出在哪?Docker Hub的CDN节点多数部署在境外,国内没有官方镜像站点。加上网络环境对跨境流量的限制,导致docker pull这种高频请求经常被卡住。你换个国内源,比如阿里云、中科大的加速器,速度立马上来——但这只是治标,因为加速器本身也是从Docker Hub同步数据,一旦官方源那边有大版本更新,加速器也会有延迟。
最烦的是,Docker Hub的登录认证机制和镜像拉取走的是不同的域名。有些时候你能打开hub.docker.com的网页,但docker login就是报错。我之前遇到过一种情况:网页能正常浏览,但执行docker pull hello-world却卡在“Waiting”状态。查了半天,发现是registry-1.docker.io这个域名被墙了,而网页用的另一个域名没被墙。
有开发者朋友说用VPN就能解决,但这不是人人都有条件。而且就算挂了代理,Docker CLI的代理设置也是个坑——你得同时配置HTTP_PROXY和HTTPS_PROXY,还得注意docker daemon的启动参数。我见过有人折腾了一下午,最后发现是忘了给dockerd加代理配置。
说点实际的解决办法吧。如果你只是偶尔拉个镜像,直接改daemon.json里的registry-mirrors,用国内几个大厂的加速地址就行。阿里云的加速器需要登录后获取专属地址,网易的163源速度也还行,中科大的源稳定但同步稍慢。要是你经常构建多架构镜像,建议自己搭个Harbor做二级缓存,别死磕官方源。
最后提醒一句:别在Docker Hub上存任何重要的私有镜像,这平台本身对国内用户就不友好,指不定哪天登录都登不上。真要存私有镜像,用阿里云容器镜像服务或者腾讯云的,至少不会因为网络问题让你抓狂。