国内服务器拉取 Docker 镜像时,速度可能只有几十 KB/s,甚至直接超时。一个几百 MB 的基础镜像要等十几分钟,CI 流水线也会跟着卡住。配置阿里云docker镜像加速能解决大部分这类问题。步骤不多,改错了也容易撤回。

拉取镜像为什么会慢
Docker 默认从 Docker Hub 这类海外仓库拉取镜像,请求要走跨境链路。链路抖动、DNS 解析异常或者被限流,下载速度都会忽快忽慢。机器越多,问题越明显。每台服务器都要重复拉同一个镜像,既占带宽,也拖慢部署。
加速器的做法是在本地 Docker 守护进程里设置一个或多个镜像仓库地址(registry-mirrors)。执行 pull 时,Docker 先访问这个加速地址,由阿里云容器镜像服务(ACR)在国内节点提供缓存和分发。镜像名称不用改,docker pull 的写法和原来一样。
第一步:获取专属加速地址
登录阿里云控制台,进入容器镜像服务(ACR)页面,在左侧菜单的“镜像工具”下面找到“镜像加速器”。页面会显示一个以 mirror.aliyuncs.com 结尾的专属地址,格式大致如下:
- https://xxxxxxxx.mirror.aliyuncs.com
把 xxxxxxxx 换成控制台里显示的内容。这个地址和账号绑定,不要写进公开的代码仓库或文档里。
第二步:修改 daemon.json
以 CentOS 或 Ubuntu 服务器为例。如果 /etc/docker/daemon.json 不存在,直接新建:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<'EOF'
{
"registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"]
}
EOF
文件已经存在时,不要整个覆盖。服务器上如果已经配了日志驱动或存储路径,覆盖后这些设置会丢失。正确做法是只在现有 JSON 对象里加一个 registry-mirrors 字段。写完后用 python3 -m json.tool /etc/docker/daemon.json 检查格式。少一个逗号或括号,Docker 就无法启动。
第三步:重载配置并重启 Docker
执行下面两条命令:
sudo systemctl daemon-reload
sudo systemctl restart docker
重启 Docker 会影响正在运行的容器。生产构建节点建议先把任务排空再操作。
然后执行 docker info,在输出的 Registry Mirrors 部分确认刚才配置的地址已经列出。如果没有出现,通常是 daemon.json 的路径或格式有问题,回到第二步检查。
实际效果参考
有一个中型团队的 CI 环境里有 12 台构建节点,每次构建都要拉取约 800MB 的基础镜像。配置前,单次拉取平均约 9 分钟,偶尔因超时导致流水线失败。配置阿里云镜像加速后,同一镜像的拉取时间缩短到 1 分钟以内,失败次数明显减少。这些数字是团队内部的估算。你的结果会受服务器带宽、所在地域和镜像大小影响,最好在自己的机器上测一次。测试方法是先删掉本地镜像,用 time docker pull 记录耗时,配置前后各测几次取平均。
常见问题
- 拉取还是慢:先用
docker info确认 Registry Mirrors 已生效。如果已生效,再检查服务器到阿里云的网络出口。 - 镜像名称:配置后仍然写
nginx:latest或library/nginx即可,不必改成阿里云的完整路径。 - 私有镜像:加速器主要用于公共镜像。推送和拉取自己的私有镜像,要用 ACR 的仓库地址,并先执行
docker login认证。 - Docker Desktop:打开 Settings,进入 Docker Engine,把地址加到
registry-mirrors数组里,然后点击 Apply and restart。 - 地址泄露:如果怀疑专属地址已经外泄,可以在控制台重新生成,并同步更新各台服务器的配置。
小结
配置分三步:获取专属地址、写入 daemon.json、重载并重启 Docker。整个过程不需要改业务代码或镜像名称。建议先在一台机器上验证,确认 Registry Mirrors 生效、拉取速度有提升,再推广到其他节点。改动前先备份原来的 daemon.json,出问题时可以直接恢复。