From ac2ec2dcb538ebb9f6dc2905f3a79e15e2ad8b6c Mon Sep 17 00:00:00 2001 From: xzx3344521 Date: Fri, 2 Jan 2026 00:13:57 +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 加速 | 449 +++++++++++++++++++++++++++++++++------------------- 1 file changed, 287 insertions(+), 162 deletions(-) diff --git a/Docker 加速 b/Docker 加速 index b6483e4..ac6110a 100644 --- a/Docker 加速 +++ b/Docker 加速 @@ -1,7 +1,7 @@ #!/bin/bash # Docker镜像源配置脚本 -# 描述: 配置Docker使用不同的镜像源,以私有仓库为主,其他源为备 +# 描述: 配置Docker使用不同的镜像源,支持私有仓库(可选认证)和公共镜像源 set -e @@ -14,9 +14,9 @@ PURPLE='\033[0;35m' CYAN='\033[0;36m' NC='\033[0m' # No Color -# 镜像源配置 - 以您的私有源为主 -PRIVATE_REGISTRY="github.vps7k7k.xyz" -PRIVATE_MIRROR="https://github.vps7k7k.xyz" +# 默认私有仓库配置(用户可自定义) +DEFAULT_PRIVATE_REGISTRY="github.vps7k7k.xyz" +DEFAULT_PRIVATE_MIRROR="https://github.vps7k7k.xyz" # 备用镜像源 ALIYUN_MIRROR="https://registry.cn-hangzhou.aliyuncs.com" @@ -58,84 +58,251 @@ check_docker() { print_info "Docker 已安装,版本: $(docker --version | cut -d' ' -f3 | cut -d',' -f1)" } +# 获取私有仓库配置 +get_private_registry_config() { + echo + print_step "配置私有仓库" + + # 询问是否使用私有仓库 + read -p "是否使用私有仓库?(y/N): " use_private + if [[ ! $use_private =~ ^[Yy]$ ]]; then + PRIVATE_REGISTRY="" + PRIVATE_MIRROR="" + NEED_AUTH="no" + return 0 + fi + + # 输入私有仓库域名 + read -p "请输入私有仓库域名/地址 [默认: $DEFAULT_PRIVATE_REGISTRY]: " registry_input + if [ -z "$registry_input" ]; then + PRIVATE_REGISTRY="$DEFAULT_PRIVATE_REGISTRY" + PRIVATE_MIRROR="$DEFAULT_PRIVATE_MIRROR" + else + PRIVATE_REGISTRY="$registry_input" + # 自动构建镜像URL(添加https前缀,如果不是完整URL) + if [[ "$registry_input" =~ ^https?:// ]]; then + PRIVATE_MIRROR="$registry_input" + else + PRIVATE_MIRROR="https://$registry_input" + fi + fi + + print_info "私有仓库地址: $PRIVATE_REGISTRY" + print_info "镜像地址: $PRIVATE_MIRROR" + + # 询问是否需要认证 + read -p "私有仓库是否需要认证登录?(y/N): " need_auth + if [[ $need_auth =~ ^[Yy]$ ]]; then + NEED_AUTH="yes" + get_private_credentials + else + NEED_AUTH="no" + print_info "私有仓库无需认证" + fi +} + +# 交互式输入私有仓库账号密码 +get_private_credentials() { + print_step "请输入私有仓库的认证信息" + + while true; do + read -p "请输入用户名: " PRIVATE_USERNAME + if [ -n "$PRIVATE_USERNAME" ]; then + break + else + print_error "用户名不能为空,请重新输入" + fi + done + + while true; do + read -s -p "请输入密码: " PRIVATE_PASSWORD + echo + if [ -n "$PRIVATE_PASSWORD" ]; then + break + else + print_error "密码不能为空,请重新输入" + fi + done + + # 确认密码 + while true; do + read -s -p "请再次输入密码确认: " password_confirm + echo + if [ "$PRIVATE_PASSWORD" = "$password_confirm" ]; then + break + else + print_error "两次输入的密码不一致,请重新输入" + fi + done +} + +# 测试私有仓库登录 +test_private_login() { + if [ "$NEED_AUTH" != "yes" ]; then + return 0 + fi + + print_step "测试登录私有仓库..." + + if echo "$PRIVATE_PASSWORD" | docker login $PRIVATE_REGISTRY -u "$PRIVATE_USERNAME" --password-stdin; then + print_info "私有仓库登录测试成功!" + return 0 + else + print_error "私有仓库登录测试失败" + return 1 + fi +} + # 显示镜像源选择菜单 show_mirror_menu() { echo print_step "请选择要使用的Docker镜像源配置:" echo "==========================================" - print_choice "1. 私有仓库为主 + 多个备用源(推荐)" - echo " - 主源: ${PRIVATE_REGISTRY}" - echo " - 备源: 阿里云、网易、中科大、腾讯云" - echo " - Docker自动选择最快可用源" - print_choice "2. 仅私有仓库" - echo " - 只使用 ${PRIVATE_REGISTRY}" - echo " - 需要账号密码认证" - echo " - 访问速度最快" - print_choice "3. 仅公共镜像源" - echo " - 不使用私有仓库" - echo " - 使用阿里云、网易、中科大、腾讯云" - print_choice "4. 官方Docker Hub" - echo " - 官方源,镜像最全" - echo " - 国外源,访问可能较慢" - print_choice "5. 自定义配置" - echo " - 手动选择镜像源组合" + + if [ -n "$PRIVATE_REGISTRY" ]; then + print_choice "1. 私有仓库为主 + 多个备用源(推荐)" + echo " - 主源: ${PRIVATE_REGISTRY}" + echo " - 备源: 阿里云、网易、中科大、腾讯云" + echo " - Docker自动选择最快可用源" + print_choice "2. 仅私有仓库" + echo " - 只使用 ${PRIVATE_REGISTRY}" + echo " - 访问速度最快" + print_choice "3. 私有仓库 + 公共镜像源混合" + echo " - 使用私有仓库和部分公共镜像源" + print_choice "4. 仅公共镜像源" + echo " - 不使用私有仓库" + echo " - 使用阿里云、网易、中科大、腾讯云" + print_choice "5. 官方Docker Hub" + echo " - 官方源,镜像最全" + echo " - 国外源,访问可能较慢" + else + print_choice "1. 仅公共镜像源" + echo " - 使用阿里云、网易、中科大、腾讯云" + print_choice "2. 官方Docker Hub" + echo " - 官方源,镜像最全" + echo " - 国外源,访问可能较慢" + print_choice "3. 自定义公共镜像源" + echo " - 手动选择公共镜像源组合" + fi + echo "==========================================" } # 获取用户选择的镜像源 get_mirror_choice() { - while true; do - read -p "请输入选择 (1-5): " choice + if [ -n "$PRIVATE_REGISTRY" ]; then + # 有私有仓库的情况 + while true; do + read -p "请输入选择 (1-5): " choice + case $choice in + 1) + MIRROR_TYPE="private_primary" + MIRROR_NAME="私有仓库为主 + 多个备用源" + break + ;; + 2) + MIRROR_TYPE="private_only" + MIRROR_NAME="仅私有仓库" + break + ;; + 3) + MIRROR_TYPE="mixed" + MIRROR_NAME="私有仓库 + 公共镜像源混合" + break + ;; + 4) + MIRROR_TYPE="public_only" + MIRROR_NAME="仅公共镜像源" + break + ;; + 5) + MIRROR_TYPE="official" + MIRROR_NAME="官方Docker Hub" + break + ;; + *) + print_error "无效选择,请输入 1-5 的数字" + ;; + esac + done + else + # 无私有仓库的情况 + while true; do + read -p "请输入选择 (1-3): " choice + case $choice in + 1) + MIRROR_TYPE="public_only" + MIRROR_NAME="仅公共镜像源" + break + ;; + 2) + MIRROR_TYPE="official" + MIRROR_NAME="官方Docker Hub" + break + ;; + 3) + MIRROR_TYPE="custom_public" + MIRROR_NAME="自定义公共镜像源" + break + ;; + *) + print_error "无效选择,请输入 1-3 的数字" + ;; + esac + done + fi +} + +# 混合配置选择(私有+部分公共) +get_mixed_config() { + echo + print_step "选择要添加的公共镜像源(可多选):" + + MIRRORS=("$PRIVATE_MIRROR") + + 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) - MIRROR_TYPE="private_primary" - MIRROR_NAME="私有仓库为主 + 多个备用源" - break + MIRRORS+=("$ALIYUN_MIRROR") + print_info "已添加阿里云镜像" ;; 2) - MIRROR_TYPE="private_only" - MIRROR_NAME="仅私有仓库" - break + MIRRORS+=("$DOCKER_HUB_MIRROR") + print_info "已添加网易云镜像" ;; 3) - MIRROR_TYPE="public_only" - MIRROR_NAME="仅公共镜像源" - break + MIRRORS+=("$USTC_MIRROR") + print_info "已添加中科大镜像" ;; 4) - MIRROR_TYPE="official" - MIRROR_NAME="官方Docker Hub" - break + MIRRORS+=("$TENCENT_MIRROR") + print_info "已添加腾讯云镜像" ;; 5) - MIRROR_TYPE="custom" - MIRROR_NAME="自定义配置" - break - ;; - *) - print_error "无效选择,请输入 1-5 的数字" + MIRRORS+=("https://registry-1.docker.io") + print_info "已添加官方Docker Hub" ;; esac done + + MIRROR_NAME="混合镜像源(${#MIRRORS[@]}个)" } -# 自定义配置选择 -get_custom_config() { +# 自定义公共镜像源配置 +get_custom_public_config() { echo - print_step "自定义镜像源配置" + 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) 中科大镜像" @@ -174,63 +341,7 @@ get_custom_config() { exit 1 fi - MIRROR_NAME="自定义镜像源(${#MIRRORS[@]}个)" -} - -# 交互式输入私有仓库账号密码 -get_private_credentials() { - if [[ "$MIRROR_TYPE" != "private_primary" && "$MIRROR_TYPE" != "private_only" ]]; then - return 0 - fi - - print_step "请输入私有仓库的认证信息" - - while true; do - read -p "请输入用户名: " username - if [ -n "$username" ]; then - break - else - print_error "用户名不能为空,请重新输入" - fi - done - - while true; do - read -s -p "请输入密码: " password - echo - if [ -n "$password" ]; then - break - else - print_error "密码不能为空,请重新输入" - fi - done - - # 确认密码 - while true; do - read -s -p "请再次输入密码确认: " password_confirm - echo - if [ "$password" = "$password_confirm" ]; then - break - else - print_error "两次输入的密码不一致,请重新输入" - fi - done -} - -# 测试私有仓库登录 -test_private_login() { - if [[ "$MIRROR_TYPE" != "private_primary" && "$MIRROR_TYPE" != "private_only" ]]; then - return 0 - fi - - print_step "测试登录私有仓库..." - - if echo "$password" | docker login $PRIVATE_REGISTRY -u "$username" --password-stdin; then - print_info "私有仓库登录测试成功!" - return 0 - else - print_error "私有仓库登录测试失败,请检查账号密码和网络连接" - return 1 - fi + MIRROR_NAME="自定义公共镜像源(${#MIRRORS[@]}个)" } # 配置镜像源 @@ -243,7 +354,7 @@ configure_mirrors() { # 备份原有配置 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 "已备份原有配置" + print_info "已备份原有配置: /etc/docker/daemon.json.backup.$(date +%Y%m%d%H%M%S)" fi # 根据不同类型生成配置 @@ -274,6 +385,20 @@ EOF "debug": false, "experimental": false } +EOF + ;; + "mixed") + # 混合配置 + mirrors_json=$(printf '"%s",' "${MIRRORS[@]}") + mirrors_json="[${mirrors_json%,}]" + + cat << EOF | sudo tee /etc/docker/daemon.json > /dev/null +{ + "registry-mirrors": $mirrors_json, + "insecure-registries": ["$PRIVATE_REGISTRY"], + "debug": false, + "experimental": false +} EOF ;; "public_only") @@ -303,20 +428,15 @@ EOF } EOF ;; - "custom") - # 自定义配置 + "custom_public") + # 自定义公共镜像源 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, + "insecure-registries": [], "debug": false, "experimental": false } @@ -325,6 +445,7 @@ EOF esac print_info "Docker镜像源配置完成" + print_config "配置文件位置: /etc/docker/daemon.json" } # 重启Docker服务 @@ -344,7 +465,7 @@ restart_docker() { # 保存私有仓库认证信息 save_private_credentials() { - if [[ "$MIRROR_TYPE" != "private_primary" && "$MIRROR_TYPE" != "private_only" ]]; then + if [ "$NEED_AUTH" != "yes" ]; then return 0 fi @@ -354,13 +475,16 @@ save_private_credentials() { if [[ $save_choice =~ ^[Yy]$ ]]; then # 使用Docker login保存认证信息 - if echo "$password" | docker login $PRIVATE_REGISTRY -u "$username" --password-stdin; then + if echo "$PRIVATE_PASSWORD" | docker login $PRIVATE_REGISTRY -u "$PRIVATE_USERNAME" --password-stdin; then print_info "私有仓库认证信息已保存到 ~/.docker/config.json" + CREDENTIALS_SAVED="yes" else print_warning "私有仓库认证信息保存失败" + CREDENTIALS_SAVED="no" fi else print_info "私有仓库认证信息未保存,拉取私有镜像时需要重新登录" + CREDENTIALS_SAVED="no" fi } @@ -394,48 +518,42 @@ show_summary() { echo -e "${GREEN}✓${NC} Docker镜像源配置完成" echo -e "${GREEN}✓${NC} 镜像源类型: ${MIRROR_NAME}" - 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} 认证信息已保存" + if [ -n "$PRIVATE_REGISTRY" ]; then + echo -e "${GREEN}✓${NC} 私有仓库地址: ${PRIVATE_REGISTRY}" + echo -e "${GREEN}✓${NC} 私有仓库镜像: ${PRIVATE_MIRROR}" + + if [ "$NEED_AUTH" = "yes" ]; then + echo -e "${GREEN}✓${NC} 私有仓库认证: 需要" + echo -e "${GREEN}✓${NC} 用户名: ${PRIVATE_USERNAME}" + if [ "$CREDENTIALS_SAVED" = "yes" ]; then + echo -e "${GREEN}✓${NC} 认证信息: 已保存" + else + echo -e "${YELLOW}⚠${NC} 认证信息: 未保存" + fi else - echo -e "${YELLOW}⚠${NC} 认证信息未保存" + echo -e "${GREEN}✓${NC} 私有仓库认证: 无需认证" fi + else + echo -e "${GREEN}✓${NC} 私有仓库: 未配置" fi echo -e "${GREEN}✓${NC} Docker服务已重启生效" echo print_info "使用说明:" - if [[ "$MIRROR_TYPE" == "private_primary" || "$MIRROR_TYPE" == "private_only" ]]; then + if [ -n "$PRIVATE_REGISTRY" ]; then echo " 私有镜像: docker pull ${PRIVATE_REGISTRY}/镜像名称" - echo " 公共镜像: docker pull 镜像名称" - else - echo " 拉取镜像: docker pull 镜像名称" fi + echo " 公共镜像: docker pull 镜像名称" echo " 查看配置: docker info | grep -A 10 'Registry Mirrors'" + echo " 测试拉取: docker pull hello-world" + + echo + print_info "配置文件: /etc/docker/daemon.json" + print_info "备份文件: /etc/docker/daemon.json.backup.*" + if [ -n "$PRIVATE_REGISTRY" ] && [ "$NEED_AUTH" = "yes" ] && [ "$CREDENTIALS_SAVED" = "yes" ]; then + print_info "认证信息: ~/.docker/config.json" + fi } # 主函数 @@ -443,30 +561,37 @@ main() { clear echo "==========================================" echo " Docker镜像源配置脚本" - echo " 主镜像源: ${PRIVATE_REGISTRY}" echo "==========================================" echo # 检查Docker check_docker + # 获取私有仓库配置 + get_private_registry_config + # 显示镜像源菜单 show_mirror_menu # 获取用户选择 get_mirror_choice - # 如果是自定义配置,获取详细选择 - if [ "$MIRROR_TYPE" = "custom" ]; then - get_custom_config + # 如果是混合配置,获取详细选择 + if [ "$MIRROR_TYPE" = "mixed" ]; then + get_mixed_config + elif [ "$MIRROR_TYPE" = "custom_public" ]; then + get_custom_public_config fi - # 如果是私有仓库配置,获取认证信息 - if [[ "$MIRROR_TYPE" == "private_primary" || "$MIRROR_TYPE" == "private_only" ]]; then - get_private_credentials + # 如果是私有仓库需要认证,测试登录 + if [ "$NEED_AUTH" = "yes" ]; then if ! test_private_login; then - print_error "配置中止,请解决登录问题后重新运行脚本" - exit 1 + print_error "私有仓库登录测试失败" + read -p "是否继续配置?(可能会影响私有镜像拉取)(y/N): " continue_anyway + if [[ ! $continue_anyway =~ ^[Yy]$ ]]; then + print_error "配置中止,请解决登录问题后重新运行脚本" + exit 1 + fi fi fi @@ -477,7 +602,7 @@ main() { restart_docker # 保存私有仓库认证信息 - if [[ "$MIRROR_TYPE" == "private_primary" || "$MIRROR_TYPE" == "private_only" ]]; then + if [ "$NEED_AUTH" = "yes" ]; then save_private_credentials fi