diff --git a/version/install-docker-v1.1.sh b/version/install-docker-v1.1.sh new file mode 100644 index 0000000..b1bb7c1 --- /dev/null +++ b/version/install-docker-v1.1.sh @@ -0,0 +1,628 @@ +#!/bin/bash + +############################################################################## +# 通用Linux Docker一键安装脚本 +# 功能:支持多种Linux发行版,自动适配国内外网络环境,安装Docker和Docker Compose +# 版本:2.8 +# 版权声明:该脚本由 xblog.tech 维护 +# 支持系统:Ubuntu, Debian, CentOS, RHEL, Fedora, Rocky Linux, AlmaLinux等 +# 注意:国内网络环境下将使用第三方脚本,请谨慎选择 +############################################################################## + +set -e + +# 颜色输出定义 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # 无颜色 + +# 日志函数 +log_info() { + echo -e "${GREEN}[INFO]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1" +} + +log_warn() { + echo -e "${YELLOW}[WARN]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1" +} + +log_error() { + echo -e "${RED}[ERROR]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1" +} + +log_notice() { + echo -e "${BLUE}[NOTICE]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1" +} + +log_debug() { + echo -e "${BLUE}[DEBUG]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1" +} + +# 检查命令是否存在 +command_exists() { + command -v "$1" >/dev/null 2>&1 +} + +# 获取系统信息 +get_os_info() { + if [ -f /etc/os-release ]; then + . /etc/os-release + OS_NAME=$(echo $ID | tr '[:upper:]' '[:lower:]') + OS_VERSION=$(echo $VERSION_ID | tr '[:upper:]' '[:lower:]') + OS_CODENAME=$(echo $VERSION_CODENAME | tr '[:upper:]' '[:lower:]') + if [ -z "$OS_CODENAME" ]; then + OS_CODENAME=$(lsb_release -cs 2>/dev/null || echo "unknown") + fi + else + log_error "无法检测操作系统信息" + exit 1 + fi +} + +# 获取系统架构 +get_architecture() { + ARCH=$(uname -m) + case $ARCH in + x86_64) ARCH="x86_64" ;; + aarch64) ARCH="aarch64" ;; + armv7l) ARCH="armv7" ;; + *) + log_error "不支持的架构: $ARCH" + exit 1 + ;; + esac + echo $ARCH +} + +# 检测网络环境(检查与Docker官方的连通性) +detect_network_environment() { + log_info "检测网络环境..." + + if curl -s --connect-timeout 10 https://get.docker.com/ > /dev/null; then + log_info "国外网络环境检测正常,优先使用官方源安装" + return 0 + else + log_warn "国外网络访问不畅,将使用国内镜像源安装" + return 1 + fi +} + +# 使用官方脚本安装Docker +install_docker_official() { + log_info "开始使用Docker官方脚本安装..." + + # 下载并执行官方安装脚本 + if curl -fsSL https://get.docker.com -o get-docker.sh; then + sh get-docker.sh + # 清理临时文件 + rm -f get-docker.sh + return 0 + else + log_error "下载Docker官方安装脚本失败" + return 1 + fi +} + +# 显示第三方脚本安全提醒 +show_third_party_warning() { + echo "================================================================" + log_notice " 安全提醒" + echo "================================================================" + log_warn "您即将使用第三方脚本安装Docker,请注意以下事项:" + log_warn "1. 第三方脚本的安全性我们无法保证" + log_warn "2. 请确保您信任所使用的第三方脚本" + log_warn "3. 建议在安装前审查脚本内容" + log_warn "4. 生产环境请谨慎使用" + echo "" + log_info "可选的第三方脚本:" + log_info "A. 轩辕镜像脚本 (https://xuanyuan.cloud/docker.sh)" + log_info "B. LinuxMirrors脚本 (https://linuxmirrors.cn/docker.sh)" + echo "================================================================" +} + +# 使用第三方脚本安装Docker +install_docker_third_party() { + show_third_party_warning + + # 让用户选择安装方式 + echo "" + log_info "请选择安装方式:" + echo "1) 使用轩辕镜像脚本安装 (推荐)" + echo "2) 使用LinuxMirrors脚本安装" + echo "3) 退出安装" + read -p "请输入选择 [1-3]: " choice + + case $choice in + 1) + log_info "您选择了轩辕镜像脚本" + log_warn "请注意:该脚本由第三方维护,安全性请自行评估" + read -p "确认继续?(y/N): " confirm + if [[ $confirm =~ ^[Yy]$ ]]; then + bash <(wget -qO- https://xuanyuan.cloud/docker.sh || curl -sSL https://xuanyuan.cloud/docker.sh) + else + log_info "安装已取消" + exit 0 + fi + ;; + 2) + log_info "您选择了LinuxMirrors脚本" + log_warn "请注意:该脚本由第三方维护,安全性请自行评估" + read -p "确认继续?(y/N): " confirm + if [[ $confirm =~ ^[Yy]$ ]]; then + bash <(curl -sSL https://linuxmirrors.cn/docker.sh || wget -qO- https://linuxmirrors.cn/docker.sh) + else + log_info "安装已取消" + exit 0 + fi + ;; + 3) + log_info "安装已取消" + exit 0 + ;; + *) + log_error "无效选择,安装已取消" + exit 1 + ;; + esac +} + +# 安装系统依赖 +install_dependencies() { + log_info "安装系统依赖包..." + + if command_exists apt-get; then + apt-get update || log_warn "apt-get update 失败,但继续执行..." + apt-get install -y curl gnupg lsb-release ca-certificates + + elif command_exists yum; then + yum install -y curl gpg dbus-utils device-mapper-persistent-data lvm2 + + elif command_exists dnf; then + dnf install -y curl gpg dbus-utils device-mapper-persistent-data lvm2 + + else + log_error "不支持的包管理器" + exit 1 + fi +} + +# 配置Docker国内镜像源 +setup_docker_repo_cn() { + log_info "配置Docker国内镜像源..." + + get_os_info + log_info "检测到 ${OS_NAME} ${OS_VERSION} (${OS_CODENAME}) 系统" + + if command_exists apt-get; then + # Debian/Ubuntu + mkdir -p /etc/apt/keyrings + + # 根据系统类型选择正确的仓库路径 + if [ "$OS_NAME" = "debian" ]; then + log_info "配置Debian国内镜像源..." + curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg + echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/debian $OS_CODENAME stable" > /etc/apt/sources.list.d/docker.list + else + log_info "配置Ubuntu国内镜像源..." + curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg + echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $OS_CODENAME stable" > /etc/apt/sources.list.d/docker.list + fi + + apt-get update + + elif command_exists yum || command_exists dnf; then + # CentOS/RHEL/Fedora等 + log_info "配置CentOS/RHEL国内镜像源..." + if command_exists dnf; then + dnf config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo + else + yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo + fi + else + log_error "不支持的Linux发行版" + exit 1 + fi +} + +# 安装Docker包 +install_docker_packages() { + log_info "安装Docker引擎..." + + if command_exists apt-get; then + # 对于较新的Debian/Ubuntu版本,可能需要安装containerd.io的特定版本 + if ! apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin; then + log_warn "标准安装失败,尝试替代安装方案..." + apt-get install -y docker.io + fi + + elif command_exists yum; then + yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin + + elif command_exists dnf; then + dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin + fi +} + +# 配置国内镜像加速器 +setup_docker_mirror_cn() { + log_info "配置国内镜像加速器..." + mkdir -p /etc/docker + + # 测试可用的镜像加速器 + local mirrors=( + "https://docker.xuanyuan.me" + "https://docker.1ms.run" + "https://mirror.ccs.tencentyun.com" + "https://docker.mirrors.ustc.edu.cn" + "https://hub-mirror.c.163.com" + ) + + # 选择前3个可用的镜像 + local available_mirrors=() + for mirror in "${mirrors[@]}"; do + if curl -s --connect-timeout 3 "$mirror" > /dev/null; then + available_mirrors+=("$mirror") + log_info "镜像加速器可用: $mirror" + if [ ${#available_mirrors[@]} -ge 3 ]; then + break + fi + fi + done + + if [ ${#available_mirrors[@]} -eq 0 ]; then + log_warn "未找到可用的镜像加速器,使用默认配置" + available_mirrors=( + "https://docker.xuanyuan.me" + "https://docker.1ms.run" + "https://mirror.ccs.tencentyun.com" + ) + fi + + # 构建daemon.json + local daemon_config="{ + \"registry-mirrors\": [" + + for i in "${!available_mirrors[@]}"; do + daemon_config+="\n \"${available_mirrors[$i]}\"" + if [ $i -lt $((${#available_mirrors[@]} - 1)) ]; then + daemon_config+="," + fi + done + + daemon_config+="\n ]\n}" + + echo -e "$daemon_config" > /etc/docker/daemon.json + log_info "已配置 ${#available_mirrors[@]} 个镜像加速器" +} + +# 启动Docker服务 +start_docker_service() { + log_info "启动Docker服务..." + + systemctl enable docker + if ! systemctl start docker; then + log_error "Docker服务启动失败" + systemctl status docker + return 1 + fi + + # 等待服务完全启动 + sleep 5 + + # 验证Docker服务状态 + if systemctl is-active --quiet docker; then + log_info "Docker服务启动成功" + return 0 + else + log_error "Docker服务启动失败" + systemctl status docker + return 1 + fi +} + +# 安装Docker Compose +install_docker_compose() { + log_info "开始安装Docker Compose..." + + # 检查是否已经安装了Docker Compose Plugin + if docker compose version &>/dev/null; then + log_info "Docker Compose Plugin 已安装" + docker compose version + return 0 + fi + + # 检查是否已经安装了独立版本的Docker Compose + if command_exists docker-compose; then + log_info "Docker Compose 已安装" + docker-compose --version + return 0 + fi + + # 获取系统架构 + local ARCH=$(get_architecture) + + # 定义Docker Compose版本 + local COMPOSE_VERSION="2.24.0" + + # 下载Docker Compose二进制文件 + log_info "下载Docker Compose v${COMPOSE_VERSION}..." + + # 尝试使用国内镜像下载 + local download_url="" + if detect_network_environment; then + # 国外网络 - 使用官方源 + download_url="https://github.com/docker/compose/releases/download/v${COMPOSE_VERSION}/docker-compose-linux-${ARCH}" + else + # 国内网络 - 使用镜像源 + download_url="https://ghproxy.com/https://github.com/docker/compose/releases/download/v${COMPOSE_VERSION}/docker-compose-linux-${ARCH}" + fi + + # 下载Docker Compose + if curl -L "$download_url" -o /usr/local/bin/docker-compose; then + chmod +x /usr/local/bin/docker-compose + + # 创建符号链接以便使用 docker compose 命令 + ln -sf /usr/local/bin/docker-compose /usr/local/bin/docker-compose + + # 验证安装 + if docker-compose --version; then + log_info "Docker Compose 安装成功" + return 0 + else + log_error "Docker Compose 安装验证失败" + return 1 + fi + else + log_error "下载Docker Compose失败" + + # 尝试备用安装方法 - 使用pip安装 + log_info "尝试使用pip安装Docker Compose..." + if command_exists pip3; then + if pip3 install docker-compose; then + log_info "Docker Compose 通过pip安装成功" + return 0 + fi + elif command_exists pip; then + if pip install docker-compose; then + log_info "Docker Compose 通过pip安装成功" + return 0 + fi + fi + + log_error "所有Docker Compose安装方法都失败了" + return 1 + fi +} + +# 验证安装 +verify_installation() { + log_info "验证Docker安装..." + + if command_exists docker; then + docker --version + log_info "Docker安装成功!" + + # 验证Docker Compose + if docker compose version &>/dev/null; then + log_info "Docker Compose Plugin 已安装:" + docker compose version + elif command_exists docker-compose; then + log_info "Docker Compose 已安装:" + docker-compose --version + else + log_warn "Docker Compose 未安装" + fi + + return 0 + else + log_error "Docker安装失败" + return 1 + fi +} + +# 显示安装完成信息 +show_completion_info() { + echo "" + log_info "================================================================" + log_info " Docker安装完成" + log_info "================================================================" + log_info "常用命令:" + log_info " 检查Docker版本: docker --version" + log_info " 检查Docker Compose版本: docker-compose --version 或 docker compose version" + log_info " 检查状态: systemctl status docker" + log_info " 启动服务: systemctl start docker" + log_info " 停止服务: systemctl stop docker" + log_info "" + log_info "使用提示:" + log_info " 1. 使用 'docker ps' 查看运行中的容器" + log_info " 2. 使用 'docker-compose up' 运行docker-compose项目" + log_info " 3. 查看日志: journalctl -u docker.service" + log_info "================================================================" +} + +# 直接使用国内镜像源安装(无需用户交互) +install_docker_direct_cn() { + log_info "使用国内镜像源直接安装Docker..." + + # 安装依赖 + if ! install_dependencies; then + log_error "安装依赖包失败" + return 1 + fi + + # 配置Docker仓库 + if ! setup_docker_repo_cn; then + log_error "配置Docker仓库失败" + return 1 + fi + + # 安装Docker + if ! install_docker_packages; then + log_error "安装Docker包失败" + return 1 + fi + + # 配置镜像加速器 + setup_docker_mirror_cn + + # 启动服务 + if ! start_docker_service; then + log_error "启动Docker服务失败" + return 1 + fi + + return 0 +} + +# 使用备用方案安装Docker(当主要方法失败时) +install_docker_fallback() { + log_info "尝试使用备用方案安装Docker..." + + get_os_info + + if command_exists apt-get; then + # 对于Debian/Ubuntu,尝试使用系统自带的docker.io包 + log_info "使用系统自带的docker.io包安装..." + apt-get update + if apt-get install -y docker.io; then + log_info "docker.io安装成功" + return 0 + else + log_error "备用安装方案也失败了" + return 1 + fi + else + log_error "没有可用的备用安装方案" + return 1 + fi +} + +# 询问是否安装Docker Compose +ask_install_compose() { + echo "" + log_info "是否安装Docker Compose?" + echo "1) 是,安装Docker Compose" + echo "2) 否,跳过安装" + read -p "请输入选择 [1-2] (默认1): " compose_choice + + case ${compose_choice:-1} in + 1) + if install_docker_compose; then + log_info "Docker Compose安装完成" + else + log_warn "Docker Compose安装失败,但Docker已成功安装" + fi + ;; + 2) + log_info "跳过Docker Compose安装" + ;; + *) + log_error "无效选择,跳过Docker Compose安装" + ;; + esac +} + +# 自动重试安装(国外失败时切换到国内) +install_docker_with_retry() { + local network_ok=$1 + + if [ $network_ok -eq 0 ]; then + # 国外网络 - 先尝试官方脚本 + log_info "优先使用国外官方脚本安装..." + if install_docker_official; then + return 0 + else + log_warn "国外官方脚本安装失败,自动切换到国内镜像源安装..." + # 国外安装失败,切换到国内安装 + if install_docker_direct_cn; then + return 0 + else + log_warn "国内镜像源安装失败,尝试备用方案..." + if install_docker_fallback; then + return 0 + else + return 1 + fi + fi + fi + else + # 国内网络 - 直接使用国内镜像源 + log_info "使用国内镜像源安装..." + if install_docker_direct_cn; then + return 0 + else + log_warn "国内镜像源安装失败,尝试备用方案..." + if install_docker_fallback; then + return 0 + else + return 1 + fi + fi + fi +} + +# 国内网络环境下的自动安装(无需用户交互) +install_docker_auto_cn() { + log_info "检测到国内网络环境,开始自动安装..." + + # 直接使用国内镜像源安装 + if install_docker_direct_cn; then + return 0 + else + log_warn "国内镜像源安装失败,尝试备用方案..." + if install_docker_fallback; then + return 0 + else + return 1 + fi + fi +} + +# 主函数 +main() { + log_info "开始安装Docker..." + log_info "版权声明:该脚本由 xblog.tech 维护" + + # 检查root权限 + if [ "$(id -u)" -ne 0 ]; then + log_error "请使用root权限运行此脚本" + log_error "示例: sudo $0" + exit 1 + fi + + # 获取系统信息 + get_os_info + log_info "操作系统: ${OS_NAME} ${OS_VERSION} (${OS_CODENAME})" + + # 检测网络环境 + detect_network_environment + local network_ok=$? + + if [ $network_ok -eq 0 ]; then + # 国外网络 - 使用自动重试安装 + log_info "使用国外网络安装模式(失败时自动切换到国内源)" + if install_docker_with_retry $network_ok; then + ask_install_compose + verify_installation + show_completion_info + else + log_error "所有安装方法都失败了" + exit 1 + fi + else + # 国内网络 - 自动安装,无需用户选择 + log_info "使用国内网络安装模式(自动安装)" + if install_docker_auto_cn; then + ask_install_compose + verify_installation + show_completion_info + else + log_error "所有安装方法都失败了" + exit 1 + fi + fi +} + +# 执行主函数 +main "$@" \ No newline at end of file