mac上配置docker拉取镜像代理的关键是为docker daemon配置系统级代理,而非终端环境变量;因daemon由launchd独立管理,不继承shell变量,须通过docker desktop图形界面(settings → resources → proxies)设置http/https代理并重启生效。
mac 上配置 docker 客户端走代理拉取镜像,关键不是配客户端本身,而是让 docker daemon(守护进程) 走代理——因为拉取镜像的动作由 daemon 执行,不是终端里的 docker 命令直接发请求。
为什么改环境变量没用?
很多人在终端里设置 HTTP_PROXY/HTTPS_PROXY,然后执行 docker pull,发现依然超时。这是因为这些变量只影响 shell 进程和它启动的子进程(比如你手动运行的 curl),但不影响后台运行的 dockerd 进程。Docker Desktop 启动后,daemon 是由 macOS 的 launchd 管理的独立服务,它不读取你的 shell 环境变量。
正确做法:给 dockerd 配置系统级代理
macOS 下 Docker Desktop 使用的是自己的后台服务机制,需通过其图形界面配置代理,而非修改 systemd 或手动写 service 文件:
- 打开 Docker Desktop → 右上角菜单 → Settings(或 Preferences)
- 左侧选 Resources → 点开 Proxies
- 勾选 Manual proxy configuration
- 填入代理地址,例如:
HTTP Proxy: http://127.0.0.1:7890
HTTPS Proxy: http://127.0.0.1:7890
(注意:即使代理支持 HTTPS,Docker daemon 也接受 http:// 开头的地址) - 点击 Apply & Restart
验证是否生效
重启后,在终端执行:
docker info | grep -A 5 "HTTP Proxy"
如果看到类似输出:
HTTP Proxy: http://127.0.0.1:7890<br>HTTPS Proxy: http://127.0.0.1:7890
说明 daemon 已加载代理配置。此时再运行 docker pull hello-world,流量就会经由本地代理转发。
补充提醒:镜像源和代理别混用
如果你同时配了 registry-mirrors(如阿里云、轩辕等)和代理,注意优先级:
- registry-mirrors 只对 docker.io 官方镜像生效;其他仓库(quay.io、ghcr.io、私有 registry)仍走代理
- 代理是底层网络层转发,无论目标域名是什么,只要 daemon 发出的 HTTPS 请求,都会先送过去
- 两者不冲突,可以共存:官方镜像优先走镜像源(更快),非官方镜像自动 fallback 到代理











