前言
Docker Hub 的服务器位于国外,在国内直接 docker pull 经常遇到超时、下载缓慢甚至连接失败的情况。对于使用 Docker 的开发者和运维人员来说,配置镜像加速几乎是必做的一步。
本文将介绍几种主流的加速方案,从最简单的配置到自建加速器,覆盖不同场景。
一、原理简述
Docker 镜像加速的本质是将 Docker Hub 的镜像缓存到国内的服务器。当你 docker pull 时,Docker 守护进程会先请求配置的镜像加速器地址,如果加速器上有缓存,直接从国内拉取;如果没有,加速器会从 Docker Hub 拉取后再返回给你。
整个过程对你来说是透明的,拉取命令不变,只是底层请求地址变了。
二、方案一:配置 Registry Mirror(推荐)
这是最标准、最省事的方案。修改 Docker 守护进程配置,添加一个或多个镜像加速地址。
2.1 找到配置文件
BASH
# Docker 默认配置文件路径
sudo vim /etc/docker/daemon.json
如果文件不存在,直接创建即可。
2.2 写入配置
JSON
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.xuanyuan.me"
]
}
目前国内可用的公共镜像加速地址变化较快,以下几点需要注意:
- 阿里云加速器:登录阿里云容器服务控制台后,每个账号有一个专属地址(格式如
https://<你的ID>.mirror.aliyuncs.com),建议优先使用 - 中科大镜像:
https://docker.mirrors.ustc.edu.cn(有时不稳定) - 网易镜像:
https://hub-mirror.c.163.com - 其他第三方镜像:本文不一一列举,搜索引擎搜索"国内可用 Docker 镜像加速"获取最新列表
⚠️ 公共镜像加速器随时可能关闭或限流,建议配置 2–3 个地址作为备选。
2.3 重启 Docker 使配置生效
BASH
sudo systemctl daemon-reload
sudo systemctl restart docker
2.4 验证配置
BASH
docker info | grep -A 5 "Registry Mirrors"
如果输出中显示了刚才配置的地址,说明配置成功。
TEXT
Registry Mirrors:
https://docker.1ms.run/
https://docker.xuanyuan.me/
接着拉取一个镜像测试速度:
BASH
docker pull nginx:alpine
感受一下对比——配置前可能要等一两分钟,配置后基本在 10 秒内完成。
三、方案二:单次拉取使用代理地址
不想修改全局配置?可以针对单个镜像手动指定代理地址。
格式为 docker pull <代理地址>/library/<镜像名>:<标签>:
BASH
# 拉取 nginx:alpine(官方镜像需要在前面加 library)
docker pull docker.1ms.run/library/nginx:alpine
# 拉取第三方镜像
docker pull docker.1ms.run/portainer/portainer-ce:latest
缺点是每次拉取都要手动拼接地址,拉取后的镜像名也会包含代理前缀。可以通过 docker tag 改回来:
BASH
docker tag docker.1ms.run/library/nginx:alpine nginx:alpine
docker rmi docker.1ms.run/library/nginx:alpine
这种方法适合偶尔拉一次镜像的场景,不推荐日常使用。
四、方案三:使用代理拉取
如果你本身就在使用代理(HTTP/SOCKS5),可以直接让 Docker 守护进程通过代理拉取镜像。
4.1 创建 Docker 客户端配置目录
BASH
mkdir -p ~/.docker
4.2 写入代理配置
JSON
{
"proxies": {
"default": {
"httpProxy": "http://127.0.0.1:7890",
"httpsProxy": "http://127.0.0.1:7890",
"noProxy": "localhost,127.0.0.1"
}
}
}
这里的 7890 需要替换为你本机代理客户端的 HTTP 端口。
4.3 重启 Docker
BASH
sudo systemctl restart docker
此方案的优点是所有镜像请求都走代理,不需要依赖公共镜像加速器。缺点是需要本地有稳定的代理服务,且 Docker 守护进程本身的流量也会被代理。
五、方案四:自建 Registry Mirror(进阶)
如果你有一台海外的云服务器,或者本博客之前介绍过的 Cloudreve 等服务的同机部署,可以自建一个 Registry Mirror,不再受公共加速器状态的影响。
5.1 拉取 Registry 镜像
先找一台能正常拉取镜像的机器,拉取 registry 镜像:
BASH
docker pull registry:2
5.2 导出并传输镜像
BASH
docker save registry:2 -o registry.tar
# 将 registry.tar 传到目标服务器
scp registry.tar root@你的服务器IP:/root/
5.3 在目标服务器上导入并启动
BASH
# 导入镜像
docker load -i registry.tar
# 启动镜像加速服务
docker run -d --name registry-mirror \
-p 5000:5000 \
-v /data/registry:/var/lib/registry \
-e REGISTRY_PROXY_REMOTEURL=https://registry-1.docker.io \
--restart unless-stopped \
registry:2
5000是加速服务端口,可以按需修改/data/registry是缓存数据目录,建议分配足够的磁盘空间REGISTRY_PROXY_REMOTEURL指向 Docker Hub 官方地址
5.4 在其他机器上使用自建加速器
将自建加速器地址添加到 daemon.json:
JSON
{
"registry-mirrors": [
"http://你的服务器IP:5000"
]
}
注意:自建加速器如果没有配置 HTTPS,地址协议是
http://而非https://。Docker 从 24.0 版本起默认要求加速器使用 HTTPS,如果是内网使用需要在daemon.json中添加"insecure-registries": ["你的服务器IP:5000"]。
5.5 验证
BASH
docker info | grep -A 5 "Registry Mirrors"
docker pull nginx:alpine # 第一次拉取后会缓存到本地
第二次拉取同样的镜像时,直接从缓存返回,速度极快。
5.6 (可选)搭配 Nginx 反向代理添加 HTTPS
如果需要公网暴露加速服务,建议加一层 Nginx 反代并配置 SSL 证书:
NGINX
server {
listen 443 ssl;
server_name mirror.lonze.io;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
六、docker pull 超时或失败的排查思路
配置了加速器后如果仍然拉取失败,按以下顺序排查:
| 步骤 | 命令/操作 | 说明 |
|---|---|---|
| 1 | docker info |
确认 Registry Mirrors 配置已生效 |
| 2 | curl -I https://你的镜像加速地址/v2/ |
测试加速器是否可达 |
| 3 | ping registry-1.docker.io |
测试 Docker Hub 连通性 |
| 4 | journalctl -u docker --no-pager | tail -30 |
查看 Docker 守护进程日志 |
| 5 | 检查防火墙 | 确保 443 端口出站未被拦截 |
常见错误及解决方案:
dial tcp: lookup xxx on xx.xx.xx.xx: no such host→ DNS 解析失败,检查/etc/resolv.conf,尝试添加8.8.8.8或223.5.5.5net/http: TLS handshake timeout→ 网络超时,检查代理或防火墙规则client time exceeded deadline→ 拉取时间过长,docker pull加--platform linux/amd64尝试指定平台
七、总结
| 方案 | 维护成本 | 速度 | 适用场景 |
|---|---|---|---|
| 配置公共镜像加速器 | 低 | ⭐⭐⭐ | 绝大多数用户首选 |
| 单次拉取使用代理地址 | 低 | ⭐⭐ | 不常拉镜像的临时场景 |
| Docker 走代理 | 中 | ⭐⭐⭐⭐⭐ | 已有代理环境的用户 |
| 自建 Registry Mirror | 高 | ⭐⭐⭐⭐⭐ | 有海外服务器的进阶用户 |
我的建议:大多数用户配置公共镜像加速器就够了。如果你恰好在自己的服务器上折腾 Docker,又恰好有一台海外机器,自建加速器是一个一劳永逸的方案。
⚠️ 免责提示:本文仅用于技术研究与学习目的。配置镜像加速器或代理属于常规运维操作,请确保自己的使用方式符合所在地法律法规及 Docker 服务条款。
