#!/bin/bash # Debian 12 Docker 安装脚本 (使用国内源) # 从国内镜像源安装 Docker CE 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 "${BLUE}[INFO]${NC} $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 检查系统要求 check_system() { log_info "检查系统要求..." # 检查是否为 Debian 系统 if ! command -v lsb_release &> /dev/null; then apt update && apt install -y lsb-release fi local distro=$(lsb_release -si) local version=$(lsb_release -sr) if [[ "$distro" != "Debian" ]]; then log_error "此脚本仅支持 Debian 系统" exit 1 fi if [[ "${version%%.*}" -lt 10 ]]; then log_error "此脚本需要 Debian 10 或更高版本" exit 1 fi # 检查架构 local arch=$(dpkg --print-architecture) if [[ "$arch" != "amd64" && "$arch" != "arm64" ]]; then log_error "不支持的架构: $arch" exit 1 fi log_success "系统检查通过: $distro $version ($arch)" } # 卸载旧版本 uninstall_old_versions() { log_info "卸载可能存在的旧版本 Docker..." # 停止所有运行中的容器 if command -v docker &> /dev/null; then docker stop $(docker ps -aq) 2>/dev/null || true fi # 卸载旧版本 apt remove -y docker docker-engine docker.io containerd runc docker-compose 2>/dev/null || true # 清理相关文件 rm -rf /var/lib/docker /etc/docker rm -f /etc/apt/sources.list.d/docker.list rm -f /etc/apt/keyrings/docker.gpg log_success "旧版本清理完成" } # 安装依赖包 install_dependencies() { log_info "安装依赖包..." apt update apt install -y \ ca-certificates \ curl \ gnupg \ lsb-release \ apt-transport-https \ software-properties-common log_success "依赖包安装完成" } # 添加 Docker 仓库 add_docker_repository() { log_info "添加 Docker 仓库 (使用清华大学镜像源)..." # 创建密钥目录 mkdir -p /etc/apt/keyrings # 下载并添加 GPG 密钥 curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/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.tuna.tsinghua.edu.cn/docker-ce/linux/debian $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null log_success "Docker 仓库添加完成" } # 安装 Docker install_docker() { log_info "安装 Docker CE..." # 更新包索引 apt update # 安装 Docker CE apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin log_success "Docker CE 安装完成" } # 配置 Docker configure_docker() { log_info "配置 Docker..." # 创建配置目录 mkdir -p /etc/docker # 配置 daemon.json cat > /etc/docker/daemon.json << 'EOF' { "registry-mirrors": [ "https://docker-proxy.syy.1msoft.cn", "https://registry.docker-cn.com", "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com", "https://mirror.baidubce.com" ], "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "3" }, "storage-driver": "overlay2", "exec-opts": ["native.cgroupdriver=systemd"], "iptables": false } EOF # 配置 containerd mkdir -p /etc/containerd containerd config default | tee /etc/containerd/config.toml > /dev/null # 重新加载配置 systemctl daemon-reload log_success "Docker 配置完成" } # 启动服务 start_services() { log_info "启动 Docker 服务..." # 启动服务 systemctl enable docker systemctl enable containerd systemctl start docker systemctl start containerd # 等待服务启动 sleep 2 # 检查服务状态 if systemctl is-active --quiet docker; then log_success "Docker 服务启动成功" else log_error "Docker 服务启动失败" journalctl -u docker --no-pager -n 20 exit 1 fi } # 配置用户权限 configure_user_permissions() { log_info "配置用户权限..." # 获取当前用户 local current_user="" if [[ -n "$SUDO_USER" ]]; then current_user="$SUDO_USER" elif [[ -n "$USER" && "$USER" != "root" ]]; then current_user="$USER" fi if [[ -n "$current_user" ]]; then # 检查用户是否存在 if id "$current_user" &>/dev/null; then usermod -aG docker "$current_user" log_success "已将用户 $current_user 添加到 docker 组" log_warning "请重新登录或运行 'newgrp docker' 以使权限生效" fi fi } # 测试安装 test_installation() { log_info "测试 Docker 安装..." # 检查版本 local docker_version=$(docker --version) local docker_compose_version=$(docker compose version 2>/dev/null || echo "docker-compose plugin") log_success "Docker 版本: $docker_version" log_info "Docker Compose: $docker_compose_version" # 运行测试容器 log_info "运行测试容器..." if docker run --rm hello-world >/dev/null 2>&1; then log_success "Docker 测试通过!" else log_warning "Docker 运行测试失败,但安装可能成功。请检查网络连接。" fi # 显示使用信息 cat << 'EOF' Docker 安装完成! 常用命令: docker --version # 查看版本 docker run hello-world # 运行测试容器 docker ps -a # 查看所有容器 docker images # 查看镜像 docker pull # 拉取镜像 docker build -t . # 构建镜像 服务管理: sudo systemctl start docker # 启动服务 sudo systemctl stop docker # 停止服务 sudo systemctl restart docker # 重启服务 配置说明: - 已配置国内镜像加速器 - 日志轮转已配置 (最大100M,保留3个文件) - 使用 overlay2 存储驱动 - 已启用 systemd cgroup 驱动 EOF } # 显示帮助信息 show_help() { cat << EOF Debian 12 Docker 安装脚本 此脚本将从清华大学镜像源安装 Docker CE,并配置国内镜像加速器。 用法: $0 [选项] 选项: -h, --help 显示此帮助信息 -f, --force 强制重新安装(不检查现有安装) 示例: $0 # 正常安装 $0 --force # 强制重新安装 EOF } # 主函数 main() { local force_install=false # 解析参数 while [[ $# -gt 0 ]]; do case $1 in -h|--help) show_help exit 0 ;; -f|--force) force_install=true shift ;; *) log_error "未知选项: $1" show_help exit 1 ;; esac done # 检查是否为 root 用户 if [[ $EUID -ne 0 ]]; then log_error "请使用 root 用户或 sudo 运行此脚本" exit 1 fi # 检查是否已安装 if command -v docker &> /dev/null && [[ "$force_install" != true ]]; then log_warning "Docker 已经安装。如需重新安装,请使用 --force 选项。" docker --version exit 0 fi log_info "开始安装 Docker CE..." echo check_system uninstall_old_versions install_dependencies add_docker_repository install_docker configure_docker start_services configure_user_permissions test_installation echo log_success "Docker 安装完成!" } # 执行主函数 main "$@"