Docker设置代理后pull镜像仍超时怎么办?先确认引擎和配置位置

26 次阅读
FunMeGo VPN 按小时计费的VPN 随用随退 了解服务

Docker设置代理后,pull镜像仍超时,先确认执行下载的是哪一个引擎,再给对应进程配置代理。在终端里设置了环境变量,或者浏览器已经能上网,都不能证明镜像拉取使用了相同路径。

本文处理独立安装的Linux Engine和Docker Desktop拉取镜像失败,依据官方文档整理,未在你的设备实测。构建时安装依赖、容器启动后访问网络,属于另外的请求阶段。

先确认下载发生在哪台机器

在原来失败的终端执行:

docker version
docker context show
docker context inspect

记录客户端与服务端版本,以及当前上下文的端点。检查命令是否带了--host、--context,终端是否设置了DOCKER_HOST或DOCKER_CONTEXT;这些信息也会影响实际连接。上下文查询见官方命令说明。

如果命令连接的是远程服务器,真正拉取镜像的引擎在远端。电脑上的代理只监听127.0.0.1,远端不能把这个地址当作你的电脑。

WSL里敲命令也不一定是在使用发行版内的独立引擎,可能连接的是Desktop。先确定端点,才知道该到哪里改。涉及Windows代理可达性时,另看WSL代理连接排查。

三处代理设置影响不同阶段

设置位置主要影响什么不能直接证明什么
当前终端的代理环境变量读取这些变量的终端程序独立运行的引擎已采用它
独立Engine的服务代理配置引擎访问镜像仓库等请求已启动的容器内应用也采用它
~/.docker/config.json的代理项新容器环境变量和构建参数引擎拉取镜像已走代理
Desktop的代理设置对应版本规定的桌面端与镜像拉取流量远程引擎也采用它

CLI代理文档明确区分了容器环境和引擎本身。把配置写进客户端文件后,容器中的变量变了,拉取镜像却仍超时,两种结果可以同时出现。

docker build也要看失败步骤:取得基础镜像,与RUN里执行包管理器,是两类请求。给构建命令增加--build-arg HTTP_PROXY=...,不能当成所有拉取故障的通用修复。

独立Linux引擎先核对服务配置

下面以普通systemd安装为例,不适用于Desktop。先只读检查:

sudo systemctl cat docker
sudo systemctl show --property=Environment docker

确认启动参数、是否指定了其他配置文件,以及服务环境中是否有旧代理。输出可能包含凭据,只在本地查看,分享前遮住密码。

服务端代理文档提供JSON配置和服务环境变量两种方式,直接配置服务端的代理优先于环境变量。为便于维护,选一种明确的来源,不要在多处反复叠加。

例如,引擎与代理确实在同一台Linux主机,且本地HTTP代理端口为7890,可以把下面字段合并进实际使用的配置文件:

{
  "proxies": {
    "http-proxy": "http://127.0.0.1:7890",
    "https-proxy": "http://127.0.0.1:7890"
  }
}

这是字段示例,不能拿它覆盖整个原文件。普通安装默认配置路径通常为/etc/docker/daemon.json;先备份,保留已有存储、日志和仓库配置,这些代理字段要求Engine 23.0或更新版本,旧版应按对应版本的服务环境变量方案配置。

目标是HTTPS网站时,代理地址仍可以是http://,前提是该端口提供HTTP代理服务。不能照着节点订阅中的服务器端口填,本地SOCKS端口也不能直接套用这份HTTP示例。

按服务端命令参考验证配置,路径换成实际文件:

sudo dockerd --validate --config-file=/etc/docker/daemon.json

验证通过后,在可中断相关工作负载的时段安排服务重启,使配置生效。验证成功只说明配置检查通过,不代表代理地址可达。无效时恢复备份,再按相同维护流程恢复服务。

Rootless安装的服务属于用户会话,配置路径与管理命令不同,应按对应安装文档处理;不要用系统级重启去处理用户级实例。

Desktop到自己的代理页面核对

Desktop会忽略daemon.json里的上述代理配置。打开设置中的代理页面,按当前安装版本核对系统代理、手动代理和排除项,参照官方设置说明。

当前文档区分Desktop proxy与Containers proxy,后者涉及镜像拉取;较旧版本的界面可能不同。若同时看到两组设置,不能仅凭桌面端登录正常就认定镜像请求也采用同一代理。

记录当前模式和地址,再调整与拉取相关的一项,按界面提示应用。使用系统代理时也要确认系统当前值;手动配置时使用Desktop环境可达的入口,不照搬远程机器或另一个虚拟环境的localhost。

排除列表同样需要查看。目标仓库被设为直连时,填对代理地址仍可能不走它。保留必要的内网例外,只修正确认不合适的条目。

保留错误阶段再重试原镜像

恢复到原来使用的上下文,用完整的仓库名和标签重试。下例只展示命令形式,需要换成原镜像:

docker pull REGISTRY/PROJECT/IMAGE:TAG

按照拉取命令说明,下载还涉及镜像层;网页首页能打开,不能替代整次拉取验收。若镜像层已缓存,本次成功也未必验证了所有下载路径,无需为了测试先删除业务镜像。

错误现象优先检查
连接代理地址被拒绝代理是否运行、端口和所在主机
连接超时失败目标、代理可达性、当前上下文
返回407代理认证要求
返回明确的鉴权或拉取限额提示仓库账号、访问权限与限额
出现x509证书错误引擎侧信任链、系统时间与组织证书要求
拉取成功,构建中的下载仍失败构建步骤自己的网络和代理配置

更换VPN线路无法修复镜像名写错、仓库权限不足或代理配置作用在错误进程上的问题。证书错误也不应靠关闭验证解决。

记录同一个镜像修改前后的结果。若还需要检查终端程序的环境变量,可接着看curl代理与排除规则排查,把每个进程实际采用的设置分别核实。

常见问题

docker pull怎么临时指定代理?

先确认所用引擎。拉取命令没有通用的--proxy选项;独立引擎通常需要给服务配置代理,不能假设在命令前临时加环境变量就会传给它。

为什么设置HTTP_PROXY后镜像仍拉不下来?

终端与引擎可能是两个独立进程,甚至在不同机器。先查实际服务端及配置来源,再确认代理入口从那里可达。

config.json里的代理为什么不影响拉取?

其中的代理项用于新容器环境与构建参数,不是引擎的上网配置。需要按独立Engine或Desktop的对应入口设置。

代理配置后要重启吗?

独立引擎的服务配置需要按文档重新加载对应运行环境,本文JSON方案要求安排服务重启;Desktop按界面提示应用。只给新容器设置环境变量,则不能据此认定需要重启整个引擎。

在线客服
正在加载...