利用nginx反向代理加速docker映象拉取

厚礼蝎發表於2024-06-18

背景

之前寫過一篇“利用cloudflare workers解決docker無法拉取映象問題”的部落格

cloudflare workers 本質上也是使用的反向代理,只是用了cloudflare免費的服務罷了

但操作過就會發現,流量並不能得到保證,有時快又是慢,甚至對於部分地區的人都不支援cloudflare

如果需求非常迫切,可以利用自己的伺服器,透過nginx反向代理,這樣拉取映象的速度就是自己伺服器的速度了,如果伺服器速度足夠快,跑滿自己的寬頻速度都不是問題。

但是,相比於cloudflare,自己搭伺服器是肯定有成本的,也就無法免費白嫖了。

準備資源

  • 一臺海外伺服器,國內共有云廠商也都有提供海外伺服器的服務,直接購買就可以了,新使用者甚至可以白嫖,同時最重要的是需要有一定的頻寬,否則,拉取速度也還是有限。
  • 一個自己的域名 這裡以docker.abc.com作為例子
  • 域名對應的證書

部署

購買海外雲伺服器

這裡就不做贅述了

安裝系統環境

系統 nginx版本
ubuntu 22.04 nginx/1.18.0

安裝nginx

apt install nginx -y

配置

vim /etc/nginx/sites-enabled/default

server {
	    #同時監聽80和443埠
        listen     80;
	    listen     443 ssl;
	    server_name  docker.abc.com;# 需要修改成自己的域名
	    charset utf-8;
	
        if ( $scheme = 'http' ) {
            return 302 https://docker.abc.com/;# 需要修改成自己的域名
	    }
	
	    #設定證書部分
	    ssl_certificate ssl/fullchain.pem;
	    ssl_certificate_key ssl/privkey.pem;
	    ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
        location / {
                    # Docker hub 的官方映象倉庫
                    proxy_pass https://registry-1.docker.io;  
                    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;
                    recursive_error_pages on;
                    # 根據狀態碼執行對應操作,以下為381、302、387狀態碼都會觸發
                    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;
        }
}

需要注意的是,證書存放在 /etc/nginx/ssl 資料夾中

解析域名

需要將域名解析成這個伺服器的公網地址,並在防火牆上做對應的放通

重啟服務

systemctl restart nginx
systemctl enable nginx.servic

測試拉取

例如 要拉取busybox的最新映象

之前的方式是

docker pull busybox:latest

透過代理來訪問,就需要修改成

docker pull docker.abc.com/library/busybox:latest

如果不希望這麼麻煩

直接修改docker的配置檔案

vim /etc/docker/daemon.json

{
    "registry-mirrors": [
        "https://docker.abc.com"
    ],
}

然後重啟docker

systemctl restart docker

最後該怎麼拉取映象還是怎麼拉取。

相關文章