

























需要在不修改 Docker daemon.json 的情况下,让 docker pull nginx 自动从 docker.1ms.run/library/nginx 下载。以下是几种解决方案:
创建一个包装脚本来拦截 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
# 设置环境变量
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
# 创建用户级 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
# 修改 /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
创建透明代理脚本:
#!/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
运行一个本地 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'
#!/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
# 临时修改 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,整个过程对您透明。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。