惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

I
InfoQ
C
CERT Recently Published Vulnerability Notes
The Last Watchdog
The Last Watchdog
P
Proofpoint News Feed
D
Darknet – Hacking Tools, Hacker News & Cyber Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
GbyAI
GbyAI
T
Tenable Blog
博客园 - 三生石上(FineUI控件)
P
Privacy & Cybersecurity Law Blog
Simon Willison's Weblog
Simon Willison's Weblog
Jina AI
Jina AI
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Tor Project blog
博客园_首页
F
Fortinet All Blogs
博客园 - Franky
Latest news
Latest news
Last Week in AI
Last Week in AI
T
Threat Research - Cisco Blogs
Scott Helme
Scott Helme
L
LINUX DO - 热门话题
U
Unit 42
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Hugging Face - Blog
Hugging Face - Blog
D
Docker
Project Zero
Project Zero
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
MongoDB | Blog
MongoDB | Blog
F
Full Disclosure
D
DataBreaches.Net
Google DeepMind News
Google DeepMind News
Cisco Talos Blog
Cisco Talos Blog
Y
Y Combinator Blog
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
H
Help Net Security
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
月光博客
月光博客
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Blog — PlanetScale
Blog — PlanetScale
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
S
Schneier on Security
C
Cybersecurity and Infrastructure Security Agency CISA
P
Proofpoint News Feed
PCI Perspectives
PCI Perspectives
Cloudbric
Cloudbric
V
Visual Studio Blog
Recorded Future
Recorded Future
人人都是产品经理
人人都是产品经理

博客园 - 仙守

用audit审计去记录谁用了docker docker容器大小使用限制 docker容器的磁盘使用进行限额 sentry私有化部署: 在8c16g上降低资源使用 私有化部署sentry: 获取dsn 私有化部署sentry:卷备份及恢复 docker 保存所有镜像 私有化部署sentry:镜像构建 vscode密钥从windows连接远程linux 基于docker构建es集群 在es中进行update+upsert milvus遍历查询全部数据 简单剖析qwen-agent回答是怎么获取tool的 一个中转代码,底层调用openai,上层模拟openai 一个小工具识别哪个docker占用gpu NLP之预训练语言模型BERT NLP之预训练语言模型GPT NLP之引言 [推荐系统]粗排之FSCD
docker拉取代理脚本
仙守 · 2026-02-05 · via 博客园 - 仙守

需要在不修改 Docker daemon.json 的情况下,让 docker pull nginx 自动从 docker.1ms.run/library/nginx 下载。以下是几种解决方案:

1. 最简单:使用 Docker 别名/包装器

创建一个包装脚本来拦截 docker pull 命令:

# 创建 /usr/local/bin/docker 包装器
sudo tee /usr/local/bin/docker << 'EOF'
#!/bin/bash

MIRROR="docker.1ms.run"
COMMAND="$1"

# 如果是 pull 命令
if [ "$COMMAND" = "pull" ]; then
    IMAGE="$2"
    
    # 检查镜像格式
    if [[ ! "$IMAGE" =~ / ]] && [[ ! "$IMAGE" =~ : ]]; then
        # 简单镜像名如 nginx,转换为 library/nginx
        IMAGE="library/$IMAGE"
    fi
    
    # 如果是 docker.io 的镜像
    if [[ "$IMAGE" =~ ^docker.io/ ]] || [[ "$IMAGE" =~ ^library/ ]]; then
        # 移除 docker.io/ 前缀
        IMAGE="${IMAGE#docker.io/}"
        
        # 使用镜像源下载
        echo "从 $MIRROR 下载镜像: $IMAGE"
        shift 2
        /usr/bin/docker pull "$MIRROR/$IMAGE" "$@"
        
        # 重新打标签
        ORIG_TAG="$IMAGE"
        if [[ ! "$ORIG_TAG" =~ : ]]; then
            ORIG_TAG="${ORIG_TAG}:latest"
        fi
        /usr/bin/docker tag "$MIRROR/$IMAGE" "$ORIG_TAG"
        
        # 删除镜像源标签
        /usr/bin/docker rmi "$MIRROR/$IMAGE"
    else
        # 非 docker.io 镜像,直接下载
        shift
        /usr/bin/docker pull "$IMAGE" "$@"
    fi
else
    # 其他命令直接执行
    /usr/bin/docker "$@"
fi
EOF

sudo chmod +x /usr/local/bin/docker

2. 使用环境变量配置

# 设置环境变量
export DOCKER_MIRROR="docker.1ms.run"

