#!/bin/bash # 颜色定义 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 "======================================" # 定义镜像源 declare -A MIRRORS=( ["阿里云"]="mirrors.aliyun.com" ["中科大"]="mirrors.ustc.edu.cn" ["清华"]="mirrors.tuna.tsinghua.edu.cn" ["华为云"]="repo.huaweicloud.com" ["腾讯云"]="mirrors.cloud.tencent.com" ) # 使用Docker的实际安装包进行测速(更大更真实) TEST_PATHS=( "docker-ce/pool/stable/amd64/containerd.io_1.7.28-1_amd64.deb" "docker-ce/pool/stable/amd64/docker-ce_25.0.5-1~debian.12~bookworm_amd64.deb" ) # 存储结果 declare -A AVG_SPEEDS # 真实下载测速函数 real_speed_test() { local mirror_name=$1 local mirror_url=$2 echo -e "${YELLOW}测试 ${mirror_name} (${mirror_url})...${NC}" 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 AVG_SPEEDS["$mirror_name"]=0 echo -e " ${RED}❌ 所有测速失败${NC}" fi echo "" } # 备用测速方法:使用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 < /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