Files
dock/Docker 24.0.5
2025-10-28 22:49:01 +08:00

335 lines
8.7 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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 "$@"