mirrorrequest
mirrorrequest copied to clipboard
提供常见docker镜像
由于 gcr, quay 等上游链接很有问题,目前也取消了反代。我觉得可以换个方式,对于一些常见镜像,在本地镜像一份。镜像的工具可以使用 skopeo https://github.com/containers/skopeo/blob/master/docs/skopeo-sync.1.md
具体是:
- 本地先起一个docker registry(可以用Nginx控制只能GET/HEAD请求来限制用户push)
- 然后定时使用 skopeo sync 镜像到本地的 docker registry
我本地的一个的 skopeo sync 的配置文件:
k8s.gcr.io:
images:
pause:
- 3.1
- 3.2
kube-apiserver:
- v1.18.3
- v1.18.4
- v1.18.5
kube-controller-manager:
- v1.18.3
- v1.18.4
- v1.18.5
kube-scheduler:
- v1.18.3
- v1.18.4
- v1.18.5
kube-proxy:
- v1.18.3
- v1.18.4
- v1.18.5
etcd:
- 3.4.3-0
- 3.4.7-0
coredns:
- 1.6.7
然后同步脚本:
skopeo --insecure-policy sync --src yaml --dest docker images.yaml private.docker-hub.local
另外,skopeo 是 Go 写的,可以方便地用 socks5 代理,配置为:
export https_proxy=socks5://127.0.0.1:1080
export no_proxy='private.docker-hub.local'
不过有个问题是,怎么界定哪些是常见镜像呢……
不过有个问题是,怎么界定哪些是常见镜像呢……
和我们界定哪些软件/系统源需要镜像一样。
这是个问题
可以投票,某人想要某个image,在这里创建一个issue,超过50人点赞就认为是常见的。
Starting November 1, 2020:
Anonymous users will have an upper limit of 100 image pulls in a six hour period Accounts authenticated with a DockerID will have an upper limit of 200 image pulls in a six hour period Pro and Team subscriptions do not have limits
近期 Docker Hub 会开始限制 docker pull 的频率,而很多常见镜像都有许多版本,例如说 Debian 的官方 Docker 镜像就有 6 个架构的几十个不同版本,Docker Hub 的这个限制很可能使得我们无法及时同步所有的镜像。
不过有个问题是,怎么界定哪些是常见镜像呢……
https://github.com/docker-library/official-images
对于 Docker Hub 来说,可以优先同步 Official images。~~另外对于 Docker Hub 的 pull limit,申请 Docker Open Source Program 可能可以解决。~~ 不行,Docker Open Source Program 只能解除自己的 namespace。
我今天试了一下,~~看起来 skopeo 目前不支持 sync 到只有 HTTP endpoint 的 registry(必须要 HTTPS),这样的话可能需要额外的 nginx 配置。~~ 可以设置 skopeo login --tls-verify=false
, skopeo sync --dest-tls-verify=false
而如果 sync 目标设置为 dir,下载得到的文件也不能直接用于 registry,并且不支持断点续传(如果文件夹存在,就会直接退出),所以只能通过 sync 到 registry 来做同步。
近期 Docker Hub 会开始限制 docker pull 的频率,而很多常见镜像都有许多版本,例如说 Debian 的官方 Docker 镜像就有 6 个架构的几十个不同版本,Docker Hub 的这个限制很可能使得我们无法及时同步所有的镜像。
这个建议做成一个分布式的工具软件, 统一发布一个脚本,各人都可以下载 以 ustc 作为中心库, 开放已验证用户的上传权限, 然后大家可以注册账户,审核通过后 可以自行上传常用img。
感谢大佬提供的思路。 以下是按照思路所做的实现
加速器只允许 GET HEAD 请求方法
只允许docker-library/official-images通过加速器
控制允许通过加速的路径,自己用自己配置map选项即可
服务启动配置
version: "3"
services:
docker-registry:
image: registry:2
container_name: registry-01
restart: always
ports:
- "5001:5000"
expose:
- "5000"
volumes:
- /data/tls:/tls
# - /data/data-box/docker-registry:/data # 数据目录
environment:
- REGISTRY_PROXY_REMOTEURL=https://registry-1.docker.io
# - REGISTRY_PROXY_USERNAME=username
# - REGISTRY_PROXY_PASSWORD=password
- REGISTRY_HTTP_TLS_CERTIFICATE=/tls/wildcard.xiaoshuogeng.com.fullchain.pem
- REGISTRY_HTTP_TLS_KEY=/tls/wildcard.xiaoshuogeng.com.key.pem
- REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/data
nginx-proxy:
image: nginx:alpine
container_name: nginx-proxy-docker-registry
restart: always
depends_on:
- docker-registry
ports:
- "5000:443"
volumes:
- /data/tls:/tls
- ./default.conf:/etc/nginx/conf.d/default.conf
nginx 配置信息
# 只允许docker-library/official-images通过,其他允许的自己添加路径
map $uri $allow_uri_flag {
default 0 ;
~^\/v2\/library\/.*? 1;
}
server {
listen 443 ssl http2;
server_name docker.xiaoshuogeng.com;
charset utf-8;
ssl_certificate /tls/wildcard.xiaoshuogeng.com.fullchain.pem;
ssl_certificate_key /tls/wildcard.xiaoshuogeng.com.key.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
ssl_session_tickets off;
ssl_protocols TLSv1.3;
ssl_prefer_server_ciphers off;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
add_header Content-Security-Policy upgrade-insecure-requests;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header Referrer-Policy "no-referrer";
# 判断请求方法是否是GET HEAD ,其他方法不允许
set $allow_allow_request_method_flag 0;
if ( $request_method = "GET" ) {
set $allow_allow_request_method_flag 1;
}
if ( $request_method = "HEAD" ) {
set $allow_allow_request_method_flag 1;
}
if ( $allow_allow_request_method_flag != 1 ) {
return 405 '{"status":"405","result":"请求方法不允许","message":"405"}';
}
if ( $allow_uri_flag != 1 ) {
return 403 '{"status":"403","result":"请求URI不允许","message":"403"}';
}
location / {
proxy_pass https://docker-registry:5000;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Range $http_range;
proxy_set_header If-Range $http_if_range;
}
}
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
server_name _;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_reject_handshake on; #非服务器名称的 SSL 握手直接拒绝
return 444;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 444;
}
配置文档也写到这里了:
k8s 已经开始使用containerd,那么把 registry-1.docker.io 更换为registry.k8s.io、 k8s.gcr.io、 gcr.io 就能缓存k8s 相关镜像了