使用 MCSManager 管理 Docker Compose 部署的 MC 服务器

MCSManager 面板、MC 服务器都使用 Docker Compose 部署。

为了在这种情况下仍然能够使用 MCSManager 在线面板管理服务器,需要进行一系列操作,将两者嫁接起来。

1. 部署 MC 服务器

所有服务器文件夹都放在宿主机的同一个目录 mc-servers 目录下

  • 举例:MC 服务器 1 在 mc-servers/Server1,里面有 docker-compose.yml 和服务器的所有数据,比如 mods, configs, world, server.properities, …

  • MC 服务器的 docker-compose.yml 中需要启用容器的 TTY:

    tty: true
    stdin_open: true
  • MC 服务器目录下写 MCSManager 启动脚本 mcsm-run.sh:

    #!/bin/bash
    
    # 当sudo二进制不存在,直接忽略它
    command -v sudo >/dev/null 2>&1 || { sudo() { "$@"; }; }
    
    # 检查第一个服务是否存在,并返回其CID
    get_running_first_service_cid() {
        # 获取第一个服务名
        local service_name=$(sudo docker compose config --services 2>/dev/null | head -n 1)
        if [ -z "$service_name" ]; then return; fi
    
        # 获取CID
        local cid=$(sudo docker compose ps -q "$service_name" 2>/dev/null)
        if [ -z "$cid" ]; then return; fi
    
        # 检查容器运行状态
        local is_running=$(sudo docker inspect -f '{{.State.Running}}' "$cid" 2>/dev/null)
        if [ "$is_running" = "true" ]; then
            echo "$cid"
        fi
    }
    
    
    CID=$(get_running_first_service_cid)
    if [ -n "$CID" ]; then
        # CID不为空
        echo "[MCSM-Compose-Helper] 检测到服务器正在运行中"
    else
        # CID为空
        echo "[MCSM-Compose-Helper] 正在启动 Docker Compose 服务..."
        sudo docker compose up -d
    
        if [ $? -ne 0 ]; then
            echo "[MCSM-Compose-Helper] 错误:Docker Compose 启动失败。"
            exit 1
        fi
    
        sleep 2
        
        CID=$(get_running_first_service_cid)
        if [ -z "$CID" ]; then
            echo "[MCSM-Compose-Helper] 错误:无法获取到任何正在运行的容器 ID。"
            echo "[MCSM-Compose-Helper] 请检查 sudo docker-compose.yml 是否配置正确,或容器是否立即退出了。"
            exit 1
        fi
    fi
    
    echo "[MCSM-Compose-Helper] 正在连接控制台..."
    
    # 看门狗循环:只要容器在运行,就保持 Attach
    while [ "$(sudo docker inspect -f '{{.State.Running}}' "$CID" 2>/dev/null)" = "true" ]; do
        
        # 尝试连接控制台
        sudo docker attach "$CID"
        
        # 如果 attach 断开(例如网络波动),检查容器是否还在运行
        if [ "$(sudo docker inspect -f '{{.State.Running}}' "$CID" 2>/dev/null)" = "true" ]; then
            # echo "[MCSM-Compose-Helper] 控制台连接已断开,容器仍在运行。将在 1 秒后自动重连..."
            sleep 1
        fi
    done
    
    echo "[MCSM-Compose-Helper] 服务器已停止运行。停止其他服务..."
    sudo docker compose down
    echo "[MCSM-Compose-Helper] 所有容器已停止。"
    exit 0

2. 部署 MCSManager

MCSM-Daemon 的 docker-compose 中,设置如下 volumes 映射:

  • /usr/bin/docker:/usr/bin/docker
  • /usr/libexec/docker/cli-plugins:/usr/libexec/docker/cli-plugins
  • /var/run/docker.sock:/var/run/docker.sock

这些映射用于支持在 MCSM-Daemon 容器内管理宿主机的 Docker 服务。

以及最重要的映射:

  • ..../mc-servers:/mc-servers

3. 在 MCSManager 中创建实例

在 MCSManager 中创建普通应用实例

  • 工作目录:/mc-servers/Server1
  • 启动命令:bash mcsm-run.sh
  • 停止命令:stop
  • 确保实例的 “仿真终端” 处于打开状态

点击 开启 按钮,MCSManager 将拉起服务器容器,并附加到其 tty 上。此时可以正常使用仿真终端、发送命令等,文件管理也可以正常使用

点击 关闭 按钮停止服务器容器,除了服务器以外 Compose 中其他的服务也将被一并停止

强制终止按钮不可用,因为只会杀死 bash 进程


使用 MCSManager 管理 Docker Compose 部署的 MC 服务器
https://blog.openyq.top/posts/11373/
作者
yqs112358
许可协议