#!/bin/bash set -e # 发生错误时终止脚本执行 echo "===========================" echo "🚀 开始自动安装 Docker 和 Docker Compose" echo "===========================" # 获取操作系统类型和版本 OS_FAMILY=$(hostnamectl | grep "Operating System" | awk '{print $3}') OS_VERSION_ID=$(grep -oP '(?<=^VERSION_ID=")[0-9.]+' /etc/os-release | cut -d'.' -f1) OS_CODENAME="" if [[ "$OS_FAMILY" == "Ubuntu" ]]; then OS_CODENAME=$(lsb_release -cs) fi # 定义国内镜像源 # Ubuntu 镜像源 UBUNTU_DOCKER_MIRROR_URL="https://mirrors.ustc.edu.cn/docker-ce" # 中科大 UBUNTU_DOCKER_GPG_URL="https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg" # CentOS 镜像源 (选择一个即可,这里提供清华和阿里云) CENTOS_DOCKER_MIRROR_URL="https://mirrors.tuna.tsinghua.edu.cn/docker-ce" # 清华大学 # CENTOS_DOCKER_MIRROR_URL="https://mirrors.aliyun.com/docker-ce" # 阿里云 - 如果清华源不稳定可以尝试这个 # 函数:检查并等待网络连接 check_network() { echo "🌐 检查网络连接到 Docker 官方仓库 (备用)..." if curl -sSf https://download.docker.com/ &> /dev/null; then echo "✅ 网络连接到 Docker 官方仓库正常。" return 0 else echo "⚠️ 无法连接到 Docker 官方仓库。将尝试使用国内镜像源。" # 即使无法连接官方源,也继续尝试国内源 return 0 fi } # 预检网络连接(非阻塞,仅作为提示) check_network # Docker 安装 if command -v docker &> /dev/null; then echo "✅ Docker 已安装,跳过安装步骤" else if [[ "$OS_FAMILY" == "Ubuntu" ]]; then echo "📦 安装依赖 (Ubuntu)..." sudo apt update -y sudo apt install -y apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release echo "🔑 添加 Docker GPG 密钥 (Ubuntu) - 优先使用国内镜像源..." # 现代 Ubuntu 推荐使用 gpg --dearmor sudo install -m 0755 -d /etc/apt/keyrings if ! curl -fsSL "$UBUNTU_DOCKER_GPG_URL" | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg; then echo "❌ 无法从国内镜像源获取 GPG 密钥,尝试从官方源获取..." curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg || { echo "❌ 无法获取 Docker GPG 密钥,请检查网络或 GPG 密钥 URL。" exit 1 } fi sudo chmod a+r /etc/apt/keyrings/docker.gpg # 确保可读权限 echo "🌍 添加 Docker 源 (Ubuntu) - 使用国内镜像源..." echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] $UBUNTU_DOCKER_MIRROR_URL/linux/ubuntu \ $OS_CODENAME stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update -y echo "🐳 安装 Docker (Ubuntu)..." sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin || { echo "❌ Docker 或其组件安装失败。请检查错误日志或尝试手动安装。" exit 1 } elif [[ "$OS_FAMILY" == "CentOS" ]]; then echo "📦 安装依赖 (CentOS)..." sudo yum install -y yum-utils device-mapper-persistent-data lvm2 echo "🌍 添加 Docker 源 (CentOS) - 使用国内镜像源..." # 添加 Docker CE 官方 repo sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 替换为国内镜像源 echo "🔄 替换 Docker 源为国内镜像 ($CENTOS_DOCKER_MIRROR_URL)..." sudo sed -i "s+https://download.docker.com+$CENTOS_DOCKER_MIRROR_URL+" /etc/yum.repos.d/docker-ce.repo || { echo "❌ 替换 Docker 源失败,可能 repo 文件路径不正确或无权限。" exit 1 } # CentOS 8+ 可能会遇到 module 冲突,禁用默认的 container-tools 模块 if [[ "$OS_VERSION_ID" -ge "8" ]]; then echo "⚙️ 禁用 CentOS 8+ 默认的 container-tools 模块以避免冲突..." sudo yum module disable -y container-tools sudo yum module enable -y container-tools:docker fi sudo yum makecache echo "🐳 安装 Docker (CentOS)..." sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin || { echo "❌ Docker 或其组件安装失败。请检查错误日志或尝试手动安装。" echo "提示:如果仍遇到下载问题,请检查网络、防火墙或尝试切换另一个国内镜像源。" exit 1 } else echo "❌ 未知操作系统 ($OS_FAMILY),无法安装 Docker。" exit 1 fi echo "✅ 启动并设置 Docker 开机自启..." sudo systemctl enable docker sudo systemctl start docker # 将当前用户添加到 docker 组,以便无需 sudo 运行 Docker 命令 if ! getent group docker | grep -qw "$USER"; then echo "👥 将当前用户 ($USER) 添加到 docker 组..." sudo usermod -aG docker "$USER" echo "🔔 请注销并重新登录,以便更改生效。" fi fi # Docker Compose 检查和安装 (优先使用 docker-compose-plugin) if command -v docker &> /dev/null && docker compose version &> /dev/null; then echo "✅ Docker Compose (插件版) 已安装,跳过安装步骤" elif command -v docker-compose &> /dev/null && ! command -v docker &> /dev/null; then echo "⚠️ 检测到旧版 Docker Compose 独立安装,但未检测到 Docker 插件版。" echo "建议在安装 Docker CE 时一起安装 docker-compose-plugin。" else echo "⚙️ 安装 Docker Compose (插件版)..." # 如果 Docker CE 安装成功,docker-compose-plugin 应该已经安装了。 # 这里是额外的检查,以防万一。 if [[ "$OS_FAMILY" == "Ubuntu" ]]; then sudo apt-get install -y docker-compose-plugin || { echo "❌ Docker Compose 插件版安装失败,请手动检查。" exit 1 } elif [[ "$OS_FAMILY" == "CentOS" ]]; then sudo yum install -y docker-compose-plugin || { echo "❌ Docker Compose 插件版安装失败,请手动检查。" exit 1 } else echo "❌ 未知操作系统,无法安装 Docker Compose 插件版。" exit 1 fi fi echo "📌 Docker 运行状态:" sudo systemctl status docker --no-pager || true echo "📌 Docker Compose 版本:" # 优先使用 docker compose 命令(新版),如果不行再尝试 docker-compose(旧版或别名) if command -v docker &> /dev/null && docker compose version &> /dev/null; then docker compose version elif command -v docker-compose &> /dev/null; then docker-compose -v else echo "❌ 无法检测 Docker Compose 版本。" fi echo "🎉 Docker 和 Docker Compose 已就绪!" echo "🚀 启动EasyAI" # 对于新版 docker-compose-plugin,命令是 'docker compose' if command -v docker &> /dev/null && docker compose version &> /dev/null; then sudo docker compose pull && sudo docker compose up -d else # 兼容旧版独立安装的 docker-compose sudo docker-compose pull && sudo docker-compose up -d fi echo "🎉EasyAI应用启动成功"