前言

太棒啦2024年6月6日,因为脑子一歪全国docker加速源下架,官方源全部sni阻断。

记录一些加速源,以及搭建镜像源方案,

现有加速源

肯定是没有以前用国内镜像源舒服的了,都是海外节点,不知道以后有没有头大的用国内服务器搭建,如果自己用的话也可以自己用国内服务器搭建。

现有挺多是用cloudflare做节点的,但是我发现,现在cloudflare的任何IP会出现全国,突发性阻断,每次出现持续10分钟左右,不知道后续会不会平稳下来。

我的加速源

https://docker.lmirror.top

电信联通速度较快,移动一般。

G口服务器,无限请求数(还在测试中),还请不要滥用。

自建方案与教程

现有方案有如 harber,nexus,docker-registry ,nginx,cloudflare Workers反代等。

reigistry(私有仓库)搭建

搭建私有仓库可能会受到拉取官方源限制(单IP每6小时100次请求),可通过定时切换warp的IP来获得更多次数

首先创建一个compose.yaml文件,然后在当前目录运行docker compose up -d

services:
  registry:
    image: registry:2.8.3
    ports:
      - "5000:5000"
    environment:
      REGISTRY_PROXY_REMOTEURL: https://registry-1.docker.io
      REGISTRY_STORAGE_CACHE_BLOBDESCRIPTOR: inmemory
    volumes:
      - ./data:/var/lib/registry

如果是用1P面板,这个就是编排模板

清理镜像的话,建议直接清空registry文件夹内容,然后重启容器,走官方命令清理不干净的

接着用nginx反向代理一下127.0.0.1:5000,即可

cloudflare Workers

进入cf在左侧导航栏下面有一个workers和pages,点进去,选择创建应用程序。先确定确定创建成功后,再修改代码。

复制如下代码即可

worker.js:

	import HTML from './docker.html';
 
export default {
    async fetch(request) {
        const url = new URL(request.url);
        const path = url.pathname;
        const originalHost = request.headers.get("host");
        const registryHost = "registry-1.docker.io";
 
        if (path.startsWith("/v2/")) {
        const headers = new Headers(request.headers);
        headers.set("host", registryHost);
 
        const registryUrl = `https://${registryHost}${path}`;
        const registryRequest = new Request(registryUrl, {
            method: request.method,
            headers: headers,
            body: request.body,
 
            redirect: "follow",
        });
 
        const registryResponse = await fetch(registryRequest);
 
        console.log(registryResponse.status);
 
        const responseHeaders = new Headers(registryResponse.headers);
        responseHeaders.set("access-control-allow-origin", originalHost);
        responseHeaders.set("access-control-allow-headers", "Authorization");
        return new Response(registryResponse.body, {
            status: registryResponse.status,
            statusText: registryResponse.statusText,
            headers: responseHeaders,
        });
        } else {
        return new Response(HTML.replace(/{{host}}/g, originalHost), {
            status: 200,
            headers: {
            "content-type": "text/html"
            }
        });
        }
    }
}

docker.html:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <title>Mirror</title>
        <style>
        html {
        height: 100%;
        }
        body {
        font-family: "Roboto", "Helvetica", "Arial", sans-serif;
        font-size: 16px;
        color: #333;
        margin: 0;
        padding: 0;
        height: 100%;
        display: flex;
        flex-direction: column;
        justify-content: space-between;
 
        }
        .container {
            margin: 0 auto;
            max-width: 600px;
        }
 
        .header {
            background-color: #438cf8;
            color: white;
            padding: 10px;
            display: flex;
            align-items: center;
        }
 
        h1 {
            font-size: 24px;
            margin: 0;
            padding: 0;
        }
 
        .content {
            padding: 32px;
        }
 
        .footer {
            background-color: #f2f2f2;
            padding: 10px;
            text-align: center;
            font-size: 14px;
        }=
        </style>
    </head>
    <body>
        <div class="header">
        <h1>Mirror Usage</h1>
        </div>
        <div class="container">
        <div class="content">
            <p>镜像加速说明</p>
            <p>
            为了加速镜像拉取,你可以使用以下命令设置registery mirror:
            </p>
            <pre>
            sudo tee /etc/docker/daemon.json &lt;&lt;EOF
            {
                "registry-mirrors": ["https://{{host}}"]
            }
            EOF
            </pre>
            </br>
            <p>
            为了避免 Worker 用量耗尽,你可以手动 pull 镜像然后 re-tag 之后 push 至本地镜像仓库:
            </p>
            <pre>
            docker pull {{host}}/library/alpine:latest # 拉取 library 镜像
            docker pull {{host}}/coredns/coredns:latest # 拉取 library 镜像
            </pre>
        </div>
        </div>
        <div class="footer">
        <p>Powered by Cloudflare Workers</p>
        </div>
    </body>
</html>

cf默认的IP是被阻断的,建议在workers设置里-触发器-添加路由。添加自己的域名。

nginx+workers反代

创建一个nginx网站,修改nginx.conf配置,注意配置自己的证书,自己的域名,自己的日志存储地址

server {
            listen 443 ssl;
            server_name docker.lmirror.top;
            access_log /www/sites/docker.lmirror.top/log/access.log main;
            error_log /www/sites/docker.lmirror.top/log/error.log; 
            ssl_session_timeout 24h;
            ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1 TLSv1; 
            ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; 
 
            location / {
                    proxy_pass https://registry-1.docker.io;  # Docker Hub 的官方镜像仓库
 
                    proxy_set_header Host registry-1.docker.io;
                    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_buffering off;
 
                    # 转发认证相关的头部
                    proxy_set_header Authorization $http_authorization;
                    proxy_pass_header  Authorization;
 
                    # 对 upstream 状态码检查,实现 error_page 错误重定向
                    proxy_intercept_errors on;
                    # error_page 指令默认只检查了第一次后端返回的状态码,开启后可以跟随多次重定向。
                    recursive_error_pages on;
                    # 根据状态码执行对应操作,以下为301、302、307状态码都会触发
                    error_page 301 302 307 = @handle_redirect;
 
                    error_page 429 = @handle_too_many_requests;
            }
            #处理重定向
            location @handle_redirect {
                    resolver 1.1.1.1;
                    set $saved_redirect_location '$upstream_http_location';
                    proxy_pass $saved_redirect_location;
            }
            # 处理429错误
            location @handle_too_many_requests {
                    proxy_set_header Host 103.xxx.42.xxx;  # 替换为其他服务器的地址
                    proxy_pass https://xxx.xxx.workers.dev;#你在workers的域名
                    proxy_set_header Host $http_host;
            }
            ssl_certificate /www/sites/docker.lmirror.top/ssl/fullchain.pem; 
            ssl_certificate_key /www/sites/docker.lmirror.top/ssl/privkey.pem; 
            proxy_ssl_server_name on; # 启用SNI
    }

WARP

按需求,可设置每30分钟执行两次 warp o (开关warp切换IP),注意两次之间的执行间隔在1分钟左右

wget -N https://gitlab.com/fscarmen/warp/-/raw/main/menu.sh && bash menu.sh