嫌麻烦,不想操作的话,也可以跳过文章阅读,直接用这个镜像仓库:https://dockerhub.xianfish.site

DockerHub在国内已经被封禁了,并且之前用到的镜像仓库也都不能用了。对于经常使用Docker的我们来说,会非常不方便。不过兵来将挡水来土掩,也有解决的办法。本文将详细介绍几个方案。

开始之前,先讲解一下核心思路。跟Google、YouTube被封禁一个道理,我们想要访问它们就需要有VPN。我们通过VPN访问Google的时候,实际上请求会到VPN提供商的某个海外服务器,然后经过海外服务器再到Google的服务器。所以要想在国内继续访问DockerHub,不管什么方法,基本都是需要有一个海外服务器做中转。这个海外服务器需要具备两个条件:

  1. 国内能访问到该海外服务器
  2. 该海外服务器能访问到DockerHub

找到合适的海外服务器之后,我们大概有两类办法:

  1. 转存:将我们需要的镜像通过海外服务器下载下来,然后再转存到国内的镜像仓库中。
  2. 代理:因为Docker的镜像仓库是基于Http协议的,因此我们也可以通过在海外服务器上部署反向代理设施,比如Nginx来直接代理DockerHub。

转存

GithubActions+阿里云镜像仓库(推荐)

GithubActions是Github提供的自动化构建部署工具,可以实现当我们在push代码或者提交issue的时候自动执行一些流水线逻辑。类似GitlabCI。因为Github是部署在海外的,而且还免费,所以我们可以完全通过在actions里面完成镜像的下载,然后再转存的过程。

阿里云镜像仓库则是阿里云提供的镜像仓库服务,只要有阿里云账号,就可以申请个人版仓库。可以有300个仓库的免费额度。

20240713-rMkyh6MUeZ.png

20240713-5vNFP1dq5P.png具体操作步骤只需要fork下面这个git仓库,然后按照ReadMe中的一步一步操作即可。
镜像转存代码仓库

代理

CloudflareWorkers(推荐)

CloudFlareWorkers是Cloudflare,一家国外公司的无服务架构理念产品。通俗来讲就是我们可以使用js或者python来写业务逻辑,然后直接免费部署到cloudflare的服务器上。这里的免费是有额度的,每天可以免费10万条请求,对个人来讲是足够的。

具体可以参考下面这篇文章:
巧用CF的Workers完美解决Docker镜像国内无法拉取
这个步骤就比较繁琐,流程如下:

  1. 购买域名,可以在阿里云,也可以去申请免费域名eu.org。阿里云买需要钱,首年一般10块,免费域名申请就比较慢,我至今没有申请下来。
  2. 注册Cloudflare账号,然后将买来的域名托管给Cloudflare。其实就在域名供应商那里修改dns服务器为Cloudflare的。
  3. 开发Workers并部署,代码可以直接复制博客中的。

如果嫌麻烦,可以直接使用我的:镜像仓库

使用方法就是直接修改docker的配置(/etc/docker/daemon.json),修改registry-mirrors为我们的地址即可。

{
    "registry-mirrors": ["https://dockerhub.xianfish.site"]
}

除了Cloudflare,提供无服务架构服务的产品还有挺多,我们也可以用其他熟悉的产品代理Cloudflare,比如Vercel。

Nginx反向代理

前面的方案基本都不需要服务器,这个方案就需要我们有海外的服务器才行了。

首先购买一台海外的服务器,然后部署Nginx。可以使用Docker部署,然后调整nginx的配置文件nginx.conf,增加下面内容:

server {
            listen 443 ssl;
            server_name 域名;

            ssl_certificate 证书地址;
            ssl_certificate_key 密钥地址;

            proxy_ssl_server_name on; # 启用SNI

            ssl_session_timeout 24h;
            ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
            ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;

            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 替换为在CloudFlare Worker设置的域名;  # 替换为另一个服务器的地址
                    proxy_pass http://替换为在CloudFlare Worker设置的域名;
                    proxy_set_header Host $http_host;
            }
    }

正向代理

正向代理,就是在给我们的Docker所在的服务器配置上VPN。

mkdir -p /etc/systemd/system/docker.service.d
vim /etc/systemd/system/docker.service.d/http-proxy.conf

配置VPN信息,将代理替换成实际的VPN地址即可。

[Service]
Environment="HTTP_PROXY=http://xxx"
Environment="HTTPS_PROXY=http://xxxx"
# 不需要走代理的地址
Environment="NO_PROXY=your-registry.com"

然后重启Docker,查看环境变量是否生效:

systemctl show --property=Environment docker

总结

以上几种办法,各有优劣。

GithubActions+阿里云镜像仓库最大的好处就是免费,只不过就是用的时候麻烦一些。每次拉镜像都需要提个issue或者push一次代码。

使用Cloudflare的好处在于基本就是获得了一个完全的mirror仓库,配置成功后基本就跟dockerhub被禁前的效果一样,缺点就是门槛稍高,配置比较麻烦,另外就是可能会有一个小小的支出:购买域名。

正向代理和反向代理都不太推荐,因为成本是最高的,门槛也是最高的。需要自己采购服务器,搭建服务。


[重要提示]

所有博客内容,在我的个人博客网站可见,欢迎访问: TwoFish


咸鱼
1 声望0 粉丝