跳到主要内容

Docker 代理镜像

在天朝,由于众所周知的原因,Docker Hub 现在已经被完全封锁,国内镜像站也接连关闭,我们需要自行搭建代理镜像。

其实也很简单,Docker官方提供了 registry 镜像,具有代理上游镜像的功能,我们只需要在服务器上运行一个 registry 镜像,然后在本地配置 Docker 客户端,就可以通过代理镜像拉取镜像了。

搭建代理镜像

在一个自由的服务器上运行 registry ,话不多说,直接上 docker-compose.yml 配置:

services:
docker-mirror:
image: registry:latest
container_name: docker-mirror
restart: unless-stopped
environment:
REGISTRY_HTTP_ADDR: 0.0.0.0:5000
REGISTRY_PROXY_REMOTEURL: https://registry-1.docker.io
REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data/docker
REGISTRY_AUTH_HTPASSWD_REALM: basic-realm
REGISTRY_AUTH_HTPASSWD_PATH: /data/htpasswd
volumes:
- ./data:/data
networks:
- proxy
labels:
- "traefik.enable=true"
- "traefik.docker.network=proxy"
- "traefik.http.routers.docker-mirror.rule=Host(`docker-mirror.example.com`)"
- "traefik.http.routers.docker-mirror.entrypoints=websecure"
- "traefik.http.routers.docker-mirror.service=docker-mirror"
- "traefik.http.services.docker-mirror.loadbalancer.server.port=5000"

networks:
proxy:
external: true

以上是基于 Traefik 的配置,如果你不使用 Traefik,可以去掉相关的 labels 配置,并设置自己的反向代理。

data/htpasswd 是用于认证的用户名密码文件,可以通过 htpasswd 命令生成:

htpasswd -B -c data/htpasswd username

配置 Docker 客户端

首先登录我们刚刚创建的代理镜像:

docker login docker-mirror.example.com

由于整个 Docker Hub 都被封锁了,配置 Docker Mirrors 是无效的,因为 mirrors 指的是从哪里下载镜像文件,而获取镜像元数据还是通过 Docker Hub 的 API,所以我们需要修改容器的 tag,让其从我们的代理镜像拉取。

这里的 docker-mirror.example.com 是你的代理镜像地址。

例如 nginx:latest 要替换为 docker-mirror.example.com/library/nginx:latest,这样就会从我们的代理镜像拉取了,完全不经过 Docker Hub。再多举几个例子:

  • docker pull nginx:latest -> docker pull docker-mirror.example.com/library/nginx:latest
  • docker pull example/image:tag -> docker pull docker-mirror.example.com/example/image:tag

如果你想代理其他镜像站,只需要修改 REGISTRY_PROXY_REMOTEURL 的值即可,例如 ghcr.io 为 https://ghcr.io,quay.io 为 https://quay.io,gcr.io 为 https://gcr.io