Skip to content

Docker 拉取镜像慢?配置镜像加速器

docker pull 慢、卡在 Pulling fs layer、甚至 TLS handshake timeout,是因为默认从 Docker Hub(境外)拉取。解决分两种情况:Docker Hub 镜像用加速器,GHCR / 私有镜像走代理。

一、配置镜像加速器(针对 Docker Hub)

镜像加速器(registry mirror)会把 Docker Hub 的拉取请求代理到国内节点。

Linux:编辑 /etc/docker/daemon.json(没有就新建):

json
{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com"
  ]
}

重启 Docker:

bash
sudo systemctl daemon-reload
sudo systemctl restart docker

Docker Desktop(Windows / macOS):Settings → Docker Engine,在 JSON 里加入 registry-mirrors 字段,然后 Apply & Restart。

验证是否生效:

bash
docker info | grep -A5 "Registry Mirrors"

加速器时效性

公共镜像加速器地址会变动或关停。如果配的地址失效,换一个当前可用的即可。企业可自建 registry mirror 最稳。

二、给 Docker 走代理(针对 GHCR / gcr / 私有镜像)

镜像加速器只对 Docker Hub 有效。拉 ghcr.iogcr.ioquay.io 上的镜像,得让 Docker 守护进程走代理。

Linux(systemd):

bash
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf <<'EOF'
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7890"
Environment="HTTPS_PROXY=http://127.0.0.1:7890"
Environment="NO_PROXY=localhost,127.0.0.1"
EOF

sudo systemctl daemon-reload
sudo systemctl restart docker

Docker Desktop:Settings → Resources → Proxies,手动填写 HTTP/HTTPS 代理地址。

注意:docker pull守护进程发起,所以代理要配在 daemon 上,而不是你 shell 的 http_proxy 环境变量。

三、单独给容器内进程走代理

上面是给"拉镜像"配代理。如果是容器里的程序要联网(比如 build 时 apt/pip),那是另一回事:

bash
# build 时传代理
docker build --build-arg HTTP_PROXY=http://127.0.0.1:7890 \
             --build-arg HTTPS_PROXY=http://127.0.0.1:7890 -t myimg .

Linux 上容器访问宿主机代理,127.0.0.1 要换成宿主机地址或用 host.docker.internal(Docker Desktop)。

四、换个 tag 前缀拉取(临时手段)

一些第三方提供 Docker Hub 的镜像代理,可在镜像名前加前缀临时拉取:

bash
docker pull <镜像代理域>/library/nginx:latest
docker tag  <镜像代理域>/library/nginx:latest nginx:latest

搜索"docker 镜像代理"获取当前可用地址。适合临时救急,长期还是配 daemon。

场景速查

拉取来源用什么
Docker Hub(默认)镜像加速器(方法一)
ghcr.io / gcr.io / quay.io守护进程走代理(方法二)
容器内程序联网build-arg / 容器代理(方法三)
临时救急镜像代理前缀(方法四)

小结

  • 拉 Docker Hub 慢 → 配 registry-mirrors
  • 拉 GHCR/私有镜像慢 → 给 docker daemon 配代理(加速器无效)。
  • 分清"拉镜像"和"容器内联网"是两套代理配置。

本文仅供技术学习与研究,请遵守所在国家/地区法律法规。

本站为技术学习交流站点,与 GitHub, Inc. 无任何隶属或官方关系。所有内容仅供技术研究与学习,请遵守所在国家/地区的法律法规。