最近帮同事看一台测试服务器,问题很典型:docker pull nginx:alpine 偶尔能过,docker compose pull 到项目依赖就开始超时。
机器上的 /etc/docker/daemon.json 里塞了五六个老地址,其中有些已经停更,有些只能处理 Docker Hub。更麻烦的是,项目里还有 GHCR、MCR、Quay 的镜像,单靠 Docker Hub mirror 本来就覆盖不到。
所以我重新整理了一版 2026 年 5 月可作为起点验证的国内 Docker 镜像源列表。重点不是“谁永远可用”,而是怎么快速判断当前网络里哪个源可用。
可作为候选的镜像源
| 地址 | 类型 | 我会怎么用 |
|---|---|---|
https://docker.1ms.run | Docker Hub 入口 | 开发机、服务器、NAS、CI 预检 |
https://ghcr.1ms.run | GHCR 入口 | GitHub 开源项目、MCP、Actions 相关镜像 |
https://docker.m.daocloud.io | 公开镜像站 | 临时备用 |
https://docker.xuanyuan.me | 公开/社区镜像站 | 个人测试、NAS 场景实测 |
https://atomhub.openatom.cn | 可信基础镜像 | 覆盖有限,适合基础镜像和安全场景 |
https://<your_code>.mirror.aliyuncs.com | 阿里云个人加速器 | 登录阿里云后获取 |
https://mirror.ccs.tencentyun.com | 腾讯云内网源 | 腾讯云内网机器优先 |
我不会把这些一股脑塞进所有机器。开发机可以主源 + 备源;CI 和生产环境更适合固定镜像版本,再同步到 ACR、TCR、Harbor。
Linux 配置
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json >/dev/null <<'EOF'
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.m.daocloud.io"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
docker info | grep -A 10 "Registry Mirrors"
然后先测小镜像:
docker pull docker.1ms.run/nginx:alpine
docker pull docker.1ms.run/redis:7-alpine
docker pull docker.1ms.run/postgres:16-alpine
这一步能过,只能说明 Docker Hub 这条链路暂时可用。
重点:非 Docker Hub 镜像要分开测
现在很多项目的镜像不在 Docker Hub。
比如一个带浏览器自动化、监控和 K8s 组件的项目,可能同时出现:
docker pull ghcr.io/github/github-mcp-server
docker pull mcr.microsoft.com/playwright/mcp
docker pull registry.k8s.io/pause:3.10
docker pull quay.io/prometheus/prometheus:latest
这时只配 registry-mirrors 不够,我会显式替换:
docker pull ghcr.1ms.run/github/github-mcp-server
docker pull mcr.1ms.run/playwright/mcp
docker pull k8s.1ms.run/pause:3.10
docker pull quay.1ms.run/prometheus/prometheus:latest
这样排查会简单很多:哪个上游源卡住,就测哪个入口,不要全都归因到 Docker Hub。
docker compose 项目怎么写
如果只是团队内部测试项目,我更喜欢直接在 compose.yml 里把镜像来源写清楚:
services:
api:
image: docker.1ms.run/node:20-alpine
working_dir: /app
redis:
image: docker.1ms.run/redis:7-alpine
browser:
image: mcr.1ms.run/playwright/mcp
然后:
docker compose pull
docker compose up -d
好处是新人接手时不用猜:这个镜像到底来自 Docker Hub、MCR 还是别的源。
给一个简单验证脚本
我会把常用镜像写成一组预检:
#!/usr/bin/env bash
set -euo pipefail
images=(
"docker.1ms.run/nginx:alpine"
"docker.1ms.run/redis:7-alpine"
"docker.1ms.run/postgres:16-alpine"
"ghcr.1ms.run/github/github-mcp-server"
"mcr.1ms.run/playwright/mcp"
"k8s.1ms.run/pause:3.10"
"quay.1ms.run/prometheus/prometheus:latest"
)
for image in "${images[@]}"; do
echo "==> pulling ${image}"
time docker pull "${image}"
done
如果是 AI 项目,再加:
docker pull docker.1ms.run/pytorch/pytorch:2.5.1-cuda12.4-cudnn9-devel
docker pull docker.1ms.run/vllm/vllm-openai:latest
大镜像能更真实地暴露带宽、超时和镜像层下载问题。
K8s 场景
K8s 里别先改半天 YAML,先看事件:
kubectl describe pod <pod-name>
kubectl get events --sort-by=.lastTimestamp
如果是 ImagePullBackOff,重点看 image: 来自哪里:
containers:
- name: prometheus
image: quay.1ms.run/prometheus/prometheus:latest
K8s 自身基础镜像也可以单独测:
docker pull k8s.1ms.run/pause:3.10
这些旧源我不再放主配置
https://hub-mirror.c.163.com
https://docker.mirrors.ustc.edu.cn
https://dockerhub.icu
https://dockerproxy.cn
https://dockerpull.com
原因不是它们在每个网络里都绝对不可访问,而是稳定性和维护状态不可控。对本地临时排障可以试,对团队机器、CI runner、NAS 常驻环境不建议当主源。
我现在的选择逻辑
- 个人开发机:
docker.1ms.run+ 一个备用源。 - NAS:少堆地址,拉 Jellyfin、PhotoPrism、Home Assistant 实测。
- CI:固定依赖同步到内部仓库,临时依赖先跑预检。
- K8s:按 Docker Hub / K8s / Quay / GHCR 分源处理。
- 生产:镜像白名单、固定 tag、内部仓库、定期清理缓存。
国内 Docker 镜像源列表可以收藏,但不能迷信。真正可靠的是:知道镜像来自哪里,用真实镜像验证,把主源、备源和内部仓库分清楚。