#!/bin/bash set -e echo "==========================================" echo " Debian专用 Docker 一键安装脚本" 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"; } # 检查磁盘空间 check_disk_space() { log_info "检查磁盘空间..." local available=$(df / | awk 'NR==2 {print $4}') if [ "$available" -lt 1048576 ]; then # 小于1GB log_warn "磁盘空间紧张,正在清理..." apt-get clean rm -rf /var/lib/apt/lists/* rm -rf /tmp/* journalctl --vacuum-size=50M fi } # 安装基础依赖(最小化) install_minimal_deps() { log_info "安装最小化依赖..." apt-get update --allow-unauthenticated || { log_warn "APT更新失败,继续安装..." } apt-get install -y --allow-unauthenticated \ curl \ wget \ gnupg \ ca-certificates \ iptables \ libseccomp2 } # 彻底清理有问题的docker配置 clean_docker_config() { log_info "清理Docker配置..." # 停止docker服务 systemctl stop docker 2>/dev/null || true systemctl stop containerd 2>/dev/null || true # 移除旧配置 rm -f /etc/apt/sources.list.d/docker.list rm -f /etc/apt/sources.list.d/docker.list.save rm -rf /var/lib/docker } # 下载并安装Docker二进制文件(完全离线方式) install_docker_binary() { log_info "下载Docker二进制文件..." # 创建安装目录 INSTALL_DIR="/opt/docker-bin" mkdir -p $INSTALL_DIR cd $INSTALL_DIR # 下载Docker静态二进制文件(从官方release) DOCKER_VERSION="24.0.5" log_info "下载Docker $DOCKER_VERSION 静态二进制文件..." # 下载docker cli if [ ! -f "docker" ]; then wget -O docker https://download.docker.com/linux/static/stable/x86_64/docker-$DOCKER_VERSION.tgz && \ tar xzvf docker-$DOCKER_VERSION.tgz && \ cp docker/docker /usr/local/bin/ && \ chmod +x /usr/local/bin/docker fi # 下载docker-compose if [ ! -f "docker-compose" ]; then DOCKER_COMPOSE_VERSION="2.20.2" wget -O /usr/local/bin/docker-compose "https://github.com/docker/compose/releases/download/v$DOCKER_COMPOSE_VERSION/docker-compose-$(uname -s)-$(uname -m)" && \ chmod +x /usr/local/bin/docker-compose fi } # 使用官方脚本安装(网络方式) install_docker_official() { log_info "使用Docker官方脚本安装..." # 下载并运行官方安装脚本 curl -fsSL https://get.docker.com -o get-docker.sh # 修改脚本以跳过空间检查 sed -i 's/check_space/#check_space/g' get-docker.sh sed -i 's/apt_get_update/#apt_get_update/g' get-docker.sh # 运行修改后的脚本 sh get-docker.sh --version 24.0.5 # 如果官方脚本失败,使用备用方法 if [ $? -ne 0 ]; then log_warn "官方脚本安装失败,使用备用方法..." install_docker_backup fi } # 备用安装方法 install_docker_backup() { log_info "使用备用方法安装Docker..." # 直接下载deb包安装 cd /tmp wget https://download.docker.com/linux/debian/dists/bookworm/pool/stable/amd64/docker-ce_24.0.5-1~debian.12~bookworm_amd64.deb wget https://download.docker.com/linux/debian/dists/bookworm/pool/stable/amd64/docker-ce-cli_24.0.5-1~debian.12~bookworm_amd64.deb wget https://download.docker.com/linux/debian/dists/bookworm/pool/stable/amd64/containerd.io_1.6.21-1_amd64.deb # 安装依赖 apt-get install -y --allow-unauthenticated \ libltdl7 \ pigz \ iptables # 安装docker包 dpkg -i containerd.io_1.6.21-1_amd64.deb dpkg -i docker-ce-cli_24.0.5-1~debian.12~bookworm_amd64.deb dpkg -i docker-ce_24.0.5-1~debian.12~bookworm_amd64.deb } # 配置Docker服务 setup_docker_service() { 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": "50m", "max-file": "3" }, "storage-driver": "overlay2", "data-root": "/var/lib/docker" } EOF # 启动服务 systemctl enable docker systemctl start docker # 等待服务启动 sleep 3 } # 验证安装 verify_installation() { log_info "验证安装..." if command -v docker &> /dev/null; then docker --version log_info "✅ Docker安装成功!" else log_error "❌ Docker安装失败" return 1 fi # 测试docker服务 if systemctl is-active docker &> /dev/null; then log_info "✅ Docker服务运行正常" else log_warn "⚠️ Docker服务未运行,尝试启动..." systemctl start docker fi } # 主函数 main() { log_info "开始Docker安装流程..." check_disk_space clean_docker_config install_minimal_deps install_docker_official setup_docker_service verify_installation log_info "🎉 Docker安装完成!" echo "" echo "使用说明:" echo " docker --version # 查看版本" echo " systemctl status docker # 查看服务状态" echo " usermod -aG docker \$USER # 添加用户到docker组" } # 执行主函数 main "$@"