#!/bin/bash set -e echo "==========================================" echo " Docker 24.0.5 一键离线安装脚本" echo "==========================================" # 颜色定义 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权限 check_root() { if [[ $EUID -ne 0 ]]; then log_error "请使用root权限运行此脚本" exit 1 fi } # 安装依赖 install_dependencies() { log_info "安装系统依赖..." apt-get update apt-get install -y \ curl \ wget \ gnupg \ lsb-release \ apt-transport-https \ ca-certificates \ software-properties-common \ iptables \ net-tools } # 清理有问题的docker源 clean_docker_sources() { log_info "清理有问题的Docker源..." if [ -f "/etc/apt/sources.list.d/docker.list" ]; then mv /etc/apt/sources.list.d/docker.list /etc/apt/sources.list.d/docker.list.backup.$(date +%Y%m%d%H%M%S) log_info "已备份并清理原有docker源配置" fi } # 下载Docker 24.0.5离线包 download_docker_packages() { log_info "创建临时下载目录..." DOWNLOAD_DIR="/tmp/docker-offline-24.0.5" mkdir -p $DOWNLOAD_DIR cd $DOWNLOAD_DIR log_info "开始下载Docker 24.0.5离线安装包..." # Docker 24.0.5 组件包 packages=( "containerd.io_1.6.21-1_amd64.deb" "docker-ce_24.0.5-1~ubuntu.20.04~focal_amd64.deb" "docker-ce-cli_24.0.5-1~ubuntu.20.04~focal_amd64.deb" "docker-buildx-plugin_0.11.2-1~ubuntu.20.04~focal_amd64.deb" "docker-compose-plugin_2.20.2-1~ubuntu.20.04~focal_amd64.deb" ) # 下载URL基础路径(这里使用官方源,您可以根据需要替换为内网源) BASE_URL="https://download.docker.com/linux/ubuntu/dists/focal/pool/stable/amd64" for package in "${packages[@]}"; do if [ ! -f "$package" ]; then log_info "下载: $package" wget -q "$BASE_URL/$package" if [ $? -ne 0 ]; then log_error "下载失败: $package" log_info "尝试备用下载源..." # 备用下载源 wget -q "https://mirrors.aliyun.com/docker-ce/linux/ubuntu/dists/focal/pool/stable/amd64/$package" || { log_error "备用源也下载失败: $package" return 1 } fi else log_info "文件已存在: $package" fi done log_info "所有Docker组件下载完成!" } # 安装Docker组件 install_docker_packages() { log_info "开始安装Docker组件..." DOWNLOAD_DIR="/tmp/docker-offline-24.0.5" cd $DOWNLOAD_DIR # 安装顺序很重要 dpkg -i containerd.io_1.6.21-1_amd64.deb dpkg -i docker-ce-cli_24.0.5-1~ubuntu.20.04~focal_amd64.deb dpkg -i docker-ce_24.0.5-1~ubuntu.20.04~focal_amd64.deb dpkg -i docker-buildx-plugin_0.11.2-1~ubuntu.20.04~focal_amd64.deb dpkg -i docker-compose-plugin_2.20.2-1~ubuntu.20.04~focal_amd64.deb log_info "Docker组件安装完成!" } # 配置Docker服务 configure_docker() { log_info "配置Docker服务..." # 创建docker用户组 groupadd docker 2>/dev/null || true # 配置docker daemon mkdir -p /etc/docker cat > /etc/docker/daemon.json << EOF { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2", "registry-mirrors": [ "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com" ] } EOF # 启动并启用docker服务 systemctl daemon-reload systemctl enable docker systemctl start docker log_info "等待Docker服务启动..." sleep 5 } # 验证安装 verify_installation() { log_info "验证Docker安装..." # 检查docker版本 docker --version docker-compose --version # 测试运行容器 if systemctl is-active --quiet docker; then log_info "测试运行hello-world容器..." docker run --rm hello-world && { log_info "✅ Docker安装验证成功!" } || { log_warn "Docker服务运行但hello-world测试失败,可能是网络问题" } else log_error "Docker服务未运行" return 1 fi } # 显示使用说明 show_usage() { log_info "安装完成!使用说明:" echo "" echo "1. 启动Docker服务: systemctl start docker" echo "2. 停止Docker服务: systemctl stop docker" echo "3. 查看Docker状态: systemctl status docker" echo "4. 添加用户到docker组: usermod -aG docker \$USER" echo "5. 重新登录后即可不使用sudo运行docker命令" echo "" echo "Docker版本: 24.0.5" echo "Compose版本: 2.20.2" echo "Buildx版本: 0.11.2" } # 主函数 main() { log_info "开始Docker 24.0.5一键安装..." check_root install_dependencies clean_docker_sources download_docker_packages install_docker_packages configure_docker verify_installation show_usage log_info "Docker 24.0.5 安装完成!" } # 错误处理 trap 'log_error "脚本执行失败,退出码: $?"; exit 1' ERR # 执行主函数 main "$@"