查找最快的docker镜像

转载地址:https://github.com/silenceshell/docker_mirror

查找国内最快的docker镜像源。
Python编写,需要root权限,支持Ubuntu/Deepin/Centos7/Arch,其他操作系统需要补充。
Ubuntu/CentOS/Deepin/Arch支持docker community.

使用方法非常简单,下载 docker_mirror.py 文件到本地,执行下面的命令即可,脚本会自动从Azure, Tencent, Aliyun, Netease, ustc尝试下载registry:2镜像,并计算使用的时间;按使用时间最少的镜像设置docker配置,并重启docker进程。

sudo apt install python-pip
sudo pip install docker -i https://mirrors.aliyun.com/pypi/simple
sudo python ./docker_mirror.py

docker_mirror.py

#!/usr/bin/python
# coding=utf8

from __future__ import print_function
from __future__ import unicode_literals
import platform
import re
import time
import os
import docker
import json

mirror_prefix = "--registry-mirror="

mirrors = {
    "azure": "http://dockerhub.azk8s.cn",
    "tencent": "https://mirror.ccs.tencentyun.com",
    "netease": "http://hub-mirror.c.163.com",
    "ustc": "https://docker.mirrors.ustc.edu.cn",
    "aliyun": "https://2h3po24q.mirror.aliyuncs.com"  # use your own aliyun mirror url instead.
}

docker_config_map = {
    "Ubuntu": {
        "config": "/etc/default/docker",
        "prefix": "DOCKER_OPTS="
    },
    "CentOS Linux": {
        "config": "/etc/sysconfig/docker",
        "prefix": "OPTIONS="
    },
    "Deepin": {
        "config": "/etc/default/docker",
        "prefix": "DOCKER_OPTS="
    }
}

docker_ce_config_map = {
    "Ubuntu": {
        "config": "/etc/docker/daemon.json",
    },
    "Deepin": {
        "config": "/etc/docker/daemon.json",
    },
    "Arch": {
        "config": "/etc/docker/daemon.json",
    }
}

def get_dist():
    return platform.linux_distribution()[0]


def get_config(dist):
    return docker_config_map[dist]["config"]


def get_config_ce(dist):
    return docker_ce_config_map[dist]["config"]


def get_prefix(dist):
    return docker_config_map[dist]["prefix"]


def get_new_options(option, mirror):
    option = option.strip()
    quota = option[len(option) - 1]
    if mirror_prefix in option:
        r1 = re.compile('[\'\"]')
        results1 = r1.split(option)

        r2 = re.compile('[\s]')
        results2 = r2.split(results1[1].strip())
        for i in range(len(results2)):
            if results2[i].startswith(mirror_prefix):
                results2[i] = mirror_prefix + mirror
        new_option = results1[0] + quota + " ".join(results2) + quota
    else:
        new_option = option[:-1] + " " + mirror_prefix + mirror + quota
    new_option += "\n"
    return new_option


def execute_sys_cmd(cmd):
    result = os.system(cmd)
    return result


def set_docker_config(mirror):
    dist = get_dist()
    docker_config = get_config(dist)
    prefix = get_prefix(dist)
    new_line = ""
    options = ""
    with open(docker_config, "r") as f:
        for line in f:
            if line.startswith(prefix):
                options = get_new_options(line, mirror)
            else:
                new_line += line
        if options == "":
            options = prefix + "\'" + mirror_prefix + mirror + "\'"

    with open(docker_config, "w") as f:
        f.write(new_line)
        f.writelines(options)

def set_docker_config_ce(mirror):
    dist = get_dist()
    docker_config = get_config_ce(dist)
    config_dict={}
    if os.path.exists(docker_config) != True:
        # if file not exist, create it first.
        os.mknod(docker_config, 0o644)
    else:
        with open(docker_config, "r") as f:
            config_dict = json.load(f)

    config_dict[u'registry-mirrors'] = [mirror]

    with open(docker_config, "w") as f:
        json.dump(config_dict, f)

def restart_docker_daemon():
    execute_sys_cmd("systemctl restart docker")


def get_speed(mirror, mirror_url):
    client = docker.from_env()
    version = client.version()[u'Version']
    if "ce" in version:
        set_docker_config_ce(mirror_url)
    else:
        set_docker_config(mirror_url)
    
    restart_docker_daemon()

    # try to delete busybox image in case.
    execute_sys_cmd("docker rmi registry:2 -f 1> /dev/null 2>&1")

    print("pulling registry:2 from {mirror}".format(mirror=mirror))
    begin_time = time.time()

    execute_sys_cmd("docker pull registry:2 1> /dev/null 2>&1")
    end_time = time.time()

    cost_time = end_time - begin_time
    print("mirror {mirror} cost time: {cost_time}\n".format(mirror=mirror, cost_time=cost_time))

    # delete centos images every time.
    execute_sys_cmd("docker rmi registry:2 -f 1> /dev/null 2>&1")

    return cost_time
    #return 204800 / cost_time

if __name__ == "__main__":
    print("restart docker daemon")
    restart_docker_daemon()
    max_speed = 0
    total_time = 0
    restart_count = 0
    best_mirror = ""
    best_mirror_url = ""
    for k, v in mirrors.items():
        cost_time = get_speed(k, v)
        speed = 204800 / cost_time
        if speed > max_speed:
            max_speed = speed
            best_mirror = k
            best_mirror_url = v
        restart_count += 1
        total_time += cost_time
        if restart_count >= 2 and total_time < 60:
           #to avoid the error of docker daeom: Start request repeated too quickly
           print("oh.. docker daemon restart too quickly, have a rest")
           restart_count = 0
           total_time = 0
           time.sleep(60-total_time)

    print("best mirror is: {mirror}, set docker config and restart docker daemon now.".format(mirror=best_mirror))
    set_docker_config(best_mirror_url)
    restart_docker_daemon()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
查找Docker镜像,有几种方法可以使用。首先,你可以通过使用命令"docker search"来在官方仓库中搜索镜像。这个命令会返回与你提供的关键词匹配的镜像列表,包括镜像名称、描述、点赞数量等信息。另外,你也可以通过在Docker Hub网站上直接搜索镜像查找Docker Hub是一个公开的镜像仓库,你可以在其中搜索并下载各种镜像。最后,你还可以查看本地已经下载的镜像列表,使用命令"docker images"来查看本地镜像的信息,包括镜像源、标签、ID、创建时间和大小等信息。这些方法可以帮助你在Docker查找并使用你需要的镜像。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Docker容器——查找自己想要的镜像和使用](https://blog.csdn.net/csde12/article/details/120584145)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Docker学习文档,全面介绍Docker技术](https://download.csdn.net/download/Goligory/88280848)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值