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
。