繞過國內訪問限制下載Docker鏡像的多種方法

繞過國內訪問限制下載Docker鏡像的多種方法

2023年5月,由於未知原因,hub.docker.com在國內無法正常訪問,但仍然可以通過pull命令下載鏡像。

2024年6月,國內的幾家Docker Hub鏡像服務平台公告表示被要求下架並停止服務。目前尚不清楚是否會重新開放或採取白名單模式。

此外,目前國內的華為雲和阿里雲等私有鏡像加速服務也無法使用。

針對這些限制,以下是幾種方便的方法,可幫助需要的用戶正常獲取Docker鏡像。

零門檻

境外鏡像

優點:不需大量修改,只需幾個命令

缺點:網路可能慢或者不穩定

有一個難兄難弟的國家:俄羅斯,被美國制裁無法順利訪問Docker Hub。這裡可以藉助俄羅斯國家的鏡像!

下面命令可直接執行~

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
    "registry-mirrors": [
        "https://docker.m.daocloud.io",
        "https://huecker.io",
        "https://dockerhub.timeweb.cloud",
        "https://noohub.ru"
    ]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

鏡像導出導入

優點:項目部署中可方便使用

缺點:鏡像文件有時候比較大,複製遷移略麻煩

僅需在已經Pull過鏡像的伺服器,導出鏡像,然後在需要pull鏡像的伺服器導入即可!

導出鏡像到xxx.tar

docker save -o <path for generated tar file> <image name>

示例:docker save -o nginx.tar nginx

將xxx.tar複製到其他伺服器上

docker load -i <path to image tar file>
示例:docker load -i nginx.tar

Yandex容器加速

優點:適合單獨pull鏡像使用,俄羅斯大廠提供服務

缺點:不支持配置到 daemon.json

官方鏡像:https://mirror.yandex.ru/

使用方式:docker pull cr.yandex/mirror/nginx

低門檻

Docker使用HTTP代理

優點:可從Docker官方直接拉取

缺點:使用完畢後一定要關閉HTTP代理

首先,代理軟體能訪問Docker Hub官網!這個軟體不多說了我測試使用的是 V2**N。設置軟體支持區域網內訪問。

上面倆篇文章提到給伺服器在Shell窗口添加HTTP代理環境變數,但是Shell窗口代理環境變數對於Docker Pull鏡像的話根本不會生效!

這裡主要介紹如何讓伺服器的Docker Pull的時候能走代理!

1,新建目錄

mkdir -p /etc/systemd/system/docker.service.d

2,新建文件,粘貼並內容,並保存!

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

以下粘貼內容,IP一定要換成你代理軟體運行的電腦的內網IP,通過ipconfig可以查看

埠一定要是代理軟體設置的區域網埠!

[Service]
Environment="HTTP_PROXY=http://192.168.8.125:10819"
Environment="HTTPS_PROXY=http://192.168.8.125:10819"
Environment="NO_PROXY=your-registry.com,10.10.10.10,*.example.com"

3,重啟Docker

systemctl daemon-reload
systemctl restart docker

4,檢查環境變數是否生效

systemctl show --property=Environment docker

高門檻

Cloudflare反向代理

優點:只需有CF賬號就行,自己專屬,不用自己簽發證書

缺點:CF在國內有DNS污染,可能無法正常訪問

簡要步驟:

1,登錄到CF https://dash.cloudflare.com/

2,控制檯面板 -> 左側 Workers 和 Pages -> 創建應用程序 -> 創建 Worker -> 點擊保存 -> 點擊完成 -> 編輯代碼

worker.js 內容

import HTML from './docker.html';
export default {
  async fetch(request) {
    const url = new URL(request.url);
    const path = url.pathname;
    const originalHost = request.headers.get("host");
    const registryHost = "registry-1.docker.io";
    if (path.startsWith("/v2/")) {
      const headers = new Headers(request.headers);
      headers.set("host", registryHost);
      const registryUrl = `https://${registryHost}${path}`;
      const registryRequest = new Request(registryUrl, {
        method: request.method,
        headers: headers,
        body: request.body,
        redirect: "follow",
      });
      const registryResponse = await fetch(registryRequest);
      console.log(registryResponse.status);
      const responseHeaders = new Headers(registryResponse.headers);
      responseHeaders.set("access-control-allow-origin", originalHost);
      responseHeaders.set("access-control-allow-headers", "Authorization");
      return new Response(registryResponse.body, {
        status: registryResponse.status,
        statusText: registryResponse.statusText,
        headers: responseHeaders,
      });
    } else {
      return new Response(HTML.replace(/{{host}}/g, originalHost), {
        status: 200,
        headers: {
          "content-type": "text/html"
        }
      });
    }
  }
}

