168 lines
4.8 KiB
Bash
168 lines
4.8 KiB
Bash
#!/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 安装配置完成 =========="
|