#!/bin/bash # chmod +x 03-docker.sh && ./03-docker.sh # curl -sS -O https://gitea.tohub.top/Share/vps/raw/branch/main/init/03-docker.sh && chmod +x 03-docker.sh && ./03-docker.sh # 错误处理:任何命令失败时退出 set -euo pipefail # 日志函数 log() { echo "[$(date +'%Y-%m-%d %H:%M:%S')] $*" } log_error() { echo "[$(date +'%Y-%m-%d %H:%M:%S')] ERROR: $*" >&2 } log "========== 开始 Docker 安装 ==========" # 检测操作系统类型 if [ -f "/etc/debian_version" ]; then OS_TYPE="debian" log "检测到 Debian/Ubuntu 系统" elif [ -f "/etc/redhat-release" ]; then OS_TYPE="redhat" log "检测到 RedHat/CentOS 系统" else log_error "不支持的操作系统" exit 1 fi # 安装 Docker if ! command -v docker &> /dev/null; then log "Docker 未安装,开始安装..." # 下载 Docker 安装脚本 log "下载 Docker 官方安装脚本..." DOCKER_SCRIPT="/tmp/get-docker.sh" # 使用重试机制下载 MAX_RETRIES=3 RETRY_COUNT=0 while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do if curl -fsSL https://get.docker.com -o "$DOCKER_SCRIPT"; then log "安装脚本下载成功" break else RETRY_COUNT=$((RETRY_COUNT + 1)) if [ $RETRY_COUNT -lt $MAX_RETRIES ]; then log "下载失败,${RETRY_COUNT}/$MAX_RETRIES,5秒后重试..." sleep 5 else log_error "下载 Docker 安装脚本失败,已重试 $MAX_RETRIES 次" exit 1 fi fi done # 显示脚本内容供审查(可选,生产环境可注释) log "安装脚本 SHA256: $(sha256sum "$DOCKER_SCRIPT" | awk '{print $1}')" # 执行安装 log "执行 Docker 安装..." if sh "$DOCKER_SCRIPT"; then log "Docker 安装成功" rm -f "$DOCKER_SCRIPT" else log_error "Docker 安装失败" rm -f "$DOCKER_SCRIPT" exit 1 fi # 启动 Docker 服务 log "启动 Docker 服务..." systemctl enable docker || log_error "无法启用 Docker 服务" systemctl start docker || log_error "无法启动 Docker 服务" # 配置当前用户到 docker 组(如果不是 root) if [ "$EUID" -ne 0 ] && [ -n "${SUDO_USER:-}" ]; then log "将用户 $SUDO_USER 添加到 docker 组..." usermod -aG docker "$SUDO_USER" || log_error "添加用户到 docker 组失败" log "注意: 用户需要重新登录才能生效" fi else log "Docker 已安装" fi # 显示 Docker 版本 log "Docker 版本信息:" docker --version || log_error "无法获取 Docker 版本" # 安装 Docker Compose COMPOSE_VERSION="v2.24.5" # 指定稳定版本,可根据需要更新 if ! command -v docker-compose &> /dev/null; then log "Docker Compose 未安装,开始安装 (版本: $COMPOSE_VERSION)..." # 检测系统架构 ARCH=$(uname -m) case $ARCH in x86_64) ARCH="x86_64" ;; aarch64|arm64) ARCH="aarch64" ;; armv7l) ARCH="armv7" ;; *) log_error "不支持的架构: $ARCH" exit 1 ;; esac # 下载 Docker Compose COMPOSE_URL="https://github.com/docker/compose/releases/download/${COMPOSE_VERSION}/docker-compose-linux-${ARCH}" COMPOSE_PATH="/usr/local/bin/docker-compose" log "下载 Docker Compose from $COMPOSE_URL..." MAX_RETRIES=3 RETRY_COUNT=0 while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do if curl -L "$COMPOSE_URL" -o "$COMPOSE_PATH"; then log "Docker Compose 下载成功" break else RETRY_COUNT=$((RETRY_COUNT + 1)) if [ $RETRY_COUNT -lt $MAX_RETRIES ]; then log "下载失败,${RETRY_COUNT}/$MAX_RETRIES,5秒后重试..." sleep 5 else log_error "下载 Docker Compose 失败,已重试 $MAX_RETRIES 次" exit 1 fi fi done # 设置执行权限 chmod +x "$COMPOSE_PATH" || log_error "设置 Docker Compose 执行权限失败" # 验证安装 if docker-compose --version &> /dev/null; then log "Docker Compose 安装成功" else log_error "Docker Compose 安装失败" exit 1 fi else log "Docker Compose 已安装" fi # 显示版本信息 log "========== 安装完成 ==========" log "Docker 版本:" docker --version || true log "Docker Compose 版本:" docker-compose --version || true log "=========================================" # 验证 Docker 运行状态 if systemctl is-active --quiet docker; then log "Docker 服务正在运行" else log_error "Docker 服务未运行" exit 1 fi log "========== Docker 安装配置完成 =========="