#!/bin/bash set -e echo "==========================================" echo " 修复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"; } # 检查Docker安装状态 check_docker_installation() { log_info "检查Docker安装状态..." if command -v docker &> /dev/null; then docker --version log_info "✅ Docker CLI 已安装" return 0 else log_error "❌ Docker CLI 未安装" return 1 fi } # 检查服务文件 check_service_files() { log_info "检查Docker服务文件..." local services=( "/lib/systemd/system/docker.service" "/usr/lib/systemd/system/docker.service" "/etc/systemd/system/docker.service" ) for service in "${services[@]}"; do if [ -f "$service" ]; then log_info "找到服务文件: $service" return 0 fi done log_warn "未找到Docker服务文件" return 1 } # 重新安装Docker服务 reinstall_docker_service() { log_info "重新安装Docker服务..." # 彻底清理 log_info "彻底清理Docker..." systemctl stop docker 2>/dev/null || true systemctl stop containerd 2>/dev/null || true # 卸载现有docker apt-get remove -y --purge docker docker-engine docker.io containerd runc docker-ce docker-ce-cli 2>/dev/null || true # 清理文件和目录 rm -rf /var/lib/docker rm -rf /var/lib/containerd rm -rf /etc/docker rm -f /etc/apt/sources.list.d/docker* # 重新安装Docker(使用更稳定的方法) log_info "重新安装Docker..." # 方法1:使用官方脚本但跳过服务设置 curl -fsSL https://get.docker.com -o get-docker.sh chmod +x get-docker.sh # 修改脚本以跳过systemd检查 sed -i 's/systemctl is-active docker/#systemctl is-active docker/g' get-docker.sh sed -i 's/systemctl start docker/#systemctl start docker/g' get-docker.sh sed -i 's/systemctl enable docker/#systemctl enable docker/g' get-docker.sh # 运行修改后的脚本 ./get-docker.sh --version 24.0.5 if [ $? -eq 0 ]; then log_info "✅ Docker组件安装成功" else log_warn "官方脚本安装有问题,尝试手动安装..." manual_install_docker fi } # 手动安装Docker manual_install_docker() { log_info "手动安装Docker..." # 安装依赖 apt-get update apt-get install -y \ apt-transport-https \ ca-certificates \ curl \ gnupg2 \ software-properties-common # 添加Docker官方GPG密钥 curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg # 添加Docker仓库 echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null # 安装Docker apt-get update apt-get install -y \ docker-ce=5:24.0.5-1~debian.12~bookworm \ docker-ce-cli=5:24.0.5-1~debian.12~bookworm \ containerd.io \ docker-buildx-plugin \ docker-compose-plugin } # 创建Docker服务文件 create_docker_service() { log_info "创建Docker服务文件..." # 创建服务目录 mkdir -p /etc/systemd/system # 创建docker.service文件 cat > /etc/systemd/system/docker.service << 'EOF' [Unit] Description=Docker Application Container Engine Documentation=https://docs.docker.com After=network-online.target firewalld.service containerd.service Wants=network-online.target Requires=containerd.service [Service] Type=notify ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock ExecReload=/bin/kill -s HUP $MAINPID TimeoutSec=0 RestartSec=2 Restart=always StartLimitBurst=3 StartLimitInterval=60s LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity TasksMax=infinity Delegate=yes KillMode=process [Install] WantedBy=multi-user.target EOF # 创建containerd服务文件 cat > /etc/systemd/system/containerd.service << 'EOF' [Unit] Description=containerd container runtime Documentation=https://containerd.io After=network.target local-fs.target [Service] ExecStartPre=-/sbin/modprobe overlay ExecStart=/usr/bin/containerd Restart=always RestartSec=5 Delegate=yes KillMode=process OOMScoreAdjust=-999 LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity TasksMax=infinity [Install] WantedBy=multi-user.target EOF log_info "服务文件创建完成" } # 配置和启动服务 setup_and_start_services() { log_info "配置和启动Docker服务..." # 重新加载systemd systemctl daemon-reload # 启用并启动containerd systemctl enable containerd systemctl start containerd # 启用并启动docker systemctl enable docker systemctl start docker # 等待服务启动 sleep 5 # 检查服务状态 if systemctl is-active docker &> /dev/null; then log_info "✅ Docker服务启动成功!" else log_error "❌ Docker服务启动失败" journalctl -u docker --no-pager -n 20 return 1 fi } # 验证安装 verify_installation() { log_info "验证Docker安装..." # 检查docker命令 if command -v docker &> /dev/null; then log_info "✅ Docker CLI: $(docker --version)" else log_error "❌ Docker CLI 不可用" return 1 fi # 检查服务状态 if systemctl is-active docker &> /dev/null; then log_info "✅ Docker服务运行正常" else log_error "❌ Docker服务未运行" return 1 fi # 测试docker info if docker info &> /dev/null; then log_info "✅ Docker守护进程响应正常" else log_warn "⚠️ Docker守护进程无响应" return 1 fi log_info "🎉 Docker安装验证完成!" } # 安装RustDesk服务器 install_rustdesk() { log_info "开始安装RustDesk服务器..." # 创建数据目录 mkdir -p /var/lib/rustdesk-server/{hbbs,hbbr} # 拉取镜像 log_info "拉取RustDesk服务器镜像..." docker pull rustdesk/rustdesk-server:latest # 启动hbbs log_info "启动RustDesk hbbs服务..." docker run -d \ --name hbbs \ --restart unless-stopped \ --network host \ -v /var/lib/rustdesk-server/hbbs:/root \ rustdesk/rustdesk-server:latest hbbs # 启动hbbr log_info "启动RustDesk hbbr服务..." docker run -d \ --name hbbr \ --restart unless-stopped \ --network host \ -v /var/lib/rustdesk-server/hbbr:/root \ rustdesk/rustdesk-server:latest hbbr log_info "✅ RustDesk服务器部署完成!" # 显示部署信息 show_rustdesk_info } # 显示RustDesk信息 show_rustdesk_info() { echo "" log_info "🎉 RustDesk服务器部署完成!" echo "==========================================" echo "服务状态:" echo " docker ps -a # 查看容器状态" echo " systemctl status docker # 查看Docker服务" echo "" echo "重要信息:" echo " 查看密钥: cat /var/lib/rustdesk-server/hbbs/id_ed25519.pub" echo " 服务器IP: $(curl -s ifconfig.me || hostname -I | awk '{print $1}')" echo "" echo "客户端连接时需要:" echo " 1. 上面显示的IP地址" echo " 2. 上面显示的密钥" echo "==========================================" } # 主函数 main() { log_info "开始修复Docker服务未找到问题..." check_docker_installation || { log_error "Docker未正确安装,退出" exit 1 } if check_service_files; then log_info "服务文件存在,尝试启动服务..." setup_and_start_services else log_info "服务文件不存在,重新安装..." reinstall_docker_service create_docker_service setup_and_start_services fi verify_installation && { log_info "✅ Docker修复成功!" echo "" read -p "是否现在安装RustDesk服务器?(y/n): " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then install_rustdesk else log_info "您可以稍后运行此脚本安装RustDesk" fi } || { log_error "❌ Docker修复失败" } } # 执行主函数 main "$@"