DockerHub被禁掉的应对之法
嫌麻烦,不想操作,就直接用这个镜像仓库吧:https://dockerhub.xianfish.site
DockerHub在国内已经被封禁了,并且之前用到的镜像仓库也都不能用了。对于经常使用Docker的我们来说,会非常不方便。不过兵来将挡水来土掩,也有解决的办法。本文将详细介绍几个方案。
开始之前,先讲解一下核心思路。跟Google、YouTube被封禁一个道理,我们想要访问它们就需要有VPN,要科学上网,要翻墙。我们通过VPN访问Google的时候,实际上请求会到VPN提供商的某个海外服务器,然后经过海外服务器再到Google的服务器。所以要想在国内继续访问DockerHub,不管什么方法,基本都是需要有一个海外服务器做中转。这个海外服务器需要具备两个条件:
国内能访问到该海外服务器
该海外服务器能访问到DockerHub
找到合适的海外服务器之后,我们大概有两类办法:
转存:将我们需要的镜像通过海外服务器下载下来,然后再转存到国内的镜像仓库中。
代理:因为Docker的镜像仓库是基于Http协议的,因此我们也可以通过在海外服务器上部署反向代理设施,比如Nginx来直接代理DockerHub。
转存
GithubActions+阿里云镜像仓库(推荐)
GithubActions是Github提供的自动化构建部署工具,可以实现当我们在push代码或者提交issue的时候自动执行一些流水线逻辑。类似GitlabCI。因为Github是部署在海外的,而且还免费,所以我们可以完全通过在actions里面完成镜像的下载,然后再转存的过程。
阿里云镜像仓库则是阿里云提供的镜像仓库服务,只要有阿里云账号,就可以申请个人版仓库。可以有300个仓库的免费额度。
具体操作步骤只需要fork下面这个git仓库,然后按照ReadMe中的一步一步操作即可。
代理
CloudflareWorkers(推荐)
CloudFlareWorkers是Cloudflare,一家国外公司的无服务架构理念产品。通俗来讲就是我们可以使用js或者python来写业务逻辑,然后直接免费部署到cloudflare的服务器上。这里的免费是有额度的,每天可以免费10万条请求,对个人来讲是足够的。
具体可以参考下面这篇文章:
这个步骤就比较繁琐,流程如下:
购买域名,可以在阿里云,也可以去申请免费域名eu.org。阿里云买需要钱,首年一般10块,免费域名申请就比较慢,我至今没有申请下来。
注册Cloudflare账号,然后将买来的域名托管给Cloudflare。其实就在域名供应商那里修改dns服务器为Cloudflare的。
开发Workers并部署,代码可以直接复制博客中的。
如果嫌麻烦,可以直接使用我的:https://dockerhub.xianfish.site。
使用方法就是直接修改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信息
[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被禁前的效果一样,缺点就是门槛稍高,配置比较麻烦,另外就是可能会有一个小小的支出:购买域名。
正向代理和反向代理都不太推荐,因为成本是最高的,门槛也是最高的。需要自己采购服务器,搭建服务。