要让docker通过代理拉取镜像,必须配置dockerd而非仅设环境变量;推荐使用/etc/docker/daemon.json配置proxies字段,支持与registry-mirrors叠加使用,并需验证代理可达性及no_proxy设置。

要让 Docker 通过代理网关拉取外部镜像,关键在于配置 dockerd(Docker 守护进程) 使用代理,而不是只设用户环境变量或容器级代理——因为镜像拉取动作由 dockerd 执行,它必须在启动时就“知道”代理地址。
配置 dockerd 使用 HTTP/HTTPS 代理
这是最常用、最可靠的方式,适用于所有 Linux 发行版(如 CentOS、Ubuntu、Debian):
- 创建 systemd 覆盖配置目录和文件:
sudo mkdir -p /etc/systemd/system/docker.service.dsudo nano /etc/systemd/system/docker.service.d/http-proxy.conf - 写入以下内容(替换为你的代理地址):
[Service]<br>Environment="HTTP_PROXY=http://192.168.1.100:8080"<br>Environment="HTTPS_PROXY=http://192.168.1.100:8080"<br>Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.local"
- 重载并重启服务:
sudo systemctl daemon-reloadsudo systemctl restart docker - 验证是否生效:
systemctl show --property=Environment docker应显示刚设置的变量;
也可运行docker info | grep -i proxy查看输出中是否有代理信息。
用 daemon.json 配置代理(更简洁,推荐)
从 Docker 20.10+ 开始,支持直接在 /etc/docker/daemon.json 中声明代理,语义清晰且无需管理 systemd 文件:
- 编辑配置:
sudo nano /etc/docker/daemon.json - 添加如下结构(注意 JSON 格式严格,末尾不能有逗号):
{<br> "proxies": {<br> "default": {<br> "httpProxy": "http://192.168.1.100:8080",<br> "httpsProxy": "http://192.168.1.100:8080",<br> "noProxy": "localhost,127.0.0.1,10.0.0.0/8"<br> }<br> }<br>} - 保存后重启:
sudo systemctl restart docker - 该方式会自动覆盖 systemd 环境变量配置,优先级更高,且便于版本化管理。
配合镜像加速器使用(国内场景强烈建议)
代理解决“连不上”,加速器解决“慢”,两者可叠加使用,互不冲突:
- 在同一个
daemon.json中同时配置registry-mirrors和proxies:{<br> "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],<br> "proxies": {<br> "default": {<br> "httpProxy": "http://192.168.1.100:8080",<br> "httpsProxy": "http://192.168.1.100:8080"<br> }<br> }<br>} - 加速器地址仍走代理发出请求,但因镜像源在国内,响应更快、稳定性更高。
- 若加速器本身不可达,dockerd 会自动 fallback 到上游 registry(如 registry-1.docker.io),此时代理就成为兜底通路。
验证与排错要点
拉取失败时别急着换方案,先确认几个关键点:
-
代理服务本身可达:在宿主机执行
curl -x http://192.168.1.100:8080 https://hub.docker.com/v2/测试是否返回 200。 -
NO_PROXY 设置合理:避免把私有 registry 地址误加入 noProxy,导致直连失败;也别漏掉
127.0.0.1和localhost,否则本地调试可能异常。 - 不要依赖 export HTTP_PROXY:该变量只影响当前 shell 下的普通命令(如 curl),对 dockerd 无效。
-
检查证书问题:若代理是 MITM 类型(如企业 SSL 解密网关),需将代理 CA 证书加入 dockerd 的信任链,或临时配置
"insecure-registries": ["your-registry:5000"](仅测试环境)。











