From 0d1e2e7b4d4f9ddd939cfb004e3d00c05ed6540b Mon Sep 17 00:00:00 2001 From: xzx3344521 Date: Sat, 1 Nov 2025 19:02:12 +0800 Subject: [PATCH] =?UTF-8?q?Update=20Docker=20=E5=8A=A0=E9=80=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Docker 加速 | 327 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 198 insertions(+), 129 deletions(-) diff --git a/Docker 加速 b/Docker 加速 index 58d67ec..b6483e4 100644 --- a/Docker 加速 +++ b/Docker 加速 @@ -1,7 +1,7 @@ #!/bin/bash # Docker镜像源配置脚本 -# 描述: 配置Docker使用不同的镜像源,包括私有仓库、阿里云镜像和官方镜像 +# 描述: 配置Docker使用不同的镜像源,以私有仓库为主,其他源为备 set -e @@ -14,11 +14,15 @@ PURPLE='\033[0;35m' CYAN='\033[0;36m' NC='\033[0m' # No Color -# 镜像源配置 +# 镜像源配置 - 以您的私有源为主 PRIVATE_REGISTRY="github.vps7k7k.xyz" +PRIVATE_MIRROR="https://github.vps7k7k.xyz" + +# 备用镜像源 ALIYUN_MIRROR="https://registry.cn-hangzhou.aliyuncs.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() { @@ -57,26 +61,24 @@ check_docker() { # 显示镜像源选择菜单 show_mirror_menu() { echo - print_step "请选择要使用的Docker镜像源:" + print_step "请选择要使用的Docker镜像源配置:" echo "==========================================" - print_choice "1. 私有仓库 (${PRIVATE_REGISTRY})" + print_choice "1. 私有仓库为主 + 多个备用源(推荐)" + echo " - 主源: ${PRIVATE_REGISTRY}" + echo " - 备源: 阿里云、网易、中科大、腾讯云" + echo " - Docker自动选择最快可用源" + print_choice "2. 仅私有仓库" + echo " - 只使用 ${PRIVATE_REGISTRY}" echo " - 需要账号密码认证" echo " - 访问速度最快" - echo " - 包含定制镜像" - print_choice "2. 阿里云镜像" - echo " - 国内访问速度快" - echo " - 无需认证" - echo " - 镜像同步及时" - print_choice "3. 网易云镜像" - echo " - 国内镜像源" - echo " - 无需认证" - echo " - 稳定性好" + print_choice "3. 仅公共镜像源" + echo " - 不使用私有仓库" + echo " - 使用阿里云、网易、中科大、腾讯云" print_choice "4. 官方Docker Hub" echo " - 官方源,镜像最全" echo " - 国外源,访问可能较慢" - print_choice "5. 多个镜像源(推荐)" - echo " - 同时配置多个镜像源" - echo " - Docker会自动选择最快的源" + print_choice "5. 自定义配置" + echo " - 手动选择镜像源组合" echo "==========================================" } @@ -86,32 +88,28 @@ get_mirror_choice() { read -p "请输入选择 (1-5): " choice case $choice in 1) - MIRROR_TYPE="private" - MIRROR_NAME="私有仓库" - MIRROR_URL="https://${PRIVATE_REGISTRY}" + MIRROR_TYPE="private_primary" + MIRROR_NAME="私有仓库为主 + 多个备用源" break ;; 2) - MIRROR_TYPE="aliyun" - MIRROR_NAME="阿里云镜像" - MIRROR_URL=$ALIYUN_MIRROR + MIRROR_TYPE="private_only" + MIRROR_NAME="仅私有仓库" break ;; 3) - MIRROR_TYPE="netease" - MIRROR_NAME="网易云镜像" - MIRROR_URL=$DOCKER_HUB_MIRROR + MIRROR_TYPE="public_only" + MIRROR_NAME="仅公共镜像源" break ;; 4) MIRROR_TYPE="official" MIRROR_NAME="官方Docker Hub" - MIRROR_URL=$OFFICIAL_REGISTRY break ;; 5) - MIRROR_TYPE="multiple" - MIRROR_NAME="多个镜像源" + MIRROR_TYPE="custom" + MIRROR_NAME="自定义配置" break ;; *) @@ -121,9 +119,67 @@ get_mirror_choice() { 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() { - if [ "$MIRROR_TYPE" != "private" ]; then + if [[ "$MIRROR_TYPE" != "private_primary" && "$MIRROR_TYPE" != "private_only" ]]; then return 0 fi @@ -162,7 +218,7 @@ get_private_credentials() { # 测试私有仓库登录 test_private_login() { - if [ "$MIRROR_TYPE" != "private" ]; then + if [[ "$MIRROR_TYPE" != "private_primary" && "$MIRROR_TYPE" != "private_only" ]]; then return 0 fi @@ -177,10 +233,8 @@ test_private_login() { fi } -# 配置单个镜像源 -configure_single_mirror() { - local mirror_url=$1 - +# 配置镜像源 +configure_mirrors() { print_step "配置Docker镜像源: $MIRROR_NAME" # 创建Docker配置目录 @@ -192,64 +246,85 @@ configure_single_mirror() { print_info "已备份原有配置" fi - # 创建新的配置 - if [ "$MIRROR_TYPE" = "private" ]; then - cat << EOF | sudo tee /etc/docker/daemon.json > /dev/null -{ - "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 + # 根据不同类型生成配置 + case "$MIRROR_TYPE" in + "private_primary") + # 私有仓库为主 + 多个备用源 + cat << EOF | sudo tee /etc/docker/daemon.json > /dev/null { "registry-mirrors": [ + "$PRIVATE_MIRROR", "$ALIYUN_MIRROR", "$DOCKER_HUB_MIRROR", - "https://docker.mirrors.ustc.edu.cn", - "https://mirror.ccs.tencentyun.com" + "$USTC_MIRROR", + "$TENCENT_MIRROR" ], "insecure-registries": ["$PRIVATE_REGISTRY"], "debug": false, "experimental": false } 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%,}]" + + insecure_registries="[]" + if [[ " ${MIRRORS[@]} " =~ " $PRIVATE_MIRROR " ]]; then + insecure_registries="[\"$PRIVATE_REGISTRY\"]" + fi + + 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镜像源配置完成" - print_info "已配置的镜像源:" - print_config " - 阿里云镜像" - print_config " - 网易云镜像" - print_config " - 中科大镜像" - print_config " - 腾讯云镜像" + print_info "Docker镜像源配置完成" } # 重启Docker服务 @@ -269,7 +344,7 @@ restart_docker() { # 保存私有仓库认证信息 save_private_credentials() { - if [ "$MIRROR_TYPE" != "private" ]; then + if [[ "$MIRROR_TYPE" != "private_primary" && "$MIRROR_TYPE" != "private_only" ]]; then return 0 fi @@ -310,33 +385,6 @@ verify_configuration() { else print_warning "镜像源配置可能未生效,请手动检查" 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} 镜像源类型: ${MIRROR_NAME}" - if [ "$MIRROR_TYPE" = "private" ]; then - echo -e "${GREEN}✓${NC} 私有仓库地址: ${PRIVATE_REGISTRY}" - echo -e "${GREEN}✓${NC} 用户名: ${username}" + case "$MIRROR_TYPE" in + "private_primary") + 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 - echo -e "${GREEN}✓${NC} 认证信息已保存,后续使用无需重复登录" + echo -e "${GREEN}✓${NC} 认证信息已保存" else - echo -e "${YELLOW}⚠${NC} 认证信息未保存,拉取私有镜像时需要重新登录" + echo -e "${YELLOW}⚠${NC} 认证信息未保存" fi - elif [ "$MIRROR_TYPE" = "multiple" ]; then - echo -e "${GREEN}✓${NC} 已配置多个镜像源" - echo -e "${GREEN}✓${NC} Docker会自动选择最快的镜像源" - else - echo -e "${GREEN}✓${NC} 镜像源地址: ${MIRROR_URL}" fi echo -e "${GREEN}✓${NC} Docker服务已重启生效" echo 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 镜像名称" else echo " 拉取镜像: docker pull 镜像名称" fi + echo " 查看配置: docker info | grep -A 10 'Registry Mirrors'" } # 主函数 @@ -378,6 +443,7 @@ main() { clear echo "==========================================" echo " Docker镜像源配置脚本" + echo " 主镜像源: ${PRIVATE_REGISTRY}" echo "==========================================" echo @@ -390,8 +456,13 @@ main() { # 获取用户选择 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 if ! test_private_login; then print_error "配置中止,请解决登录问题后重新运行脚本" @@ -400,17 +471,15 @@ main() { fi # 配置镜像源 - if [ "$MIRROR_TYPE" = "multiple" ]; then - configure_multiple_mirrors - else - configure_single_mirror "$MIRROR_URL" - fi + configure_mirrors # 重启Docker服务 restart_docker # 保存私有仓库认证信息 - save_private_credentials + if [[ "$MIRROR_TYPE" == "private_primary" || "$MIRROR_TYPE" == "private_only" ]]; then + save_private_credentials + fi # 验证配置 verify_configuration