Files
vps/init/03-docker.sh

168 lines
4.8 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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_RETRIES5秒后重试..."
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_RETRIES5秒后重试..."
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 安装配置完成 =========="