#!/bin/bash
# ============================================================
# Alibaba Cloud Linux 一键安装 Docker(最新版)
# 用法: bash install-docker-latest.sh
# ============================================================
set -euo pipefail

# 颜色
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

log_info()  { echo -e "${GREEN}[INFO]${NC} $1"; }
log_warn()  { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }

# ---- 检查 root ----
if [[ $EUID -ne 0 ]]; then
    log_error "请使用 root 用户运行此脚本"
    exit 1
fi

# ---- 检查系统 ----
if [[ -f /etc/os-release ]]; then
    . /etc/os-release
    log_info "检测到系统: ${PRETTY_NAME:-$ID}"
else
    log_warn "无法识别操作系统,继续尝试..."
fi

# ---- Step 1: 清理旧版本 ----
log_info "清理旧版本 Docker..."
dnf remove -y docker docker-client docker-common docker-engine \
    docker-ce docker-ce-cli containerd.io 2>/dev/null || true

# ---- Step 2: 安装依赖 ----
log_info "安装依赖..."
dnf install -y dnf-utils yum-utils curl

# ---- Step 3: 添加 Docker CE 源 ----
log_info "添加 Docker CE 官方源..."
dnf config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 确保使用 el9 源(Alibaba Cloud Linux 基于 EL9)
REPO_FILE="/etc/yum.repos.d/docker-ce.repo"
if [[ -f "$REPO_FILE" ]]; then
    sed -i 's/\$releasever/9/g' "$REPO_FILE"
    log_info "已修正源版本为 el9"
fi

# ---- Step 4: 获取最新版本号 ----
log_info "查询可用最新版本..."
LATEST_VERSION=$(dnf list docker-ce --showduplicates 2>/dev/null \
    | grep docker-ce-stable \
    | grep -oP '\d+\.\d+\.\d+' \
    | sort -V \
    | tail -1)

if [[ -z "$LATEST_VERSION" ]]; then
    log_error "无法获取最新版本号,请检查网络或源配置"
    exit 1
fi

log_info "最新版本: Docker CE ${LATEST_VERSION}"

# ---- Step 5: 安装最新版 ----
log_info "安装 Docker CE ${LATEST_VERSION}..."
dnf install -y \
    docker-ce-${LATEST_VERSION} \
    docker-ce-cli-${LATEST_VERSION} \
    containerd.io

# ---- Step 6: 启动 & 开机自启 ----
log_info "启动 Docker..."
systemctl enable docker
systemctl enable containerd
systemctl start docker

# ---- Step 7: 配置 ----
# 设置 Docker 镜像加速(阿里云)
if [[ ! -f /etc/docker/daemon.json ]]; then
    log_info "配置 Docker 镜像加速..."
    mkdir -p /etc/docker
    cat > /etc/docker/daemon.json << 'EOF'
{
    "registry-mirrors": [
        "https://<your-id>.mirror.aliyuncs.com"
    ],
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "100m",
        "max-file": "3"
    },
    "storage-driver": "overlay2"
}
EOF
    log_warn "请编辑 /etc/docker/daemon.json 替换为你自己的阿里云镜像加速器地址"
    log_warn "获取地址: https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors"
    systemctl restart docker
fi

# ---- Step 8: 安装 docker compose 插件 ----
if ! docker compose version &>/dev/null; then
    log_info "安装 docker compose 插件..."
    ARCH=$(uname -m)
    COMPOSE_URL="https://github.com/docker/compose/releases/latest/download/docker-compose-linux-${ARCH}"
    mkdir -p /usr/local/lib/docker/cli-plugins
    curl -SL "${COMPOSE_URL}" -o /usr/local/lib/docker/cli-plugins/docker-compose
    chmod +x /usr/local/lib/docker/cli-plugins/docker-compose
fi

# ---- Step 9: 验证 ----
log_info "安装完成!版本信息:"
docker version
echo ""
docker compose version 2>/dev/null || true

# ---- Step 10: 快速测试 ----
log_info "运行 hello-world 测试..."
docker run --rm hello-world 2>/dev/null && log_info "✅ Docker 运行正常" || log_warn "⚠️ hello-world 测试失败(可能网络问题),请手动测试"

log_info "🎉 Docker ${LATEST_VERSION} 安装完成!"

发表评论