From c8d32ae758389483cf28224ae99f889b595c8fb4 Mon Sep 17 00:00:00 2001 From: xzx3344521 Date: Fri, 31 Oct 2025 13:16:34 +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 加速 | 352 +++++++++++++++++++++++++++++----------------------- 1 file changed, 196 insertions(+), 156 deletions(-) diff --git a/Docker 加速 b/Docker 加速 index 34df153..89e1fb6 100644 --- a/Docker 加速 +++ b/Docker 加速 @@ -1,7 +1,10 @@ #!/bin/bash -# Docker 加速器域名 -ACCELERATOR_DOMAIN="github.vps7k7k.xyz" +# Docker私有仓库配置脚本 +# 作者: 你的名称 +# 描述: 配置Docker使用私有加速镜像仓库 + +set -e # 颜色定义 RED='\033[0;31m' @@ -10,194 +13,231 @@ YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color -echo -e "${BLUE}=== Docker 加速源一键更换脚本 ===${NC}" -echo -e "${YELLOW}加速器域名: ${ACCELERATOR_DOMAIN}${NC}" -echo +# 仓库地址 +REGISTRY_URL="github.vps7k7k.xyz" -# 函数:显示当前Docker配置 -show_current_config() { - echo -e "${GREEN}当前Docker配置:${NC}" - - if [ -f /etc/docker/daemon.json ]; then - echo -e "${YELLOW}/etc/docker/daemon.json 内容:${NC}" - cat /etc/docker/daemon.json 2>/dev/null | python -m json.tool 2>/dev/null || cat /etc/docker/daemon.json - else - echo -e "${RED}/etc/docker/daemon.json 文件不存在${NC}" - fi - - echo - if command -v docker &> /dev/null; then - echo -e "${YELLOW}Docker info 中的Registry mirrors:${NC}" - docker info 2>/dev/null | grep -A 10 "Registry Mirrors" || echo "无法获取或未设置镜像加速" - else - echo -e "${RED}Docker 未安装或未运行${NC}" - fi - echo +# 打印彩色信息 +print_info() { + echo -e "${GREEN}[INFO]${NC} $1" } -# 函数:备份原有配置 -backup_config() { - local backup_file="/etc/docker/daemon.json.backup.$(date +%Y%m%d_%H%M%S)" - if [ -f /etc/docker/daemon.json ]; then - cp /etc/docker/daemon.json "$backup_file" - echo -e "${GREEN}已备份原配置到: $backup_file${NC}" +print_warning() { + echo -e "${YELLOW}[WARNING]${NC} $1" +} + +print_error() { + echo -e "${RED}[ERROR]${NC} $1" +} + +print_step() { + echo -e "${BLUE}[STEP]${NC} $1" +} + +# 检查Docker是否安装 +check_docker() { + if ! command -v docker &> /dev/null; then + print_error "Docker 未安装,请先安装Docker" + exit 1 fi + print_info "Docker 已安装,版本: $(docker --version | cut -d' ' -f3 | cut -d',' -f1)" } -# 函数:设置加速源 -setup_accelerator() { - local temp_file=$(mktemp) +# 交互式输入账号密码 +get_credentials() { + print_step "请输入私有仓库的认证信息" - # 创建新的daemon.json配置 - cat > "$temp_file" << EOF -{ - "registry-mirrors": [ - "https://${ACCELERATOR_DOMAIN}" - ], - "dns": ["8.8.8.8", "114.114.114.114"] -} -EOF - - # 如果已有daemon.json,合并配置 - if [ -f /etc/docker/daemon.json ]; then - echo -e "${YELLOW}检测到已有配置,进行合并...${NC}" - python3 - </dev/null || jq -s '.[0] * .[1]' /etc/docker/daemon.json "$temp_file" 2>/dev/null -import json -import sys - -with open('/etc/docker/daemon.json', 'r') as f: - old_config = json.load(f) - -with open('$temp_file', 'r') as f: - new_config = json.load(f) - -# 合并配置,优先使用新配置的registry-mirrors -merged_config = {**old_config, **new_config} -merged_config['registry-mirrors'] = new_config['registry-mirrors'] - -print(json.dumps(merged_config, indent=2)) -EOF - if [ $? -eq 0 ]; then - python3 - < "$temp_file" -import json -import sys - -with open('/etc/docker/daemon.json', 'r') as f: - old_config = json.load(f) - -with open('$temp_file', 'r') as f: - new_config = json.load(f) - -# 合并配置,优先使用新配置的registry-mirrors -merged_config = {**old_config, **new_config} -merged_config['registry-mirrors'] = new_config['registry-mirrors'] - -print(json.dumps(merged_config, indent=2)) -EOF + while true; do + read -p "请输入用户名: " username + if [ -n "$username" ]; then + break + else + print_error "用户名不能为空,请重新输入" fi - fi - - # 移动新配置到目标位置 - sudo mv "$temp_file" /etc/docker/daemon.json - sudo chmod 600 /etc/docker/daemon.json + 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 } -# 函数:重启Docker服务 -restart_docker() { - echo -e "${YELLOW}重启Docker服务...${NC}" +# 测试登录 +test_login() { + print_step "测试登录私有仓库..." - if command -v systemctl &> /dev/null; then - sudo systemctl daemon-reload - sudo systemctl restart docker - elif command -v service &> /dev/null; then - sudo service docker restart - else - echo -e "${RED}无法确定如何重启Docker服务${NC}" - return 1 - fi - - # 等待Docker启动 - sleep 3 - - if sudo docker ps &> /dev/null; then - echo -e "${GREEN}Docker 服务重启成功${NC}" + if echo "$password" | docker login $REGISTRY_URL -u "$username" --password-stdin; then + print_info "登录测试成功!" return 0 else - echo -e "${RED}Docker 服务重启失败${NC}" + print_error "登录测试失败,请检查账号密码和网络连接" return 1 fi } -# 函数:验证加速器 -verify_accelerator() { - echo -e "${YELLOW}验证加速器配置...${NC}" +# 配置Docker镜像源 +configure_docker_mirror() { + print_step "配置Docker镜像源..." - if docker info 2>/dev/null | grep -q "${ACCELERATOR_DOMAIN}"; then - echo -e "${GREEN}✓ 加速器配置成功${NC}" - echo -e "${BLUE}加速器地址: https://${ACCELERATOR_DOMAIN}${NC}" + # 创建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 +{ + "registry-mirrors": ["https://${REGISTRY_URL}"], + "insecure-registries": [], + "debug": true, + "experimental": false +} +EOF + + print_info "Docker镜像源配置完成" +} + +# 重启Docker服务 +restart_docker() { + print_step "重启Docker服务..." + + if sudo systemctl restart docker; then + print_info "Docker服务重启成功" else - echo -e "${RED}✗ 加速器配置可能未生效${NC}" + print_error "Docker服务重启失败" + exit 1 + fi + + # 等待Docker服务完全启动 + sleep 3 +} + +# 保存认证信息(可选) +save_credentials() { + print_step "是否保存认证信息?" + echo "如果保存,以后拉取镜像时不需要重复输入密码" + read -p "是否保存认证信息?(y/N): " save_choice + + if [[ $save_choice =~ ^[Yy]$ ]]; then + # 使用Docker login保存认证信息 + if echo "$password" | docker login $REGISTRY_URL -u "$username" --password-stdin; then + print_info "认证信息已保存到 ~/.docker/config.json" + else + print_warning "认证信息保存失败,但镜像源配置已完成" + fi + else + print_info "认证信息未保存,每次拉取私有镜像时需要重新登录" fi } -# 函数:显示使用示例 -show_usage_examples() { - echo -e "${GREEN}使用示例:${NC}" - echo -e " ${YELLOW}Docker 官方镜像:${NC}" - echo -e " docker pull ${ACCELERATOR_DOMAIN}/nginx" - echo -e " ${YELLOW}Docker Hub 用户镜像:${NC}" - echo -e " docker pull ${ACCELERATOR_DOMAIN}/user/image" - echo -e " ${YELLOW}GHCR 镜像:${NC}" - echo -e " docker pull ${ACCELERATOR_DOMAIN}/ghcr.io/user/image" - echo -e " ${YELLOW}Quay.io 镜像:${NC}" - echo -e " docker pull ${ACCELERATOR_DOMAIN}/quay.io/org/image" - echo -e " ${YELLOW}Kubernetes 镜像:${NC}" - echo -e " docker pull ${ACCELERATOR_DOMAIN}/registry.k8s.io/pause:3.8" +# 验证配置 +verify_configuration() { + print_step "验证配置..." + + # 检查Docker配置 + if sudo systemctl is-active --quiet docker; then + print_info "Docker服务运行正常" + else + print_error "Docker服务未运行" + exit 1 + fi + + # 检查配置是否生效 + if sudo docker info | grep -q "$REGISTRY_URL"; then + print_info "镜像源配置已生效" + else + print_warning "镜像源配置可能未生效,请手动检查" + fi + + # 测试拉取镜像(可选) + print_step "是否测试拉取nginx镜像?" + read -p "进行测试?(y/N): " test_choice + + if [[ $test_choice =~ ^[Yy]$ ]]; then + print_info "开始拉取测试镜像..." + if sudo docker pull ${REGISTRY_URL}/nginx; then + print_info "镜像拉取测试成功!" + else + print_warning "镜像拉取测试失败,请检查网络连接和认证信息" + fi + fi +} + +# 显示配置摘要 +show_summary() { echo - echo -e "${BLUE}注意: 使用加速器时,需要在镜像前加上加速器域名${NC}" + print_info "=== 配置完成摘要 ===" + echo -e "${GREEN}✓${NC} Docker私有仓库配置完成" + echo -e "${GREEN}✓${NC} 镜像源: ${REGISTRY_URL}" + echo -e "${GREEN}✓${NC} 用户名: ${username}" + echo -e "${GREEN}✓${NC} Docker服务已重启生效" + + if [[ $save_choice =~ ^[Yy]$ ]]; then + echo -e "${GREEN}✓${NC} 认证信息已保存,后续使用无需重复登录" + else + echo -e "${YELLOW}⚠${NC} 认证信息未保存,拉取私有镜像时需要重新登录" + fi + + echo + print_info "使用示例:" + echo " docker pull ${REGISTRY_URL}/镜像名称" + echo " docker pull ${REGISTRY_URL}/nginx" } # 主函数 main() { - # 显示当前配置 - show_current_config - - # 确认操作 - read -p "是否继续设置加速源? (y/N): " confirm - if [[ ! "$confirm" =~ ^[Yy]$ ]]; then - echo -e "${YELLOW}已取消操作${NC}" - exit 0 - fi - + clear + echo "==========================================" + echo " Docker私有仓库配置脚本" + echo "==========================================" echo - # 检查Docker是否安装 - if ! command -v docker &> /dev/null; then - echo -e "${RED}错误: Docker 未安装${NC}" + # 检查Docker + check_docker + + # 获取认证信息 + get_credentials + + # 测试登录 + if ! test_login; then + print_error "配置中止,请解决登录问题后重新运行脚本" exit 1 fi - # 检查是否以root权限运行 - if [[ $EUID -eq 0 ]]; then - echo -e "${RED}警告: 不建议以root用户运行此脚本${NC}" - read -p "是否继续? (y/N): " root_confirm - if [[ ! "$root_confirm" =~ ^[Yy]$ ]]; then - exit 0 - fi - fi + # 配置镜像源 + configure_docker_mirror - # 执行配置流程 - backup_config - setup_accelerator + # 重启Docker服务 + restart_docker - if restart_docker; then - verify_accelerator - echo - show_usage_examples - else - echo -e "${RED}配置失败,请检查Docker服务状态${NC}" - fi + # 保存认证信息 + save_credentials + + # 验证配置 + verify_configuration + + # 显示摘要 + show_summary } # 运行主函数 -main +main "$@"