Docker daemon.json 配置 HTTP 代理的核心目标是让 docker pull 和守护进程对外通信走代理,突破网络限制、提升镜像拉取速度;它作用于 daemon 层而非容器内应用,推荐使用 proxies 字段按 registry 精确配置,支持不同仓库指定不同代理且互不干扰。
docker daemon.json 配置 http 代理,核心目标是让 镜像拉取(docker pull) 和 守护进程对外通信 走代理,从而突破网络限制、提升下载速度。它不作用于容器内应用的联网行为,而是作用于 docker 自身——也就是 daemon 层。
注意:这不是给容器“加速网络”,而是让 Docker 守护进程能更稳定、更快地从远程 registry(比如 docker.io、ghcr.io、私有仓库)拉取镜像。真正让容器内程序访问外网,需另外在 run 或 Dockerfile 中配置环境变量。
✅ 推荐方式:用 proxies 字段按 registry 精确配置
这是 Docker 官方推荐、最安全可控的方式,支持为不同镜像源设置不同代理,互不干扰。
编辑 /etc/docker/daemon.json(若不存在则新建):
{
"proxies": {
"https://registry-1.docker.io": {
"httpProxy": "http://192.168.10.5:8080",
"httpsProxy": "http://192.168.10.5:8080",
"noProxy": "localhost,127.0.0.1,.internal.example.com"
},
"https://ghcr.io": {
"httpProxy": "http://10.0.1.20:3128"
}
}
}-
https://registry-1.docker.io是 Docker Hub 的实际访问地址,必须写全(不能只写docker.io) -
httpProxy和httpsProxy可以都填 HTTP 地址(Docker 允许用 HTTP 代理转发 HTTPS 流量) -
noProxy用于跳过内网 registry 或本地服务,避免代理环路
保存后执行:
sudo systemctl daemon-reload sudo systemctl restart docker
验证是否生效:
sudo docker info | grep -A 5 "HTTP Proxy"
应看到类似 HTTP Proxy: http://192.168.10.5:8080 的输出。
⚠️ 替代方式:全局 default 代理(适合简单场景)
如果所有 registry 都走同一个代理,且无需区分,可简化为:
{
"proxies": {
"default": {
"httpProxy": "http://127.0.0.1:7890",
"httpsProxy": "http://127.0.0.1:7890",
"noProxy": "localhost,127.0.0.1,.local"
}
}
}-
default表示未显式匹配的 registry 都走此代理 - 仍建议配好
noProxy,防止代理请求打到宿主机内部服务(如私有 registry、Consul、etcd)
❌ 不推荐的做法(常见误区)
- 直接在
/etc/default/docker或用户 shell 中设HTTP_PROXY环境变量:Docker daemon 通常不读取这些,尤其 systemd 管理时无效 - 用
proxychains docker pull:只代理了 CLI 进程,daemon 内部网络请求不受影响 - 在
~/.docker/config.json里配proxies:这只影响 Docker CLI 的构建和 push/pull 行为(部分版本),但不保证 daemon 拉取镜像一定走它,可靠性低
? 小贴士:搭配镜像加速器效果更佳
代理解决“连得上”,镜像加速器解决“下得快”。两者可共存:
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
"proxies": {
"default": {
"httpProxy": "http://127.0.0.1:7890"
}
}
}国内用户建议优先加镜像加速器;若加速器不可用(如拉取非 Docker Hub 的镜像),再启用对应 registry 的代理。
不复杂但容易忽略。


















