#!/bin/bash
# 手动版Docker启动脚本（与系统服务版隔离）
# 二进制路径: /home/i8520/DOCKE_DATA
# 数据目录: /home/i8520/DOCKE_DATA/images
# 配置文件: /home/i8520/DOCKE_DATA/json/daemon.json
# 专用套接字: /home/i8520/DOCKE_DATA/docker.sock（避免冲突）

# 定义隔离参数（核心：与系统版完全不同的路径）
DOCKER_BIN_DIR="/home/i8520/DOCKE_DATA"
DATA_ROOT="/home/i8520/DOCKE_DATA/images"
CONFIG_FILE="/home/i8520/DOCKE_DATA/json/daemon.json"
DOCKER_SOCK="/home/i8520/DOCKE_DATA/docker.sock"  # 独立套接字
LOG_FILE="$DOCKER_BIN_DIR/docker_manual.log"
DOCKER_DAEMON="$DOCKER_BIN_DIR/dockerd"
DOCKER_CLIENT="$DOCKER_BIN_DIR/docker"  # 手动版客户端
PID_FILE="$DOCKER_BIN_DIR/docker.pid"  # 自定义PID文件路径
PID_FILE_LOG="$DOCKER_BIN_DIR/PID_FILE_LOG.log"
BRIDGE_NAME="docker0_manual"  # 网桥名称
BRIDGE_IP="172.88.0.1/16"     # 网桥IP及子网（与容器IP池匹配）


#创建网桥
create_bridge() {
    BRIDGE="docker0_manual"
    # 若网桥不存在则创建
    if ! ip link show "$BRIDGE" >/dev/null 2>&1; then
        echo "创建自定义网桥: $BRIDGE"
        ip link add name "$BRIDGE" type bridge
        ip link set "$BRIDGE" up
        # 可选：配置网桥IP（若需要）
        ip addr add 172.88.0.1/16 dev "$BRIDGE"
    fi
}

create_bridge



# 检查二进制文件
check_bin() {
    if [ ! -f "$DOCKER_DAEMON" ] || [ ! -f "$DOCKER_CLIENT" ]; then
        echo "错误：未找到Docker二进制文件（dockerd或docker）"
        exit 1
    fi
}

# 检查配置文件，若不存在则创建基础配置
check_config() {
    if [ ! -f "$CONFIG_FILE" ]; then
        echo "警告：未找到配置文件，创建默认隔离配置..."
        mkdir -p "$(dirname $CONFIG_FILE)"
        cat > "$CONFIG_FILE" <<EOF
{
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
  "bridge": "docker0_manual",
  "default-address-pools": [{"base": "$BRIDGE_IP", "size": 24}],
  "iptables": true
}
EOF
    fi
}

# 启动手动版Docker
start() {
    # 新增：检查并清理无效的PID文件
    PID_FILE="/home/i8520/DOCKE_DATA/docker.pid"  # 确保路径与实际一致
    if [ -f "$PID_FILE" ]; then
        PID=$(cat "$PID_FILE")
        # 检查PID对应的进程是否存在
        if ps -p "$PID" >/dev/null; then
            echo "发现残留进程（PID $PID），尝试终止..."
            sudo kill -9 "$PID"
            sleep 2  # 等待进程终止
        fi
        # 无论进程是否存在，都删除PID文件
        echo "清理残留PID文件：$PID_FILE"
        sudo rm -f "$PID_FILE"
    fi
    # 检查是否已运行
    if pgrep -f "$DOCKER_DAEMON.*$DOCKER_SOCK" >/dev/null; then
        echo "手动版Docker已运行（套接字：$DOCKER_SOCK）"
        return 0
    fi

    # 准备目录
    mkdir -p "$DATA_ROOT"
    check_bin
    check_config

    # 启动命令（带隔离参数）
    echo "启动手动版Docker..."
    sudo nohup "$DOCKER_DAEMON" \
        --config-file "$CONFIG_FILE" \
        --data-root "$DATA_ROOT" \
        --pidfile "$PID_FILE" \
        --host "unix://$DOCKER_SOCK" > "$LOG_FILE" 2>&1 & \
        # 强制进程脱离终端，避免被systemd终止
    disown -h $!
    # 记录进程ID（可选，便于后续管理）
    echo $! > "$PID_FILE.bug"
    # 等待启动
    sleep 3
    if pgrep -f "$DOCKER_DAEMON.*$DOCKER_SOCK" >/dev/null; then
        
        reset
        echo "OK"
        echo -e "\n启动成功！客户端连接命令：\nexport DOCKER_HOST=unix://$DOCKER_SOCK\nsudo $DOCKER_CLIENT info"
    else
        echo "启动失败，查看日志：$LOG_FILE"
        exit 1
    fi
}

# 停止手动版Docker
stop() {
    if ! pgrep -f "$DOCKER_DAEMON.*$DOCKER_SOCK" >/dev/null; then
        echo "手动版Docker未运行"
        return 0
    fi

    echo "停止手动版Docker..."
    sudo pkill -f "$DOCKER_DAEMON.*$DOCKER_SOCK"
    sleep 2
    if ! pgrep -f "$DOCKER_DAEMON.*$DOCKER_SOCK" >/dev/null; then
        echo "已停止"
    else
        sudo pkill -9 -f "$DOCKER_DAEMON.*$DOCKER_SOCK"
        echo "已强制停止"
    fi
}

# 查看状态
status() {
    if pgrep -f "$DOCKER_DAEMON.*$DOCKER_SOCK" >/dev/null; then
        echo "手动版Docker运行中（PID: $(pgrep -f "$DOCKER_DAEMON.*$DOCKER_SOCK")）"
        echo "套接字路径：$DOCKER_SOCK"
    else
        echo "手动版Docker未运行"
    fi
}

# 帮助信息
usage() {
    echo "用法：$0 [start|stop|status|restart]"
    echo "  start   - 启动手动版Docker（隔离模式）"
    echo "  stop    - 停止手动版Docker"
    echo "  status  - 查看手动版Docker状态"
    echo "  restart - 重启手动版Docker"
    exit 1
}

# 主逻辑
case "$1" in
    start) start ;;
    stop) stop ;;
    status) status ;;
    restart) stop && start ;;
    *) usage ;;
esac

