什么是 Pull Through Cache?
Pull Through Cache(拉取式缓存)位于容器客户端和上游 Registry 之间。首次请求某个镜像时,服务会从上游 Registry 拉取并缓存镜像;后续请求可以直接使用本地缓存,从而减少重复的公网传输并提升校内拉取速度。如果缓存中没有所需镜像,首次拉取的速度仍取决于上游 Registry 的可用性和网络状况。
本服务仅面向浙江大学校内网络提供,无需登录。请勿向校外用户发布代理地址或将其配置为面向公网的服务依赖。
本服务设有白名单,仅放行白名单内的镜像。白名单以 DaoCloud public-image-mirror 项目的 allows.txt 为参考:该列表是已在国内备案、提供 m.daocloud.io 镜像服务的公开列表,因此能够确保所放行的镜像合规且安全。
如果你需要拉取的镜像不在白名单中,请前往 DaoCloud/public-image-mirror 提交 issue 申请添加。
配置客户端,保留原镜像名
可以在客户端配置代理,继续使用原来的镜像名;也可以按下文「在镜像名中指定代理」的方法逐个修改镜像名。
| 客户端 | 配置方式 | 适用范围 |
|---|---|---|
| Docker Engine / Docker Desktop | registry-mirrors |
Docker Hub |
| Podman / Buildah / Skopeo | registries.conf 前缀映射 |
本服务代理的全部 Registry |
| containerd | hosts.toml |
下方配置适用于 Docker Hub |
| 独立 BuildKit / Buildx builder | buildkitd.toml |
下方配置适用于 Docker Hub |
Docker Engine / Docker Desktop
将下面的字段合并到 /etc/docker/daemon.json,保留文件中已有的其他配置。JSON 不支持注释。
{
"registry-mirrors": ["https://docker.mirrors.zjusct.io"]
}
在使用 systemd 的 Linux 上,执行 sudo systemctl restart docker 应用配置。重启可能影响正在运行的容器,请选择合适的时间。Rootless Docker 通常使用 ~/.config/docker/daemon.json,通过 systemctl --user restart docker 重启。Docker Desktop 请在 Settings → Docker Engine 中合并同样的配置并应用。
随后可以保持原镜像名:
docker pull ubuntu:24.04
docker pull prom/prometheus:latest
Compose 文件中的 Docker Hub 镜像名也无需修改。registry-mirrors 只作用于 Docker Hub,不会代理 ghcr.io、quay.io 等其他 Registry;这些镜像仍需使用下方的显式代理前缀。
镜像服务不可用或拒绝请求时,Docker 可能回退到 Docker Hub 直连,因此拉取成功不一定代表使用了缓存。此配置适用于白名单内的匿名拉取;对代理域名执行 docker login 不会让 Docker 自动在原名拉取时使用该域名的凭据。需要使用本服务访问令牌时,应使用 registry.mirrors.zjusct.io/<项目>/<镜像> 的显式名称。
Podman / Buildah / Skopeo:配置所有 Registry
将下面的完整配置保存为 /etc/containers/registries.conf.d/99-zju-mirrors.conf。个人配置可放在 ~/.config/containers/registries.conf.d/99-zju-mirrors.conf;已有用户配置可能覆盖系统配置,请检查当前生效的规则,避免为同一前缀重复定义。
[[registry]]
prefix = "docker.io"
location = "registry.mirrors.zjusct.io/hub.docker.com"
[[registry]]
prefix = "ghcr.io"
location = "registry.mirrors.zjusct.io/ghcr.io"
[[registry]]
prefix = "quay.io"
location = "registry.mirrors.zjusct.io/quay.io"
[[registry]]
prefix = "nvcr.io"
location = "registry.mirrors.zjusct.io/nvcr.io"
[[registry]]
prefix = "registry.k8s.io"
location = "registry.mirrors.zjusct.io/registry.k8s.io"
[[registry]]
prefix = "registry.gitlab.com"
location = "registry.mirrors.zjusct.io/registry.gitlab.com"
[[registry]]
prefix = "public.ecr.aws"
location = "registry.mirrors.zjusct.io/public.ecr.aws"
[[registry]]
prefix = "mcr.microsoft.com"
location = "registry.mirrors.zjusct.io/mcr.microsoft.com"
[[registry]]
prefix = "docker.elastic.co"
location = "registry.mirrors.zjusct.io/docker.elastic.co"
[[registry]]
prefix = "gcr.io"
location = "registry.mirrors.zjusct.io/gcr.io"
[[registry]]
prefix = "k8s.gcr.io"
location = "registry.mirrors.zjusct.io/k8s.gcr.io"
[[registry]]
prefix = "us.gcr.io"
location = "registry.mirrors.zjusct.io/us.gcr.io"
[[registry]]
prefix = "lscr.io"
location = "registry.mirrors.zjusct.io/lscr.io"
[[registry]]
prefix = "docker.osgeo.org"
location = "registry.mirrors.zjusct.io/docker.osgeo.org"
这会将匹配的 Registry 前缀替换为代理地址,无需重启服务。此处使用直接 location 映射,不配置上游回退。
podman pull docker.io/library/ubuntu:24.04
podman pull quay.io/prometheus/prometheus:latest
skopeo inspect docker://registry.k8s.io/pause:3.10
建议使用带 Registry 域名的完整原名,避免 Podman 短名称解析交互。Docker Hub 的官方镜像使用 docker.io/library/<镜像名>。此配置不会修改 Docker daemon 或 Kubernetes 所使用的 containerd 配置。
containerd(包括使用 containerd 的 Kubernetes 节点)
为 Docker Hub 创建 /etc/containerd/certs.d/docker.io/hosts.toml:
server = "https://registry-1.docker.io"
[host."https://docker.mirrors.zjusct.io"]
capabilities = ["pull", "resolve"]
让 CRI 插件读取该目录。将对应版本的配置合并到 /etc/containerd/config.toml,不要用以下片段替换整个文件。
containerd 2.x、配置版本 3:
[plugins."io.containerd.cri.v1.images".registry]
config_path = "/etc/containerd/certs.d"
containerd 1.x、配置版本 2:
[plugins."io.containerd.grpc.v1.cri".registry]
config_path = "/etc/containerd/certs.d"
首次修改 config_path 后需重启 containerd;目录已启用时,更新其中的 hosts.toml 通常无需重启。K3s、RKE2 等发行版可能自行生成运行时配置,应使用发行版提供的 Registry 配置入口。
CRI 使用示例:
sudo crictl pull docker.io/library/ubuntu:24.04
ctr 不读取 CRI 插件配置,需要显式指定目录:
sudo ctr images pull --hosts-dir /etc/containerd/certs.d docker.io/library/ubuntu:24.04
上面的 server 保留了 Docker Hub 直连回退。其他 Registry 可先使用显式代理镜像名;不要仅给 hosts.toml 的 URL 添加 Harbor 项目路径,这不足以正确转换鉴权 scope。
独立 BuildKit / Docker Buildx
独立的 BuildKit daemon 不应假定会继承 Docker daemon 的镜像配置。在 buildkitd.toml 中合并:
[registry."docker.io"]
mirrors = ["docker.mirrors.zjusct.io"]
独立 buildkitd 需要加载该文件并重启。使用 Buildx 的 docker-container driver 时,可创建加载此配置的 builder:
docker buildx create --name zju-mirror --driver docker-container --buildkitd-config ./buildkitd.toml --use
docker buildx inspect --bootstrap
Dockerfile 中仍可写 FROM ubuntu:24.04。该配置只覆盖 Docker Hub,且镜像失败时客户端仍可能尝试上游。
在镜像名中指定代理
在原镜像名称前添加 registry.mirrors.zjusct.io/,并保留原 Registry 的域名。例如:
docker pull registry.mirrors.zjusct.io/ghcr.io/owner/image:tag
docker pull registry.mirrors.zjusct.io/registry.k8s.io/pause:3.10
docker pull registry.mirrors.zjusct.io/quay.io/prometheus/prometheus:latest
Docker Hub 镜像
Docker Hub 镜像经常省略 Registry 域名,官方镜像还会省略 library/ 命名空间。通过本代理拉取时,这两部分都必须明确写出:
| 通常写法 | 通过代理拉取 |
|---|---|
ubuntu:24.04 |
registry.mirrors.zjusct.io/hub.docker.com/library/ubuntu:24.04 |
library/nginx:stable |
registry.mirrors.zjusct.io/hub.docker.com/library/nginx:stable |
prom/prometheus:latest |
registry.mirrors.zjusct.io/hub.docker.com/prom/prometheus:latest |
也就是说:
- 镜像名中没有 Registry 域名时,补上
hub.docker.com/; - 镜像名只有一个路径段时,它是 Docker Official Image,还要补上
library/; - 最后在完整名称前添加
registry.mirrors.zjusct.io/。
同样的完整镜像名称可以用于 Pod 清单、Compose 文件和其他兼容 OCI/Docker Registry 的工具。例如:
image: registry.mirrors.zjusct.io/hub.docker.com/library/redis:7
已代理的 Registry
当前提供以下上游 Registry 的代理缓存:
| Registry | 代理路径前缀 |
|---|---|
| Docker Hub | registry.mirrors.zjusct.io/hub.docker.com/ |
| GitHub Container Registry | registry.mirrors.zjusct.io/ghcr.io/ |
| Quay | registry.mirrors.zjusct.io/quay.io/ |
| NVIDIA Container Registry | registry.mirrors.zjusct.io/nvcr.io/ |
| Kubernetes Registry | registry.mirrors.zjusct.io/registry.k8s.io/ |
| GitLab Container Registry | registry.mirrors.zjusct.io/registry.gitlab.com/ |
| Amazon ECR Public Gallery | registry.mirrors.zjusct.io/public.ecr.aws/ |
| Microsoft Artifact Registry | registry.mirrors.zjusct.io/mcr.microsoft.com/ |
| Elastic Container Registry | registry.mirrors.zjusct.io/docker.elastic.co/ |
| Google Container Registry | registry.mirrors.zjusct.io/gcr.io/ |
| Kubernetes 旧版 GCR | registry.mirrors.zjusct.io/k8s.gcr.io/ |
| Google US Container Registry | registry.mirrors.zjusct.io/us.gcr.io/ |
| LinuxServer.io | registry.mirrors.zjusct.io/lscr.io/ |
| OSGeo Docker Registry | registry.mirrors.zjusct.io/docker.osgeo.org/ |