#!/usr/bin/env python3
-- coding: utf-8 --
""" Docker 镜像源速度测试工具 基于博客内容:https://blog.csdn.net/yangzhihua/article/details/ 最后更新:2026 年 4 月 14 日 """
import json import subprocess import time from datetime import datetime from typing import Dict, List, Tuple
class DockerMirrorTester:
"""Docker 镜像源测试器""" def __init__(self): self.mirrors = [ { "url": "https://docker.xuanyuan.me", "name": "轩辕镜像(免费版)", "type": "公益加速" }, { "url": "https://docker.1ms.run", "name": "毫秒镜像", "type": "商业服务" }, { "url": "https://docker.m.daocloud.io", "name": "DaoCloud 镜像站", "type": "公益" } ] self.test_image = "nginx:alpine" self.results = [] def check_docker_installed(self) -> bool: """检查 Docker 是否已安装""" try: result = subprocess.run( ["docker", "--version"], capture_output=True, text=True, timeout=5 ) if result.returncode == 0: print(f"✓ Docker 已安装:{result.stdout.strip()}") return True else: print("✗ Docker 未正确安装") return False except (subprocess.TimeoutExpired, FileNotFoundError): print("✗ Docker 未安装或不在 PATH 中") return False def test_mirror_speed(self, mirror_url: str, mirror_name: str) -> Tuple[float, bool]: """测试单个镜像源的速度""" print(f"
正在测试:{mirror_name} ({mirror_url})")
# 构建镜像地址 image_path = f"{mirror_url.replace('https://', '')}/library/{self.test_image}" start_time = time.time() success = False try: # 尝试拉取镜像 result = subprocess.run( ["docker", "pull", image_path], capture_output=True, text=True, timeout=120 # 2 分钟超时 ) elapsed_time = time.time() - start_time if result.returncode == 0: success = True print(f"✓ 拉取成功,耗时:{elapsed_time:.2f}秒") # 清理拉取的镜像 subprocess.run( ["docker", "rmi", image_path], capture_output=True, timeout=30 ) else: print(f"✗ 拉取失败:{result.stderr[:200]}") except subprocess.TimeoutExpired: elapsed_time = 120 print("✗ 测试超时(>2 分钟)") except Exception as e: elapsed_time = 0 print(f"✗ 测试异常:{str(e)}") return elapsed_time, success def run_all_tests(self): """运行所有镜像源测试""" print("=" * 60) print("Docker 镜像源速度测试工具") print("数据来源:https://blog.csdn.net/yangzhihua/article/details/") print("=" * 60) # 检查 Docker if not self.check_docker_installed(): print("
请安装 Docker 后重新运行此脚本")
print("安装命令:curl -fsSL https://get.docker.com | bash") return print(f"
测试镜像:{self.test_image}")
print(f"测试时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") print("-" * 60) # 测试每个镜像源 for mirror in self.mirrors: elapsed, success = self.test_mirror_speed( mirror["url"], mirror["name"] ) self.results.append({ "url": mirror["url"], "name": mirror["name"], "type": mirror["type"], "elapsed_time": elapsed, "success": success }) # 显示结果 self.show_results() def show_results(self): """显示测试结果""" print("
" + "=" * 60)
print("测试结果汇总") print("=" * 60) # 按成功率排序 success_mirrors = [r for r in self.results if r["success"]] failed_mirrors = [r for r in self.results if not r["success"]] if success_mirrors: print("
✅ 可用的镜像源:")
for i, result in enumerate(success_mirrors, 1): speed = "未知" if result["elapsed_time"] == 0 else f"{result['elapsed_time']:.2f}秒" print(f"{i}. {result['name']}") print(f" URL: {result['url']}") print(f" 类型:{result['type']}") print(f" 耗时:{speed}") print() if failed_mirrors: print("
❌ 不可用的镜像源:")
for result in failed_mirrors: print(f"- {result['name']} ({result['url']})") # 保存结果 self.save_results() def save_results(self): """保存测试结果到文件""" result_file = "test_results.json" with open(result_file, 'w', encoding='utf-8') as f: json.dump({ "test_time": datetime.now().isoformat(), "test_image": self.test_image, "results": self.results }, f, ensure_ascii=False, indent=2) print(f"
测试结果已保存到:{result_file}")
def main():
"""主函数""" tester = DockerMirrorTester() tester.run_all_tests()
if name == "main":
main()
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/271841.html