#!/bin/bash set -e # 发生错误时终止脚本执行 echo "===========================" echo "🚀 开始自动安装 Docker 和 Docker Compose" echo "===========================" # 获取操作系统类型和版本 OS_FAMILY=$(hostnamectl | grep "Operating System" | awk '{print $3}') OS_VERSION="" if [[ "$OS_FAMILY" == "CentOS" ]]; then OS_VERSION=$(grep -oP '(?<=^VERSION_ID=")[0-9.]+' /etc/os-release | cut -d'.' -f1) elif [[ "$OS_FAMILY" == "Ubuntu" ]]; then OS_VERSION=$(lsb_release -cs) fi # 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)..." # 尝试使用国内镜像源的 GPG 密钥 curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg || \ curl -fsSL https://mirrors.nwafu.edu.cn/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg || { echo "❌ 无法获取 Docker GPG 密钥。请检查网络或尝试手动下载。" exit 1 } 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] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null || { echo "❌ 无法添加 Docker 国内镜像源。请检查网络或源地址。" exit 1 } sudo apt-get update -y echo "🐳 安装 Docker (Ubuntu)..." # 安装推荐的 Docker CE 相关组件,包括 docker-buildx-plugin 和 docker-compose-plugin 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)..." # 备份原有 repo 文件 if [ -f "/etc/yum.repos.d/docker-ce.repo" ]; then echo "🔄 备份原有 Docker CE repo 文件..." sudo mv /etc/yum.repos.d/docker-ce.repo /etc/yum.repos.d/docker-ce.repo.bak fi # 尝试配置阿里云镜像源 echo "尝试配置阿里云 Docker CE 镜像源..." sudo tee /etc/yum.repos.d/docker-ce.repo <<-'EOF' [docker-ce-stable] name=Docker CE Stable - $basearch baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/$basearch/stable gpgcheck=1 gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg enabled=1 EOF # 禁用默认的 container-tools 模块 (CentOS 8+) if [[ "$OS_VERSION" -ge "8" ]]; then echo "⚙️ 禁用 CentOS 8+ 默认的 container-tools 模块以避免冲突..." sudo yum module disable -y container-tools || true # 允许失败,某些系统可能没有此模块 sudo yum module enable -y container-tools:docker || true # 允许失败 fi echo "🐳 安装 Docker (CentOS)..." # 尝试安装 Docker CE 及其组件,包括 buildx 插件和 compose 插件 sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin || { echo "❌ Docker 或其组件安装失败。请检查错误日志或尝试更换国内镜像源。" echo "例如,您可以编辑 /etc/yum.repos.d/docker-ce.repo 将 baseurl 更改为其他镜像站,如清华大学:" echo " https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/\$releasever/\$basearch/stable" 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-compose-plugin &> /dev/null; then echo "✅ Docker Compose (插件版) 已安装,跳过安装步骤" elif command -v docker-compose &> /dev/null; then echo "⚠️ 检测到旧版 Docker Compose 独立安装。为保持最新兼容性,推荐使用 Docker Compose 插件版。" echo "如果您希望继续使用旧版,可以忽略此提示。" echo "如果需要安装插件版,请先卸载旧版或手动安装 docker-compose-plugin。" else echo "⚙️ 安装 Docker Compose (插件版)..." # 尝试安装 docker-compose-plugin,它通常随 docker-ce 一起安装 if [[ "$OS_FAMILY" == "Ubuntu" ]]; then sudo apt-get install -y docker-compose-plugin || { echo "❌ 无法安装 docker-compose-plugin。请检查您的 APT 源或网络。" exit 1 } elif [[ "$OS_FAMILY" == "CentOS" ]]; then sudo yum install -y docker-compose-plugin || { echo "❌ 无法安装 docker-compose-plugin。请检查您的 YUM 源或网络。" 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应用启动成功"