Update Docker 加速

This commit is contained in:
2025-11-01 19:02:12 +08:00
committed by GitHub
parent 0726678ad1
commit 0d1e2e7b4d

View File

@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
# Docker镜像源配置脚本 # Docker镜像源配置脚本
# 描述: 配置Docker使用不同的镜像源包括私有仓库、阿里云镜像和官方镜像 # 描述: 配置Docker使用不同的镜像源私有仓库为主,其他源为备
set -e set -e
@@ -14,11 +14,15 @@ PURPLE='\033[0;35m'
CYAN='\033[0;36m' CYAN='\033[0;36m'
NC='\033[0m' # No Color NC='\033[0m' # No Color
# 镜像源配置 # 镜像源配置 - 以您的私有源为主
PRIVATE_REGISTRY="github.vps7k7k.xyz" PRIVATE_REGISTRY="github.vps7k7k.xyz"
PRIVATE_MIRROR="https://github.vps7k7k.xyz"
# 备用镜像源
ALIYUN_MIRROR="https://registry.cn-hangzhou.aliyuncs.com" ALIYUN_MIRROR="https://registry.cn-hangzhou.aliyuncs.com"
DOCKER_HUB_MIRROR="https://hub-mirror.c.163.com" DOCKER_HUB_MIRROR="https://hub-mirror.c.163.com"
OFFICIAL_REGISTRY="https://registry-1.docker.io" USTC_MIRROR="https://docker.mirrors.ustc.edu.cn"
TENCENT_MIRROR="https://mirror.ccs.tencentyun.com"
# 打印彩色信息 # 打印彩色信息
print_info() { print_info() {
@@ -57,26 +61,24 @@ check_docker() {
# 显示镜像源选择菜单 # 显示镜像源选择菜单
show_mirror_menu() { show_mirror_menu() {
echo echo
print_step "请选择要使用的Docker镜像源" print_step "请选择要使用的Docker镜像源配置"
echo "==========================================" echo "=========================================="
print_choice "1. 私有仓库 (${PRIVATE_REGISTRY})" print_choice "1. 私有仓库为主 + 多个备用源(推荐)"
echo " - 主源: ${PRIVATE_REGISTRY}"
echo " - 备源: 阿里云、网易、中科大、腾讯云"
echo " - Docker自动选择最快可用源"
print_choice "2. 仅私有仓库"
echo " - 只使用 ${PRIVATE_REGISTRY}"
echo " - 需要账号密码认证" echo " - 需要账号密码认证"
echo " - 访问速度最快" echo " - 访问速度最快"
echo " - 包含定制镜像" print_choice "3. 仅公共镜像"
print_choice "2. 阿里云镜像" echo " - 不使用私有仓库"
echo " - 国内访问速度快" echo " - 使用阿里云、网易、中科大、腾讯云"
echo " - 无需认证"
echo " - 镜像同步及时"
print_choice "3. 网易云镜像"
echo " - 国内镜像源"
echo " - 无需认证"
echo " - 稳定性好"
print_choice "4. 官方Docker Hub" print_choice "4. 官方Docker Hub"
echo " - 官方源,镜像最全" echo " - 官方源,镜像最全"
echo " - 国外源,访问可能较慢" echo " - 国外源,访问可能较慢"
print_choice "5. 多个镜像源(推荐)" print_choice "5. 自定义配置"
echo " - 同时配置多个镜像源" echo " - 手动选择镜像源组合"
echo " - Docker会自动选择最快的源"
echo "==========================================" echo "=========================================="
} }
@@ -86,32 +88,28 @@ get_mirror_choice() {
read -p "请输入选择 (1-5): " choice read -p "请输入选择 (1-5): " choice
case $choice in case $choice in
1) 1)
MIRROR_TYPE="private" MIRROR_TYPE="private_primary"
MIRROR_NAME="私有仓库" MIRROR_NAME="私有仓库为主 + 多个备用源"
MIRROR_URL="https://${PRIVATE_REGISTRY}"
break break
;; ;;
2) 2)
MIRROR_TYPE="aliyun" MIRROR_TYPE="private_only"
MIRROR_NAME="阿里云镜像" MIRROR_NAME="仅私有仓库"
MIRROR_URL=$ALIYUN_MIRROR
break break
;; ;;
3) 3)
MIRROR_TYPE="netease" MIRROR_TYPE="public_only"
MIRROR_NAME="网易云镜像" MIRROR_NAME="仅公共镜像"
MIRROR_URL=$DOCKER_HUB_MIRROR
break break
;; ;;
4) 4)
MIRROR_TYPE="official" MIRROR_TYPE="official"
MIRROR_NAME="官方Docker Hub" MIRROR_NAME="官方Docker Hub"
MIRROR_URL=$OFFICIAL_REGISTRY
break break
;; ;;
5) 5)
MIRROR_TYPE="multiple" MIRROR_TYPE="custom"
MIRROR_NAME="多个镜像源" MIRROR_NAME="自定义配置"
break break
;; ;;
*) *)
@@ -121,9 +119,67 @@ get_mirror_choice() {
done done
} }
# 自定义配置选择
get_custom_config() {
echo
print_step "自定义镜像源配置"
MIRRORS=()
# 选择是否包含私有仓库
read -p "是否包含私有仓库 ${PRIVATE_REGISTRY}(y/N): " include_private
if [[ $include_private =~ ^[Yy]$ ]]; then
MIRRORS+=("$PRIVATE_MIRROR")
print_info "已添加私有仓库"
fi
# 选择公共镜像源
echo
echo "请选择要添加的公共镜像源(可多选):"
echo "1) 阿里云镜像"
echo "2) 网易云镜像"
echo "3) 中科大镜像"
echo "4) 腾讯云镜像"
echo "5) 官方Docker Hub"
read -p "请输入选择多个用空格分隔1 2 3: " public_choices
for choice in $public_choices; do
case $choice in
1)
MIRRORS+=("$ALIYUN_MIRROR")
print_info "已添加阿里云镜像"
;;
2)
MIRRORS+=("$DOCKER_HUB_MIRROR")
print_info "已添加网易云镜像"
;;
3)
MIRRORS+=("$USTC_MIRROR")
print_info "已添加中科大镜像"
;;
4)
MIRRORS+=("$TENCENT_MIRROR")
print_info "已添加腾讯云镜像"
;;
5)
MIRRORS+=("https://registry-1.docker.io")
print_info "已添加官方Docker Hub"
;;
esac
done
if [ ${#MIRRORS[@]} -eq 0 ]; then
print_error "至少需要选择一个镜像源"
exit 1
fi
MIRROR_NAME="自定义镜像源(${#MIRRORS[@]}个)"
}
# 交互式输入私有仓库账号密码 # 交互式输入私有仓库账号密码
get_private_credentials() { get_private_credentials() {
if [ "$MIRROR_TYPE" != "private" ]; then if [[ "$MIRROR_TYPE" != "private_primary" && "$MIRROR_TYPE" != "private_only" ]]; then
return 0 return 0
fi fi
@@ -162,7 +218,7 @@ get_private_credentials() {
# 测试私有仓库登录 # 测试私有仓库登录
test_private_login() { test_private_login() {
if [ "$MIRROR_TYPE" != "private" ]; then if [[ "$MIRROR_TYPE" != "private_primary" && "$MIRROR_TYPE" != "private_only" ]]; then
return 0 return 0
fi fi
@@ -177,10 +233,8 @@ test_private_login() {
fi fi
} }
# 配置单个镜像源 # 配置镜像源
configure_single_mirror() { configure_mirrors() {
local mirror_url=$1
print_step "配置Docker镜像源: $MIRROR_NAME" print_step "配置Docker镜像源: $MIRROR_NAME"
# 创建Docker配置目录 # 创建Docker配置目录
@@ -192,64 +246,85 @@ configure_single_mirror() {
print_info "已备份原有配置" print_info "已备份原有配置"
fi fi
# 创建新的配置 # 根据不同类型生成配置
if [ "$MIRROR_TYPE" = "private" ]; then case "$MIRROR_TYPE" in
cat << EOF | sudo tee /etc/docker/daemon.json > /dev/null "private_primary")
{ # 私有仓库为主 + 多个备用源
"registry-mirrors": ["$mirror_url"],
"insecure-registries": ["$PRIVATE_REGISTRY"],
"debug": false,
"experimental": false
}
EOF
else
cat << EOF | sudo tee /etc/docker/daemon.json > /dev/null
{
"registry-mirrors": ["$mirror_url"],
"insecure-registries": [],
"debug": false,
"experimental": false
}
EOF
fi
print_info "Docker镜像源配置完成"
}
# 配置多个镜像源
configure_multiple_mirrors() {
print_step "配置多个Docker镜像源"
# 创建Docker配置目录
sudo mkdir -p /etc/docker
# 备份原有配置
if [ -f /etc/docker/daemon.json ]; then
sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.backup.$(date +%Y%m%d%H%M%S)
print_info "已备份原有配置"
fi
# 创建多个镜像源配置
cat << EOF | sudo tee /etc/docker/daemon.json > /dev/null cat << EOF | sudo tee /etc/docker/daemon.json > /dev/null
{ {
"registry-mirrors": [ "registry-mirrors": [
"$PRIVATE_MIRROR",
"$ALIYUN_MIRROR", "$ALIYUN_MIRROR",
"$DOCKER_HUB_MIRROR", "$DOCKER_HUB_MIRROR",
"https://docker.mirrors.ustc.edu.cn", "$USTC_MIRROR",
"https://mirror.ccs.tencentyun.com" "$TENCENT_MIRROR"
], ],
"insecure-registries": ["$PRIVATE_REGISTRY"], "insecure-registries": ["$PRIVATE_REGISTRY"],
"debug": false, "debug": false,
"experimental": false "experimental": false
} }
EOF EOF
;;
"private_only")
# 仅私有仓库
cat << EOF | sudo tee /etc/docker/daemon.json > /dev/null
{
"registry-mirrors": ["$PRIVATE_MIRROR"],
"insecure-registries": ["$PRIVATE_REGISTRY"],
"debug": false,
"experimental": false
}
EOF
;;
"public_only")
# 仅公共镜像源
cat << EOF | sudo tee /etc/docker/daemon.json > /dev/null
{
"registry-mirrors": [
"$ALIYUN_MIRROR",
"$DOCKER_HUB_MIRROR",
"$USTC_MIRROR",
"$TENCENT_MIRROR"
],
"insecure-registries": [],
"debug": false,
"experimental": false
}
EOF
;;
"official")
# 官方Docker Hub
cat << EOF | sudo tee /etc/docker/daemon.json > /dev/null
{
"registry-mirrors": ["https://registry-1.docker.io"],
"insecure-registries": [],
"debug": false,
"experimental": false
}
EOF
;;
"custom")
# 自定义配置
mirrors_json=$(printf '"%s",' "${MIRRORS[@]}")
mirrors_json="[${mirrors_json%,}]"
print_info "多个Docker镜像源配置完成" insecure_registries="[]"
print_info "已配置的镜像源:" if [[ " ${MIRRORS[@]} " =~ " $PRIVATE_MIRROR " ]]; then
print_config " - 阿里云镜像" insecure_registries="[\"$PRIVATE_REGISTRY\"]"
print_config " - 网易云镜像" fi
print_config " - 中科大镜像"
print_config " - 腾讯云镜像" cat << EOF | sudo tee /etc/docker/daemon.json > /dev/null
{
"registry-mirrors": $mirrors_json,
"insecure-registries": $insecure_registries,
"debug": false,
"experimental": false
}
EOF
;;
esac
print_info "Docker镜像源配置完成"
} }
# 重启Docker服务 # 重启Docker服务
@@ -269,7 +344,7 @@ restart_docker() {
# 保存私有仓库认证信息 # 保存私有仓库认证信息
save_private_credentials() { save_private_credentials() {
if [ "$MIRROR_TYPE" != "private" ]; then if [[ "$MIRROR_TYPE" != "private_primary" && "$MIRROR_TYPE" != "private_only" ]]; then
return 0 return 0
fi fi
@@ -310,33 +385,6 @@ verify_configuration() {
else else
print_warning "镜像源配置可能未生效,请手动检查" print_warning "镜像源配置可能未生效,请手动检查"
fi fi
# 测试拉取镜像(可选)
if [ "$MIRROR_TYPE" = "private" ]; then
print_step "是否测试拉取私有仓库的nginx镜像"
read -p "进行测试?(y/N): " test_choice
if [[ $test_choice =~ ^[Yy]$ ]]; then
print_info "开始拉取测试镜像..."
if sudo docker pull ${PRIVATE_REGISTRY}/nginx; then
print_info "私有仓库镜像拉取测试成功!"
else
print_warning "私有仓库镜像拉取测试失败,请检查网络连接和认证信息"
fi
fi
else
print_step "是否测试拉取公共镜像?"
read -p "进行测试?(y/N): " test_choice
if [[ $test_choice =~ ^[Yy]$ ]]; then
print_info "开始拉取测试镜像..."
if sudo docker pull hello-world; then
print_info "公共镜像拉取测试成功!"
else
print_warning "公共镜像拉取测试失败,请检查网络连接"
fi
fi
fi
} }
# 显示配置摘要 # 显示配置摘要
@@ -346,31 +394,48 @@ show_summary() {
echo -e "${GREEN}✓${NC} Docker镜像源配置完成" echo -e "${GREEN}✓${NC} Docker镜像源配置完成"
echo -e "${GREEN}✓${NC} 镜像源类型: ${MIRROR_NAME}" echo -e "${GREEN}✓${NC} 镜像源类型: ${MIRROR_NAME}"
if [ "$MIRROR_TYPE" = "private" ]; then case "$MIRROR_TYPE" in
echo -e "${GREEN}✓${NC} 私有仓库地址: ${PRIVATE_REGISTRY}" "private_primary")
echo -e "${GREEN}✓${NC} 用户名: ${username}" echo -e "${GREEN}✓${NC} 主镜像源: ${PRIVATE_REGISTRY}"
echo -e "${GREEN}✓${NC} 备用镜像源: 阿里云、网易、中科大、腾讯云"
;;
"private_only")
echo -e "${GREEN}✓${NC} 镜像源: ${PRIVATE_REGISTRY}"
;;
"public_only")
echo -e "${GREEN}✓${NC} 镜像源: 阿里云、网易、中科大、腾讯云"
;;
"official")
echo -e "${GREEN}✓${NC} 镜像源: 官方Docker Hub"
;;
"custom")
echo -e "${GREEN}✓${NC} 自定义镜像源: ${#MIRRORS[@]}个"
for mirror in "${MIRRORS[@]}"; do
echo -e " - ${mirror}"
done
;;
esac
if [[ "$MIRROR_TYPE" == "private_primary" || "$MIRROR_TYPE" == "private_only" ]]; then
echo -e "${GREEN}✓${NC} 私有仓库用户名: ${username}"
if [[ $save_choice =~ ^[Yy]$ ]]; then if [[ $save_choice =~ ^[Yy]$ ]]; then
echo -e "${GREEN}✓${NC} 认证信息已保存,后续使用无需重复登录" echo -e "${GREEN}✓${NC} 认证信息已保存"
else else
echo -e "${YELLOW}⚠${NC} 认证信息未保存,拉取私有镜像时需要重新登录" echo -e "${YELLOW}⚠${NC} 认证信息未保存"
fi fi
elif [ "$MIRROR_TYPE" = "multiple" ]; then
echo -e "${GREEN}✓${NC} 已配置多个镜像源"
echo -e "${GREEN}✓${NC} Docker会自动选择最快的镜像源"
else
echo -e "${GREEN}✓${NC} 镜像源地址: ${MIRROR_URL}"
fi fi
echo -e "${GREEN}✓${NC} Docker服务已重启生效" echo -e "${GREEN}✓${NC} Docker服务已重启生效"
echo echo
print_info "使用说明:" print_info "使用说明:"
if [ "$MIRROR_TYPE" = "private" ]; then if [[ "$MIRROR_TYPE" == "private_primary" || "$MIRROR_TYPE" == "private_only" ]]; then
echo " 私有镜像: docker pull ${PRIVATE_REGISTRY}/镜像名称" echo " 私有镜像: docker pull ${PRIVATE_REGISTRY}/镜像名称"
echo " 公共镜像: docker pull 镜像名称" echo " 公共镜像: docker pull 镜像名称"
else else
echo " 拉取镜像: docker pull 镜像名称" echo " 拉取镜像: docker pull 镜像名称"
fi fi
echo " 查看配置: docker info | grep -A 10 'Registry Mirrors'"
} }
# 主函数 # 主函数
@@ -378,6 +443,7 @@ main() {
clear clear
echo "==========================================" echo "=========================================="
echo " Docker镜像源配置脚本" echo " Docker镜像源配置脚本"
echo " 主镜像源: ${PRIVATE_REGISTRY}"
echo "==========================================" echo "=========================================="
echo echo
@@ -390,8 +456,13 @@ main() {
# 获取用户选择 # 获取用户选择
get_mirror_choice get_mirror_choice
# 如果是私有仓库,获取认证信息 # 如果是自定义配置,获取详细选择
if [ "$MIRROR_TYPE" = "private" ]; then if [ "$MIRROR_TYPE" = "custom" ]; then
get_custom_config
fi
# 如果是私有仓库配置,获取认证信息
if [[ "$MIRROR_TYPE" == "private_primary" || "$MIRROR_TYPE" == "private_only" ]]; then
get_private_credentials get_private_credentials
if ! test_private_login; then if ! test_private_login; then
print_error "配置中止,请解决登录问题后重新运行脚本" print_error "配置中止,请解决登录问题后重新运行脚本"
@@ -400,17 +471,15 @@ main() {
fi fi
# 配置镜像源 # 配置镜像源
if [ "$MIRROR_TYPE" = "multiple" ]; then configure_mirrors
configure_multiple_mirrors
else
configure_single_mirror "$MIRROR_URL"
fi
# 重启Docker服务 # 重启Docker服务
restart_docker restart_docker
# 保存私有仓库认证信息 # 保存私有仓库认证信息
if [[ "$MIRROR_TYPE" == "private_primary" || "$MIRROR_TYPE" == "private_only" ]]; then
save_private_credentials save_private_credentials
fi
# 验证配置 # 验证配置
verify_configuration verify_configuration