
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 <<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-hk/n/110283.html