Docker Hub封禁最全应对方案
近期DockerHub对国内用户进行了大规模封禁,很多开发者无法访问DockerHub。对经常使用Docker进行开发运维同学造成了极大的不便。本文将详细介绍几个解决方案,让大家继续愉快使用Docker。
一、使用国内镜像
国内镜像一直存在更新不及时不稳定的问题,尤其是2024年7月开始国内已要求所有提供镜像站和镜像加速服务的机构停止其服务。因此,如果团队想继续使用国内镜像则必须自行搭建国内镜像。
前置条件:一个境外的VPS或云服务器,能够访问外网DockerHub。 网上有很多Docker镜像搭建教程,本文不再赘述。
这种方法适用于有一定人员规模的公司。
二、搭建反向代理
Nginx反向代理
前置条件:一个境外的VPS或云服务器,能够访问外网DockerHub。
相对于搭建国内镜像的优点是配置简单,对服务器性能要求不高。
首先购买一台海外的服务器,然后部署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的配置(/etc/docker/daemon.json),修改registry-mirrors为我们的地址即可。
{ "registry-mirrors": ["https://dockerhub.test.com"] }
图形界面可以在 Docker daemon 中设置代理;在 Resources 与 Proxies 界面中填写,填写代理服务器地址与端口即可;Clash 一般默认设置是 127.0.0.1:7890;
三、个人电脑转存
-
在个人电脑上访问 Docker Hub 下载所需要的镜像
-
打包成 tar 文件通过 xFTP 软件传输到服务器
-
服务器读取 tar 文件转为镜像
前置条件:
个人电脑可访问外网环境
个人电脑下载 Docker Desktop 客户端
个人电脑可以通过 xFTP 与服务器连接并传输文件
执行步骤
个人电脑
下载镜像:以 Jenkins Agent 为例
docker pull jenkins/inbound-agent
打包镜像为 tar 文件(会保存在当前目录下)
docker save -o jenkins_inbound_agent.tar jenkins/inbound-agent
之后将 jenkins_inbound_agent.tar 通过 FTP 协议传输到 ECS 服务器的任意目录即可
服务器
加载镜像(进入到 jenkins_inbound_agent.tar 所在目录执行命令)
docker load -i jenkins_inbound_agent.tar
四、Github转存
GithubActions+阿里云镜像仓库(推荐)
GithubActions是Github提供的自动化构建部署工具,可以实现当我们在push代码或者提交issue的时候自动执行一些流水线逻辑。因为Github网站是部署在境外的,所以我们可以完全通过在actions里面完成镜像的下载,然后再转存的过程。最重要的是完全免费。
阿里云镜像仓库则是阿里云提供的镜像仓库服务,只要有阿里云账号,就可以申请个人版仓库。可以有300个仓库的免费额度。