Update Docker镜像源自动测速脚本

This commit is contained in:
2025-10-31 21:19:55 +08:00
committed by GitHub
parent 3cb1fcb7a2
commit 2bc0b34a30

View File

@@ -1,186 +1,33 @@
#!/bin/bash #!/bin/bash
# 颜色定义 echo "🔄 使用真实存在的文件测试下载速度..."
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
echo -e "${BLUE}🐳 Docker镜像源真实速度测试脚本${NC}"
echo "======================================" echo "======================================"
# 定义镜像源 # 使用确实存在的测试文件
declare -A MIRRORS=( TEST_FILES=(
["阿里云"]="mirrors.aliyun.com" "http://speedtest.ftp.otenet.gr/files/test1Mb.db" # 国际测速文件
["中科大"]="mirrors.ustc.edu.cn" "http://ipv4.download.thinkbroadband.com/1MB.zip" # 英国测速
["清华"]="mirrors.tuna.tsinghua.edu.cn" "http://cachefly.cachefly.net/100mb.test" # 美国CDN
["华为云"]="repo.huaweicloud.com"
["腾讯云"]="mirrors.cloud.tencent.com"
) )
# 使用Docker的实际安装包进行测速更大更真实 # 或者使用国内真实存在的文件
TEST_PATHS=( DOMESTIC_FILES=(
"docker-ce/pool/stable/amd64/containerd.io_1.7.28-1_amd64.deb" "http://mirrors.aliyun.com/ubuntu/ls-lR.gz"
"docker-ce/pool/stable/amd64/docker-ce_25.0.5-1~debian.12~bookworm_amd64.deb" "http://mirrors.ustc.edu.cn/ubuntu/ls-lR.gz"
"http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ls-lR.gz"
) )
# 存储结果 for url in "${DOMESTIC_FILES[@]}"; do
declare -A AVG_SPEEDS domain=$(echo "$url" | awk -F/ '{print $3}')
echo "测试 $domain ..."
# 真实下载测速函数 # 下载5秒并计算平均速度
real_speed_test() { speed=$(timeout 5 curl -L "$url" -o /dev/null --progress-bar -w "%{speed_download}" 2>/dev/null | awk '{printf "%.0f", $1/1024}')
local mirror_name=$1
local mirror_url=$2
echo -e "${YELLOW}测试 ${mirror_name} (${mirror_url})...${NC}" if [[ $speed && $speed -gt 0 ]]; then
echo "✅ 下载速度: $speed KB/s"
local total_speed=0
local test_count=0
local max_speed=0
# 测试多个文件取平均值
for test_path in "${TEST_PATHS[@]}"; do
local test_url="https://${mirror_url}/${test_path}"
echo -n " 下载测速中..."
# 使用wget进行真实下载测速下载10秒
local speed_info=$(timeout 10 wget --progress=dot:binary --output-document=/dev/null "$test_url" 2>&1 | grep -o '[0-9.]\+ [KMG]B/s' | tail -1)
if [[ $speed_info ]]; then
# 提取速度数值
local speed_value=$(echo "$speed_info" | awk '{print $1}')
local speed_unit=$(echo "$speed_info" | awk '{print $2}')
# 统一转换为KB/s
case $speed_unit in
"MB/s")
speed_kbs=$(echo "$speed_value * 1024" | bc -l 2>/dev/null | awk '{printf "%.2f", $1}')
;;
"GB/s")
speed_kbs=$(echo "$speed_value * 1024 * 1024" | bc -l 2>/dev/null | awk '{printf "%.2f", $1}')
;;
"KB/s")
speed_kbs=$speed_value
;;
*)
speed_kbs=0
;;
esac
if [[ $speed_kbs != "0" ]]; then
echo -e " ${GREEN}$speed_info ≈ $(echo "$speed_kbs" | awk '{printf "%.0f", $1}') KB/s${NC}"
total_speed=$(echo "$total_speed + $speed_kbs" | bc -l)
test_count=$((test_count + 1))
# 记录最大速度
if (( $(echo "$speed_kbs > $max_speed" | bc -l) )); then
max_speed=$speed_kbs
fi
else
echo -e " ${RED}测速失败${NC}"
fi
else
echo -e " ${RED}无法连接${NC}"
fi
sleep 1
done
# 计算平均速度
if [[ $test_count -gt 0 ]]; then
local avg_speed=$(echo "scale=2; $total_speed / $test_count" | bc -l)
AVG_SPEEDS["$mirror_name"]=$avg_speed
echo -e " ${GREEN}✅ 平均速度: $(echo "$avg_speed" | awk '{printf "%.0f", $1}') KB/s (峰值: $(echo "$max_speed" | awk '{printf "%.0f", $1}') KB/s)${NC}"
else else
AVG_SPEEDS["$mirror_name"]=0 echo "❌ 测试失败"
echo -e " ${RED}❌ 所有测速失败${NC}"
fi fi
echo "---"
echo "" done
}
# 备用测速方法使用speedtest-cli
network_benchmark() {
echo -e "${BLUE}🌐 进行网络基准测试...${NC}"
if command -v speedtest-cli &> /dev/null; then
speedtest-cli --simple
else
echo "安装speedtest-cli: sudo apt install speedtest-cli"
fi
echo ""
}
# 更换镜像源
change_mirror() {
local fastest_mirror=$1
local fastest_url=$2
echo -e "${GREEN}🎯 切换到最快的镜像源: ${fastest_mirror}${NC}"
# 备份原配置
sudo cp /etc/apt/sources.list.d/docker.list /etc/apt/sources.list.d/docker.list.bak.$(date +%Y%m%d_%H%M%S) 2>/dev/null || true
# 创建新的Docker源配置
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null <<EOF
deb [arch=amd64] https://${fastest_url}/docker-ce/linux/debian bookworm stable
EOF
echo -e "${GREEN}✅ 已更新Docker镜像源${NC}"
sudo apt update
}
main() {
# 先进行网络基准测试
network_benchmark
echo -e "${BLUE}📡 开始真实下载速度测试...${NC}"
echo -e "${YELLOW}注意:这将实际下载部分文件,需要较长时间${NC}"
echo ""
# 检查依赖
if ! command -v wget &> /dev/null; then
echo "安装wget: sudo apt install wget"
sudo apt update && sudo apt install -y wget bc
fi
# 测试所有镜像源
for mirror_name in "${!MIRRORS[@]}"; do
real_speed_test "$mirror_name" "${MIRRORS[$mirror_name]}"
done
# 找出最快的
fastest_mirror=""
fastest_speed=0
echo -e "${BLUE}📊 最终测速结果:${NC}"
echo "======================================"
for mirror_name in "${!AVG_SPEEDS[@]}"; do
speed=${AVG_SPEEDS[$mirror_name]}
echo -e " ${mirror_name}: $(echo "$speed" | awk '{printf "%.0f", $1}') KB/s"
if (( $(echo "$speed > $fastest_speed" | bc -l) )); then
fastest_speed=$speed
fastest_mirror=$mirror_name
fi
done
echo ""
if [[ -n "$fastest_mirror" && $(echo "$fastest_speed > 10" | bc -l) -eq 1 ]]; then
echo -e "${GREEN}🚀 推荐镜像源: ${fastest_mirror}${NC}"
echo -e "${GREEN}📈 平均速度: $(echo "$fastest_speed" | awk '{printf "%.0f", $1}') KB/s${NC}"
read -p "是否更换镜像源?(y/N): " confirm
if [[ $confirm =~ ^[Yy]$ ]]; then
change_mirror "$fastest_mirror" "${MIRRORS[$fastest_mirror]}"
fi
else
echo -e "${RED}❌ 网络状况不佳,建议检查网络连接${NC}"
fi
}
main