從 Docker Hub 拉取映象受阻?這些解決方案幫你輕鬆應對

Rainbond开源發表於2024-06-21

最近一段時間 Docker 映象一直是 Pull 不下來的狀態,感覺除了掛🪜,想直連 Docker Hub 是幾乎不可能的。更糟糕的是,很多原本可靠的國內映象站,例如一些大廠和高校運營的,也陸續關停了,這對我們這些個人開發者和中小企業來說是挺難受的。之前,透過這些映象站,我們可以快速、方便地獲取所需的 Docker 映象,現在這條路也不行了。感覺這次動作不小,以後想直接訪問 Docker Hub 是不可能了。所以我們得想辦法搭建自己的私有映象倉庫。

最近網上有很多解決 Docker Hub 映象拉不下來的文章,我大概總結一下有以下幾種辦法:

Github Action

利用 Github Action Job 將 Docker Hub 映象重新打 Tag 推送到阿里雲等其他公有云映象倉庫裡,這對於需要單個映象很方便,批次就稍微麻煩一些,如果沒🪜Github 訪問也是個問題。

CloudFlare Worker

使用 CloudFlare Worker 對 Docker Hub 的訪問請求做中轉,這種也是最近使用比較多的,因為個人使用者的免費計劃每天有10萬次免費請求,足夠個人和中小企業使用了,實在不夠可以花 5$ 購買不限制的。Worker 指令碼在網上有很多,隨便搜尋都有示例。

因為 CloudFlare Worker 預設分配的workers.dev結尾的域名國內根本解析不了,所以要把域名託管在 CloudFlare 上才能正常使用,可以購買 .xyz 等其他費用合適的域名專門用來做代理訪問。

但 CloudFlare Worker CDN 經常抽風,有時很快有時很慢,可以藉助自選優選IP工具幫助獲取訪問 CloudFlare 延遲最低的IP,將其寫入到你的本地 Hosts 檔案中。

自建映象倉庫

說到自建首先我想到的就是買個配置比較低國外的伺服器,搭建個 Nginx 做代理,分享下我配置成功的 Nginx 配置檔案:

server {
  listen 443 ssl;
  server_name 域名;
  ssl_certificate 證書地址;
  ssl_certificate_key 金鑰地址;

  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;
    proxy_intercept_errors on;
    recursive_error_pages on;
    error_page 301 302 307 = @handle_redirect;
  }
  location @handle_redirect {
    resolver 1.1.1.1;
    set $saved_redirect_location '$upstream_http_location';
    proxy_pass $saved_redirect_location;
  }
}

然後就可以直接用 docker pull 域名/library/nginx:latest 獲取映象了或者配置到 Docker 的daemon.json中。

Nginx 代理的方案你需要能購買到合適的國外伺服器,不然網路會很慢。

又或者在國外伺服器上搭建 Registry、Nexus、Harbor等映象倉庫,它們具備映象快取功能,如果私有映象倉庫中不存在則會去代理服務中獲取最新映象。

建議方案

所以對於個人使用者、中小企業來說可以將上述的 CloudFlare Worker + 自建映象倉庫 融合起來,本地搭建 Registry、Nexus、Harbor等映象倉庫,在映象倉庫中配置上自己的 CloudFlare Worker Nginx反代 等代理地址或者當前一些可用的其他代理,當本地不存在則會透過這些代理去獲取映象,代理不可用時本地依然能用。

搭建 Docker Registry

搭建 Docker Registry 可以參考下述命令:

docker run -d --restart=always --name registry \
-p 443:443
-e REGISTRY_PROXY_REMOTEURL=https://registry-1.docker.io \ #代理的映象倉庫URL
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 \ #監聽地址
-e REGISTRY_HTTP_HOST=https://xxx.cn \ #訪問域名
-e REGISTRY_HTTP_TLS_CERTIFICATE=/opt/cert/cert.pem \ #域名證書
-e REGISTRY_HTTP_TLS_KEY=/opt/cert/cert.key \ #域名證書
-v /opt/cert:/opt/cert \ #掛載本地證書到容器中
-v /data:/var/lib/registry \ #持久化資料目錄
registry:2

搭建 Nexus

可選擇使用 Docker 命令搭建 Nexus

docker run -d -p 8081:8081 --name nexus sonatype/nexus3

或者使用 Rainbond 應用商店一鍵安裝。

搭建完成後正常登入 Nexus 頁面,根據頁面引導配置 Docker 相關的儲存 Repository 及代理 Repository 即可。

搭建 Harbor

可參考 Harbor文件 搭建或者使用 Rainbond 應用商店一鍵安裝。

可用的映象代理

最近十來天我嘗試了很多映象加速站,整理了以下映象站目前是可用狀態,但可能隨時會遇到不可用、關停、訪問比較慢的狀態,建議同時配置多個映象源。

提供商 地址
DaoCloud https://docker.m.daocloud.io
阿里雲 https://<your_code>.mirror.aliyuncs.com 登入阿里雲分配
Docker映象代理 https://dockerproxy.com 看運氣
百度雲 https://mirror.baidubce.com
南京大學 https://docker.nju.edu.cn
中科院 https://mirror.iscas.ac.cn

福利

近期 Rainbond 社群也接受到許多使用者反饋 Docker 映象拉不下來,不能構建、打包了,因此 Rainbond 也搭建了個映象加速服務,採用 CloudFlare + 國外伺服器 Nginx 反代的方案為 Rainbond 社群的使用者們提供映象加速服務。

目前速度挺快的(未來不好說

使用方法

1.直接獲取 Docker Hub 映象

docker pull docker.rainbond.cc/library/node:20
docker pull docker.rainbond.cc/rainbond/rainbond:v5.17.2-release-allinone

2.配置映象加速器

tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://docker.rainbond.cc"]
}
EOF
systemctl daemon-reload
systemctl restart docker

相關文章