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

推荐订阅源

Hacker News: Ask HN
Hacker News: Ask HN
H
Help Net Security
Microsoft Azure Blog
Microsoft Azure Blog
B
Blog RSS Feed
Jina AI
Jina AI
Stack Overflow Blog
Stack Overflow Blog
量子位
博客园_首页
Vercel News
Vercel News
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Forbes - Security
Forbes - Security
IT之家
IT之家
N
News and Events Feed by Topic
S
Security Affairs
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Webroot Blog
Webroot Blog
Recorded Future
Recorded Future
L
LangChain Blog
Y
Y Combinator Blog
AI
AI
MyScale Blog
MyScale Blog
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
Know Your Adversary
Know Your Adversary
AWS News Blog
AWS News Blog
Help Net Security
Help Net Security
Cyberwarzone
Cyberwarzone
L
Lohrmann on Cybersecurity
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Google Online Security Blog
Google Online Security Blog
V2EX - 技术
V2EX - 技术
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
PCI Perspectives
PCI Perspectives
I
Intezer
T
Tenable Blog
G
Google Developers Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
T
Troy Hunt's Blog
L
LINUX DO - 最新话题
云风的 BLOG
云风的 BLOG
C
CXSECURITY Database RSS Feed - CXSecurity.com
有赞技术团队
有赞技术团队
O
OpenAI News
P
Proofpoint News Feed
TaoSecurity Blog
TaoSecurity Blog
C
Check Point Blog
Last Week in AI
Last Week in AI
S
Schneier on Security
Simon Willison's Weblog
Simon Willison's Weblog
Blog — PlanetScale
Blog — PlanetScale

博客园 - 仙守

用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,整个过程对您透明。