新建文件 docker.html 粘貼下面內容

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>鏡像使用說明</title>
    <style>
        body {
            font-family: 'Roboto', sans-serif;
            margin: 0;
            padding: 0;
            background-color: #f4f4f4;
        }
        .header {
            background: linear-gradient(135deg, #667eea, #764ba2);
            color: #fff;
            padding: 20px 0;
            text-align: center;
            box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
        }
        .container {
            max-width: 800px;
            margin: 40px auto;
            padding: 20px;
            background-color: #fff;
            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
            border-radius: 10px;
        }
        .content {
            margin-bottom: 20px;
        }
        .footer {
            text-align: center;
            padding: 20px 0;
            background-color: #333;
            color: #fff;
        }
        pre {
            background-color: #272822;
            color: #f8f8f2;
            padding: 15px;
            border-radius: 5px;
            overflow-x: auto;
        }
        code {
            font-family: 'Source Code Pro', monospace;
        }
        a {
            color: #4CAF50;
            text-decoration: none;
        }
        a:hover {
            text-decoration: underline;
        }
        @media (max-width: 600px) {
            .container {
                margin: 20px;
                padding: 15px;
            }
            .header {
                padding: 15px 0;
            }
        }
    </style>
    <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&family=Source+Code+Pro:wght@400;700&display=swap" rel="stylesheet">
</head>
<body>
    <div class="header">
        <h1>鏡像使用說明</h1>
    </div>
    <div class="container">
        <div class="content">
            <p>為了加速鏡像拉取,你可以使用以下命令設置 registry mirror:</p>
            <pre><code>sudo tee /etc/docker/daemon.json &lt;&lt;EOF
{
    "registry-mirrors": ["https://{{host}}"]
}
EOF</code></pre>
            <p>為了避免 Worker 用量耗盡,你可以手動 pull 鏡像然後 re-tag 之後 push 至本地鏡像倉庫:</p>
            <pre><code>docker pull {{host}}/library/alpine:latest # 拉取 library 鏡像
docker pull {{host}}/coredns/coredns:latest # 拉取 coredns 鏡像</code></pre>
        </div>
    </div>
    <div class="footer">
        <p>Powered by Cloudflare Workers</p>
    </div>
</body>
</html>

3,點擊部署即可

4,綁定自定義域名

設置 -> 觸發器 -> 自定義域 -> 點擊【添加自定義域】

演示地址:dockerhub.o0o.us.kg

Nginx反向代理

優點:需要有境外伺服器

缺點:網路可能慢或者不穩定

這種方法需要自己有一台境外伺服器,簽發域名證書。按下面配置即可!

這裡博主並未測試,下面內容僅供參考

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;
            }
    }

其他開源項目

https://github.com/NoCLin/LightMirrors

https://github.com/bboysoulcn/registry-mirror

最後總結

1,如臨時使用,建議參與零門檻幾個方案,方便快捷

2,據說後面pip源可能也會受到影響,可用採用HTTP代理方式

3,國內阿里雲,騰訊雲均提供私有鏡像服務,大家可用嘗試看看

原創文章,作者:簡單一點,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/110283.html

(1)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
簡單一點的頭像簡單一點
上一篇 2024-06-04 15:52
下一篇 2024-07-11 21:52

相關推薦

  • docker-ce-18.03.1.ce-1.el7.centos.x86_64需要pigz這個依賴的解決方案

    當我們在linux centos系統中安裝docker-ce-18.03.1.ce-1.el7.centos.x86_64時,有時可能會遇到「nothing provides pi…

    編程 2025-04-29
  • 如何解決Docker+k8s報錯413 Request Entity Too Large

    對於使用Docker容器和Kubernetes集群的開發人員,在處理HTTP請求時,常常會遇到413 Request Entity Too Large的報錯。這通常是由於請求的大小…

    編程 2025-04-27
  • docker-compose編寫用法介紹

    本文將詳細介紹docker-compose編寫的各個方面,包括語法、常見命令等等,旨在幫助讀者更好的了解如何使用docker-compose。 一、docker-compose的語…

    編程 2025-04-27
  • Docker 垃圾電腦的解決方案

    Docker 是一種輕量級的容器化技術,可以在一個操作系統中,同時運行多個獨立的應用。在使用 Docker 的過程中,可能會出現 Docker 佔用大量硬碟空間,導致電腦變得極其緩…

    編程 2025-04-27
  • Docker掛載目錄–graph用法介紹

    本文將從如下幾個方面詳細闡述Docker掛載目錄–graph: 一、基本概念 在Docker中,鏡像是由一系列只讀層組成的文件系統。當我們啟動一個容器時,Docker會…

    編程 2025-04-27
  • Docker批量刪除容器詳解

    一、前言 Docker是一個開源的應用容器引擎,提供了一種輕量級容器化技術,方便快捷的進行應用打包、發布、運行。作為廣泛應用的技術之一,Docker是開發、測試、運維的得力助手。但…

    編程 2025-04-25
  • Docker鏡像管理

    一、查看所有鏡像 使用docker命令可以很輕鬆地查看所有已經構建好的鏡像,命令如下: docker images 該命令將列出所有本地docker主機上所有的鏡像: REPOSI…

    編程 2025-04-25
  • Docker內網穿透全解析

    一、什麼是Docker內網穿透 Docker是一個優秀的容器化技術,可以將應用程序和服務打包成輕量級的容器進行管理和部署。但是,Docker容器默認只能在內網環境中進行通信,如果需…

    編程 2025-04-25
  • Docker MySQL 5.7詳解

    一、Docker簡介 Docker是一種輕量級容器技術,可以輕鬆構建,發布和運行應用程序和服務。Docker容器類似於虛擬機,但不需要運行虛擬機本身,而是直接在主機上運行。這使得D…

    編程 2025-04-25
  • Docker-Compose教程詳解

    一、概述 Docker-Compose是Docker官方提供的一款使得在一個單機上運行多個容器應用程序變得簡單的工具。它使用YAML文件來配置應用程序的服務,此外還可以輕鬆地啟動、…

    編程 2025-04-25

發表回復

登錄後才能評論