使用代理机器缓存gcr的镜像

因为伟大的gfw的问题,每次下载镜像都需要在有开启了HTTP(S)_PROXY的docker主机上pull下来,save之后复制到目标机器再load到node节点本地。
那么我们现在可以通过registry的proxy和dns欺骗的方式来实现只需要一台机器来代理并缓存gcr.io的镜像的功能。

  • 在代理机器的docker配置HTTP(S)_PROXY,保证可以拉取到外网的镜像(这一步应该不是必须的)
  • 运行registry的服务
docker run -d -p 80:5000 --restart=always -e HTTPS_PROXY=$proxy_addr:$port --name registry -v /data/registry:/var/lib/registry -v pwd/config.yml:/etc/docker/registry/config.yml registry:2

$proxy_addr:$port可以是同个内网网络中的ss客户端启用了允许来自局域网的连接功能,那么这个proxy_addr就是http://$proxy_addr:$port的格式,走http代理,当然也可以是socks5的代理。

config.yml的配置内容仅是在默认的配置上添加了proxy

version: 0.1
log:
fields:
service: registry
storage:
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
http:
addr: :5000
headers:
X-Content-Type-Options: [nosniff]
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
proxy:
remoteurl: https://gcr.io

然后把客户机的hosts文件中添加记录,将gcr.io指向到代理机的IP地址

最后一步添加配置到docker的配置文件daemon.json

{
"registry-mirrors": ["http://gcr.io"],
"insecure-registries": ["http://gcr.io"]
}

因为代理机上面的registry没有使用tls,所以需要添加insecure的选项。
接下来你就可以很愉快地pull外网镜像。