#!/bin/bash # # deploy_docker.sh - Docker 一键部署脚本 # 适用系统: Ubuntu 20.04 (Focal) # 功能: 安装 Docker Engine 并配置国内镜像加速器 # set -e # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color 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_warn "未以 root 身份运行,将使用 sudo 提权" SUDO="sudo" else SUDO="" fi } # 步骤1: 清理旧 Docker 仓库配置(避免残余配置干扰) cleanup_old_repo() { log_info "步骤1: 清理旧 Docker 仓库配置..." # 移除所有旧的 docker 源文件 $SUDO rm -f /etc/apt/sources.list.d/docker.list /etc/apt/sources.list.d/docker*.list # 移除旧的 docker gpg 密钥 $SUDO rm -f /usr/share/keyrings/docker-archive-keyring.gpg $SUDO apt-key del "7EA0A9C3F273FCD8" 2>/dev/null || true log_info "旧 Docker 仓库配置已清理" } # 步骤2: 添加 Docker 官方 GPG 密钥(使用阿里云镜像) add_gpg_key() { log_info "步骤2: 添加 Docker GPG 密钥..." curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg -o /tmp/docker.gpg # 安装到 keyrings 目录(供 signed-by 使用) $SUDO mkdir -p /usr/share/keyrings $SUDO gpg --batch --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg /tmp/docker.gpg 2>/dev/null || true # 用 apt-key 添加(传统方式兼容) $SUDO apt-key add /tmp/docker.gpg rm -f /tmp/docker.gpg log_info "GPG 密钥添加完成" } # 步骤3: 添加 Docker APT 源(使用阿里云镜像,带 signed-by 引用) add_docker_repo() { log_info "步骤3: 添加 Docker APT 源..." # 使用 signed-by 添加(指定密钥文件路径,避免 NO_PUBKEY 错误) echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | $SUDO tee /etc/apt/sources.list.d/docker.list > /dev/null log_info "Docker APT 源添加完成" } # 步骤4: 更新 apt 并安装依赖(此时 Docker 源已配置好密钥) install_dependencies() { log_info "步骤4: 更新 apt 包索引并安装依赖..." $SUDO apt update -y $SUDO apt install -y \ apt-transport-https \ ca-certificates \ curl \ gnupg \ lsb-release log_info "依赖安装完成" } # 步骤5: 安装 Docker Engine install_docker() { log_info "步骤5: 安装 Docker Engine(先装核心组件,再试可选组件)..." # 核心组件(必须成功) $SUDO apt install -y docker-ce docker-ce-cli containerd.io || { log_error "Docker 核心组件安装失败!" exit 1 } # 可选组件(失败不影响核心功能) for pkg in docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras; do if $SUDO apt install -y "$pkg" 2>/dev/null; then log_info "✔ $pkg 安装成功" else log_warn "$pkg 安装失败(可选组件,可跳过)" fi done log_info "Docker Engine 安装完成" } # 步骤6: 配置 Docker 镜像加速器 configure_mirrors() { log_info "步骤6: 配置 Docker 镜像加速器..." $SUDO mkdir -p /etc/docker cat > /tmp/daemon.json << 'EOF' { "registry-mirrors": [ "https://docker.m.daocloud.io", "https://dockerproxy.com", "https://docker.nju.edu.cn", "https://docker.mirrors.ustc.edu.cn" ] } EOF $SUDO cp /tmp/daemon.json /etc/docker/daemon.json rm -f /tmp/daemon.json log_info "镜像加速器配置完成" } # 步骤7: 重启 Docker 服务 restart_docker() { log_info "步骤7: 重启 Docker 服务..." $SUDO systemctl restart docker log_info "Docker 服务已重启" } # 步骤8: 验证安装 verify_installation() { log_info "步骤8: 验证安装..." # 检查 Docker 版本 if docker --version &>/dev/null; then log_info "$(docker --version)" else log_error "Docker 未正确安装" exit 1 fi # 检查 Docker 服务状态 if $SUDO systemctl is-active docker &>/dev/null; then log_info "Docker 服务运行正常" else log_error "Docker 服务未运行" exit 1 fi # 检查镜像加速器 if $SUDO docker info 2>/dev/null | grep -q "Registry Mirrors"; then log_info "镜像加速器配置如下:" $SUDO docker info 2>/dev/null | grep -A5 "Registry Mirrors" fi # 运行 hello-world 测试 log_info "运行 hello-world 测试..." if $SUDO docker run --rm hello-world &>/dev/null; then log_info "Docker 安装验证通过!" else log_warn "hello-world 测试未通过,请检查网络连接" fi } # 主函数 main() { echo "==========================================" echo " Docker 一键部署脚本" echo " 适用系统: Ubuntu 20.04" echo "==========================================" echo "" check_root cleanup_old_repo add_gpg_key add_docker_repo install_dependencies install_docker configure_mirrors restart_docker verify_installation echo "" echo "==========================================" echo -e "${GREEN} Docker 部署完成!${NC}" echo "==========================================" echo "" echo "常用命令:" echo " docker ps - 查看运行中的容器" echo " docker images - 查看本地镜像" echo " docker info - 查看 Docker 信息" echo " docker run hello-world - 测试 Docker 安装" echo "" } main "$@"