# 创建包装函数(加入 ~/.bashrc 或 ~/.zshrc)
docker() {
    if [ "$1" = "pull" ]; then
        shift
        local args=()
        local image=""
        
        # 解析参数
        while [ $# -gt 0 ]; do
            case "$1" in
                -*) args+=("$1") ;;
                *) 
                    image="$1"
                    # 转换镜像名
                    if [[ ! "$image" =~ / ]] && [[ ! "$image" =~ : ]]; then
                        image="library/$image"
                    fi
                    
                    if [[ "$image" =~ ^docker.io/ ]] || [[ "$image" =~ ^library/ ]]; then
                        image="${image#docker.io/}"
                        image="$DOCKER_MIRROR/$image"
                    fi
                    args+=("$image")
                    ;;
            esac
            shift
        done
        
        # 执行 pull
        command docker pull "${args[@]}"
        
        # 如果需要,重新打标签
        if [[ -n "$image" ]]; then
            local orig_image="${image#$DOCKER_MIRROR/}"
            if [ "$image" != "$orig_image" ]; then
                command docker tag "$image" "$orig_image"
                command docker rmi "$image"
            fi
        fi
    else
        command docker "$@"
    fi
}

# 使用示例
docker pull nginx
docker pull redis:alpine
docker pull mysql:8.0

3. 使用 Docker 配置文件(用户级)

# 创建用户级 Docker 配置
mkdir -p ~/.docker

# 配置镜像别名
cat > ~/.docker/config.json << EOF
{
  "proxies": {
    "docker.io": "docker.1ms.run"
  },
  "credHelpers": {
    "docker.1ms.run": "pass"
  }
}
EOF

# 创建 pull 脚本
cat > ~/.docker/pull-with-mirror << 'EOF'
#!/bin/bash

MIRROR="docker.1ms.run"

for image in "$@"; do
    # 转换镜像名
    if [[ ! "$image" =~ / ]] && [[ ! "$image" =~ : ]]; then
        image="library/$image"
    fi
    
    mirror_image="$MIRROR/${image#docker.io/}"
    
    echo "下载: $mirror_image"
    docker pull "$mirror_image"
    
    docker tag "$mirror_image" "$image"
    docker rmi "$mirror_image"
done
EOF

chmod +x ~/.docker/pull-with-mirror

# 设置别名
alias dpull='~/.docker/pull-with-mirror'

# 使用
dpull nginx redis:alpine

4. 使用系统级 hosts 重定向

# 修改 /etc/hosts(需要 sudo)
echo "## Docker Mirror" | sudo tee -a /etc/hosts
echo "$(dig +short docker.1ms.run) registry-1.docker.io" | sudo tee -a /etc/hosts
echo "$(dig +short docker.1ms.run) docker.io" | sudo tee -a /etc/hosts

# 或者使用固定 IP(如果知道镜像站 IP)
cat << EOF | sudo tee -a /etc/hosts
# Docker Mirror
103.18.42.132 registry-1.docker.io
103.18.42.132 docker.io
EOF

5. 使用代理脚本

创建透明代理脚本:

#!/bin/bash
# /usr/local/bin/docker-proxy

set -e

# 镜像源映射
declare -A MIRROR_MAP=(
    ["docker.io"]="docker.1ms.run"
    ["registry.hub.docker.com"]="docker.1ms.run"
)

# Docker 命令路径
DOCKER_BIN="/usr/bin/docker"

# 解析命令
cmd="$1"
shift

case "$cmd" in
    "pull")
        image="$1"
        shift
        
        # 查找并替换镜像源
        for source in "${!MIRROR_MAP[@]}"; do
            target="${MIRROR_MAP[$source]}"
            if [[ "$image" == "$source"* ]] || [[ ! "$image" =~ / ]] || [[ "$image" =~ ^[^/]+/[^/]+$ ]]; then
                # 处理简单镜像名
                if [[ ! "$image" =~ / ]]; then
                    image="library/$image"
                fi
                
                # 替换源
                mirror_image="$target/${image#*/}"
                
                echo "Using mirror: $mirror_image"
                
                # 下载镜像
                $DOCKER_BIN pull "$mirror_image" "$@"
                
                # 重新打标签
                $DOCKER_BIN tag "$mirror_image" "$image"
                $DOCKER_BIN rmi "$mirror_image"
                
                exit 0
            fi
        done
        
        # 没有匹配的镜像源,直接下载
        $DOCKER_BIN pull "$image" "$@"
        ;;
    *)
        # 其他命令直接执行
        $DOCKER_BIN "$cmd" "$@"
        ;;
esac

6. 使用 Docker Registry Proxy

运行一个本地 registry 代理:

# 启动一个本地 registry 代理
docker run -d \
  --name docker-proxy \
  -p 5000:5000 \
  -e REGISTRY_PROXY_REMOTEURL="http://docker.1ms.run" \
  registry:2

# 设置别名使用本地代理
alias docker='docker --registry-mirror=http://localhost:5000'

