Files
install-docker/version/install-docker-v1.1.sh
萧墨笙云 7ec7ba0c04 v1.1
v1.1版本,后续将会修复Bug

Signed-off-by: 萧墨笙云 <xiaomoshengyun@noreply.localhost>
2025-11-02 11:12:51 +08:00

628 lines
19 KiB
Bash
Raw 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
##############################################################################
# 通用Linux Docker一键安装脚本
# 功能支持多种Linux发行版自动适配国内外网络环境安装Docker和Docker Compose
# 版本2.8
# 版权声明:该脚本由 xblog.tech 维护
# 支持系统Ubuntu, Debian, CentOS, RHEL, Fedora, Rocky Linux, AlmaLinux等
# 注意:国内网络环境下将使用第三方脚本,请谨慎选择
##############################################################################
set -e
# 颜色输出定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # 无颜色
# 日志函数
log_info() {
echo -e "${GREEN}[INFO]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}
log_notice() {
echo -e "${BLUE}[NOTICE]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}
log_debug() {
echo -e "${BLUE}[DEBUG]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}
# 检查命令是否存在
command_exists() {
command -v "$1" >/dev/null 2>&1
}
# 获取系统信息
get_os_info() {
if [ -f /etc/os-release ]; then
. /etc/os-release
OS_NAME=$(echo $ID | tr '[:upper:]' '[:lower:]')
OS_VERSION=$(echo $VERSION_ID | tr '[:upper:]' '[:lower:]')
OS_CODENAME=$(echo $VERSION_CODENAME | tr '[:upper:]' '[:lower:]')
if [ -z "$OS_CODENAME" ]; then
OS_CODENAME=$(lsb_release -cs 2>/dev/null || echo "unknown")
fi
else
log_error "无法检测操作系统信息"
exit 1
fi
}
# 获取系统架构
get_architecture() {
ARCH=$(uname -m)
case $ARCH in
x86_64) ARCH="x86_64" ;;
aarch64) ARCH="aarch64" ;;
armv7l) ARCH="armv7" ;;
*)
log_error "不支持的架构: $ARCH"
exit 1
;;
esac
echo $ARCH
}
# 检测网络环境检查与Docker官方的连通性
detect_network_environment() {
log_info "检测网络环境..."
if curl -s --connect-timeout 10 https://get.docker.com/ > /dev/null; then
log_info "国外网络环境检测正常,优先使用官方源安装"
return 0
else
log_warn "国外网络访问不畅,将使用国内镜像源安装"
return 1
fi
}
# 使用官方脚本安装Docker
install_docker_official() {
log_info "开始使用Docker官方脚本安装..."
# 下载并执行官方安装脚本
if curl -fsSL https://get.docker.com -o get-docker.sh; then
sh get-docker.sh
# 清理临时文件
rm -f get-docker.sh
return 0
else
log_error "下载Docker官方安装脚本失败"
return 1
fi
}
# 显示第三方脚本安全提醒
show_third_party_warning() {
echo "================================================================"
log_notice " 安全提醒"
echo "================================================================"
log_warn "您即将使用第三方脚本安装Docker请注意以下事项"
log_warn "1. 第三方脚本的安全性我们无法保证"
log_warn "2. 请确保您信任所使用的第三方脚本"
log_warn "3. 建议在安装前审查脚本内容"
log_warn "4. 生产环境请谨慎使用"
echo ""
log_info "可选的第三方脚本:"
log_info "A. 轩辕镜像脚本 (https://xuanyuan.cloud/docker.sh)"
log_info "B. LinuxMirrors脚本 (https://linuxmirrors.cn/docker.sh)"
echo "================================================================"
}
# 使用第三方脚本安装Docker
install_docker_third_party() {
show_third_party_warning
# 让用户选择安装方式
echo ""
log_info "请选择安装方式:"
echo "1) 使用轩辕镜像脚本安装 (推荐)"
echo "2) 使用LinuxMirrors脚本安装"
echo "3) 退出安装"
read -p "请输入选择 [1-3]: " choice
case $choice in
1)
log_info "您选择了轩辕镜像脚本"
log_warn "请注意:该脚本由第三方维护,安全性请自行评估"
read -p "确认继续?(y/N): " confirm
if [[ $confirm =~ ^[Yy]$ ]]; then
bash <(wget -qO- https://xuanyuan.cloud/docker.sh || curl -sSL https://xuanyuan.cloud/docker.sh)
else
log_info "安装已取消"
exit 0
fi
;;
2)
log_info "您选择了LinuxMirrors脚本"
log_warn "请注意:该脚本由第三方维护,安全性请自行评估"
read -p "确认继续?(y/N): " confirm
if [[ $confirm =~ ^[Yy]$ ]]; then
bash <(curl -sSL https://linuxmirrors.cn/docker.sh || wget -qO- https://linuxmirrors.cn/docker.sh)
else
log_info "安装已取消"
exit 0
fi
;;
3)
log_info "安装已取消"
exit 0
;;
*)
log_error "无效选择,安装已取消"
exit 1
;;
esac
}
# 安装系统依赖
install_dependencies() {
log_info "安装系统依赖包..."
if command_exists apt-get; then
apt-get update || log_warn "apt-get update 失败,但继续执行..."
apt-get install -y curl gnupg lsb-release ca-certificates
elif command_exists yum; then
yum install -y curl gpg dbus-utils device-mapper-persistent-data lvm2
elif command_exists dnf; then
dnf install -y curl gpg dbus-utils device-mapper-persistent-data lvm2
else
log_error "不支持的包管理器"
exit 1
fi
}
# 配置Docker国内镜像源
setup_docker_repo_cn() {
log_info "配置Docker国内镜像源..."
get_os_info
log_info "检测到 ${OS_NAME} ${OS_VERSION} (${OS_CODENAME}) 系统"
if command_exists apt-get; then
# Debian/Ubuntu
mkdir -p /etc/apt/keyrings
# 根据系统类型选择正确的仓库路径
if [ "$OS_NAME" = "debian" ]; then
log_info "配置Debian国内镜像源..."
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/debian/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/debian $OS_CODENAME stable" > /etc/apt/sources.list.d/docker.list
else
log_info "配置Ubuntu国内镜像源..."
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $OS_CODENAME stable" > /etc/apt/sources.list.d/docker.list
fi
apt-get update
elif command_exists yum || command_exists dnf; then
# CentOS/RHEL/Fedora等
log_info "配置CentOS/RHEL国内镜像源..."
if command_exists dnf; then
dnf config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
else
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
fi
else
log_error "不支持的Linux发行版"
exit 1
fi
}
# 安装Docker包
install_docker_packages() {
log_info "安装Docker引擎..."
if command_exists apt-get; then
# 对于较新的Debian/Ubuntu版本可能需要安装containerd.io的特定版本
if ! apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin; then
log_warn "标准安装失败,尝试替代安装方案..."
apt-get install -y docker.io
fi
elif command_exists yum; then
yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
elif command_exists dnf; then
dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
fi
}
# 配置国内镜像加速器
setup_docker_mirror_cn() {
log_info "配置国内镜像加速器..."
mkdir -p /etc/docker
# 测试可用的镜像加速器
local mirrors=(
"https://docker.xuanyuan.me"
"https://docker.1ms.run"
"https://mirror.ccs.tencentyun.com"
"https://docker.mirrors.ustc.edu.cn"
"https://hub-mirror.c.163.com"
)
# 选择前3个可用的镜像
local available_mirrors=()
for mirror in "${mirrors[@]}"; do
if curl -s --connect-timeout 3 "$mirror" > /dev/null; then
available_mirrors+=("$mirror")
log_info "镜像加速器可用: $mirror"
if [ ${#available_mirrors[@]} -ge 3 ]; then
break
fi
fi
done
if [ ${#available_mirrors[@]} -eq 0 ]; then
log_warn "未找到可用的镜像加速器,使用默认配置"
available_mirrors=(
"https://docker.xuanyuan.me"
"https://docker.1ms.run"
"https://mirror.ccs.tencentyun.com"
)
fi
# 构建daemon.json
local daemon_config="{
\"registry-mirrors\": ["
for i in "${!available_mirrors[@]}"; do
daemon_config+="\n \"${available_mirrors[$i]}\""
if [ $i -lt $((${#available_mirrors[@]} - 1)) ]; then
daemon_config+=","
fi
done
daemon_config+="\n ]\n}"
echo -e "$daemon_config" > /etc/docker/daemon.json
log_info "已配置 ${#available_mirrors[@]} 个镜像加速器"
}
# 启动Docker服务
start_docker_service() {
log_info "启动Docker服务..."
systemctl enable docker
if ! systemctl start docker; then
log_error "Docker服务启动失败"
systemctl status docker
return 1
fi
# 等待服务完全启动
sleep 5
# 验证Docker服务状态
if systemctl is-active --quiet docker; then
log_info "Docker服务启动成功"
return 0
else
log_error "Docker服务启动失败"
systemctl status docker
return 1
fi
}
# 安装Docker Compose
install_docker_compose() {
log_info "开始安装Docker Compose..."
# 检查是否已经安装了Docker Compose Plugin
if docker compose version &>/dev/null; then
log_info "Docker Compose Plugin 已安装"
docker compose version
return 0
fi
# 检查是否已经安装了独立版本的Docker Compose
if command_exists docker-compose; then
log_info "Docker Compose 已安装"
docker-compose --version
return 0
fi
# 获取系统架构
local ARCH=$(get_architecture)
# 定义Docker Compose版本
local COMPOSE_VERSION="2.24.0"
# 下载Docker Compose二进制文件
log_info "下载Docker Compose v${COMPOSE_VERSION}..."
# 尝试使用国内镜像下载
local download_url=""
if detect_network_environment; then
# 国外网络 - 使用官方源
download_url="https://github.com/docker/compose/releases/download/v${COMPOSE_VERSION}/docker-compose-linux-${ARCH}"
else
# 国内网络 - 使用镜像源
download_url="https://ghproxy.com/https://github.com/docker/compose/releases/download/v${COMPOSE_VERSION}/docker-compose-linux-${ARCH}"
fi
# 下载Docker Compose
if curl -L "$download_url" -o /usr/local/bin/docker-compose; then
chmod +x /usr/local/bin/docker-compose
# 创建符号链接以便使用 docker compose 命令
ln -sf /usr/local/bin/docker-compose /usr/local/bin/docker-compose
# 验证安装
if docker-compose --version; then
log_info "Docker Compose 安装成功"
return 0
else
log_error "Docker Compose 安装验证失败"
return 1
fi
else
log_error "下载Docker Compose失败"
# 尝试备用安装方法 - 使用pip安装
log_info "尝试使用pip安装Docker Compose..."
if command_exists pip3; then
if pip3 install docker-compose; then
log_info "Docker Compose 通过pip安装成功"
return 0
fi
elif command_exists pip; then
if pip install docker-compose; then
log_info "Docker Compose 通过pip安装成功"
return 0
fi
fi
log_error "所有Docker Compose安装方法都失败了"
return 1
fi
}
# 验证安装
verify_installation() {
log_info "验证Docker安装..."
if command_exists docker; then
docker --version
log_info "Docker安装成功"
# 验证Docker Compose
if docker compose version &>/dev/null; then
log_info "Docker Compose Plugin 已安装:"
docker compose version
elif command_exists docker-compose; then
log_info "Docker Compose 已安装:"
docker-compose --version
else
log_warn "Docker Compose 未安装"
fi
return 0
else
log_error "Docker安装失败"
return 1
fi
}
# 显示安装完成信息
show_completion_info() {
echo ""
log_info "================================================================"
log_info " Docker安装完成"
log_info "================================================================"
log_info "常用命令:"
log_info " 检查Docker版本: docker --version"
log_info " 检查Docker Compose版本: docker-compose --version 或 docker compose version"
log_info " 检查状态: systemctl status docker"
log_info " 启动服务: systemctl start docker"
log_info " 停止服务: systemctl stop docker"
log_info ""
log_info "使用提示:"
log_info " 1. 使用 'docker ps' 查看运行中的容器"
log_info " 2. 使用 'docker-compose up' 运行docker-compose项目"
log_info " 3. 查看日志: journalctl -u docker.service"
log_info "================================================================"
}
# 直接使用国内镜像源安装(无需用户交互)
install_docker_direct_cn() {
log_info "使用国内镜像源直接安装Docker..."
# 安装依赖
if ! install_dependencies; then
log_error "安装依赖包失败"
return 1
fi
# 配置Docker仓库
if ! setup_docker_repo_cn; then
log_error "配置Docker仓库失败"
return 1
fi
# 安装Docker
if ! install_docker_packages; then
log_error "安装Docker包失败"
return 1
fi
# 配置镜像加速器
setup_docker_mirror_cn
# 启动服务
if ! start_docker_service; then
log_error "启动Docker服务失败"
return 1
fi
return 0
}
# 使用备用方案安装Docker当主要方法失败时
install_docker_fallback() {
log_info "尝试使用备用方案安装Docker..."
get_os_info
if command_exists apt-get; then
# 对于Debian/Ubuntu尝试使用系统自带的docker.io包
log_info "使用系统自带的docker.io包安装..."
apt-get update
if apt-get install -y docker.io; then
log_info "docker.io安装成功"
return 0
else
log_error "备用安装方案也失败了"
return 1
fi
else
log_error "没有可用的备用安装方案"
return 1
fi
}
# 询问是否安装Docker Compose
ask_install_compose() {
echo ""
log_info "是否安装Docker Compose"
echo "1) 是安装Docker Compose"
echo "2) 否,跳过安装"
read -p "请输入选择 [1-2] (默认1): " compose_choice
case ${compose_choice:-1} in
1)
if install_docker_compose; then
log_info "Docker Compose安装完成"
else
log_warn "Docker Compose安装失败但Docker已成功安装"
fi
;;
2)
log_info "跳过Docker Compose安装"
;;
*)
log_error "无效选择跳过Docker Compose安装"
;;
esac
}
# 自动重试安装(国外失败时切换到国内)
install_docker_with_retry() {
local network_ok=$1
if [ $network_ok -eq 0 ]; then
# 国外网络 - 先尝试官方脚本
log_info "优先使用国外官方脚本安装..."
if install_docker_official; then
return 0
else
log_warn "国外官方脚本安装失败,自动切换到国内镜像源安装..."
# 国外安装失败,切换到国内安装
if install_docker_direct_cn; then
return 0
else
log_warn "国内镜像源安装失败,尝试备用方案..."
if install_docker_fallback; then
return 0
else
return 1
fi
fi
fi
else
# 国内网络 - 直接使用国内镜像源
log_info "使用国内镜像源安装..."
if install_docker_direct_cn; then
return 0
else
log_warn "国内镜像源安装失败,尝试备用方案..."
if install_docker_fallback; then
return 0
else
return 1
fi
fi
fi
}
# 国内网络环境下的自动安装(无需用户交互)
install_docker_auto_cn() {
log_info "检测到国内网络环境,开始自动安装..."
# 直接使用国内镜像源安装
if install_docker_direct_cn; then
return 0
else
log_warn "国内镜像源安装失败,尝试备用方案..."
if install_docker_fallback; then
return 0
else
return 1
fi
fi
}
# 主函数
main() {
log_info "开始安装Docker..."
log_info "版权声明:该脚本由 xblog.tech 维护"
# 检查root权限
if [ "$(id -u)" -ne 0 ]; then
log_error "请使用root权限运行此脚本"
log_error "示例: sudo $0"
exit 1
fi
# 获取系统信息
get_os_info
log_info "操作系统: ${OS_NAME} ${OS_VERSION} (${OS_CODENAME})"
# 检测网络环境
detect_network_environment
local network_ok=$?
if [ $network_ok -eq 0 ]; then
# 国外网络 - 使用自动重试安装
log_info "使用国外网络安装模式(失败时自动切换到国内源)"
if install_docker_with_retry $network_ok; then
ask_install_compose
verify_installation
show_completion_info
else
log_error "所有安装方法都失败了"
exit 1
fi
else
# 国内网络 - 自动安装,无需用户选择
log_info "使用国内网络安装模式(自动安装)"
if install_docker_auto_cn; then
ask_install_compose
verify_installation
show_completion_info
else
log_error "所有安装方法都失败了"
exit 1
fi
fi
}
# 执行主函数
main "$@"