7. 完整的自动化脚本

#!/bin/bash
# setup-docker-mirror.sh

MIRROR="docker.1ms.run"

# 1. 创建包装器
create_wrapper() {
    cat > /tmp/docker-wrapper << EOF
#!/bin/bash

MIRROR="$MIRROR"
DOCKER_BIN="\$(which docker)"

# 帮助函数
show_help() {
    echo "Usage: docker [COMMAND]"
    echo "Commands with mirror support:"
    echo "  pull [IMAGE]      Pull image from mirror"
    echo "  Other commands are passed directly to docker"
}

# 转换镜像名
convert_image() {
    local image="\$1"
    
    # 添加默认的 library/ 前缀
    if [[ ! "\$image" =~ / ]] && [[ ! "\$image" =~ : ]]; then
        image="library/\$image"
    fi
    
    # 处理 docker.io 镜像
    if [[ "\$image" =~ ^docker.io/ ]] || [[ "\$image" =~ ^library/ ]]; then
        image="\${image#docker.io/}"
        echo "\$MIRROR/\$image"
    else
        echo "\$image"
    fi
}

# 主逻辑
cmd="\$1"
shift

case "\$cmd" in
    "pull")
        if [ \$# -eq 0 ]; then
            echo "Error: 'docker pull' requires at least 1 argument."
            exit 1
        fi
        
        while [ \$# -gt 0 ]; do
            case "\$1" in
                -*) 
                    # 处理选项参数
                    args+=("\$1")
                    shift
                    ;;
                *)
                    # 处理镜像名
                    original_image="\$1"
                    mirror_image="\$(convert_image "\$original_image")"
                    
                    # 下载镜像
                    echo "[Mirror] Pulling \$mirror_image"
                    \$DOCKER_BIN pull \$mirror_image "\${args[@]}"
                    
                    # 重新打标签
                    if [ "\$mirror_image" != "\$original_image" ]; then
                        \$DOCKER_BIN tag "\$mirror_image" "\$original_image"
                        \$DOCKER_BIN rmi "\$mirror_image"
                        echo "[Mirror] Tagged as \$original_image"
                    fi
                    
                    shift
                    ;;
            esac
        done
        ;;
    "-h"|"--help"|"help")
        show_help
        ;;
    *)
        # 其他命令直接传递
        \$DOCKER_BIN "\$cmd" "\$@"
        ;;
esac
EOF

    sudo cp /tmp/docker-wrapper /usr/local/bin/docker
    sudo chmod +x /usr/local/bin/docker
    echo "包装器已安装到 /usr/local/bin/docker"
}

# 2. 创建别名(可选)
create_alias() {
    echo "alias docker='docker --registry-mirror=https://$MIRROR'" >> ~/.bashrc
    echo "export DOCKER_MIRROR='$MIRROR'" >> ~/.bashrc
    echo "别名已添加到 ~/.bashrc"
}

# 3. 测试
test_mirror() {
    echo "测试镜像下载..."
    docker pull nginx
    docker pull redis:alpine
    docker pull mysql
    
    echo "查看下载的镜像:"
    docker images | grep -E "(nginx|redis|mysql)"
}

# 主菜单
echo "Docker 镜像源自动配置工具"
echo "镜像源: $MIRROR"
echo ""
echo "1. 安装包装器(替换 docker 命令)"
echo "2. 设置别名(不替换命令)"
echo "3. 测试镜像下载"
echo "4. 全部执行"
read -p "请选择 [1-4]: " choice

case $choice in
    1) create_wrapper ;;
    2) create_alias ;;
    3) test_mirror ;;
    4) 
        create_wrapper
        create_alias
        test_mirror
        ;;
    *) echo "无效选择" ;;
esac

8. 最推荐:使用 sed 动态修改 Docker 配置

# 临时修改 Docker 守护进程配置(重启后失效)
sudo sed -i '/registry-mirrors/d' /etc/docker/daemon.json 2>/dev/null || echo '{}' | sudo tee /etc/docker/daemon.json >/dev/null
sudo sed -i '1s/^/{/' /etc/docker/daemon.json && sudo sed -i '$s/$/,/' /etc/docker/daemon.json && echo '  "registry-mirrors": ["https://docker.1ms.run"]' | sudo tee -a /etc/docker/daemon.json && sudo sed -i '$s/$/\n}/' /etc/docker/daemon.json

# 重启 Docker 服务
sudo systemctl restart docker

使用方法
最简单的方法:使用第 1 或第 2 个方案,创建包装器或别名

临时使用:运行第 8 个方案的 sed 命令

长期使用:使用第 7 个方案的完整脚本

这样,当您执行 docker pull nginx 时,会自动从 docker.1ms.run/library/nginx 下载,并自动重命名为 nginx,整个过程对您透明。