docker-minecraft-server 自动扩缩容实战:用 mc-router、Lazymc 与 Lazytainer 实现“无人自动休眠,有人即唤醒”

docker-minecraft-server 自动扩缩容实战:用 mc-router、Lazymc 与 Lazytainer 实现“无人自动休眠,有人即唤醒” docker-minecraft-server 自动扩缩容实战用 mc-router、Lazymc 与 Lazytainer 实现“无人自动休眠有人即唤醒”【免费下载链接】docker-minecraft-serverDocker image that provides a Minecraft Server for Java Edition that automatically installs/upgrades versions, modloaders, modpacks and more at startup项目地址: https://gitcode.com/GitHub_Trending/do/docker-minecraft-server自动扩缩容Autoscaling在 Minecraft 社区也常被称为sleeping休眠、scale to zero缩容到零或wake on join有人加入即唤醒指的是在没人游玩时自动停止 Minecraft 服务器、当有人尝试连接时再自动启动它的模式。这套模式的核心价值在于“服务器空闲时不浪费资源”特别适合 CPU/内存受限的 VPS 或常开的家庭服务器。本文围绕本仓库的 autoscale.md 展开逐一讲解三种主流实现方案——mc-router、Lazymc、Lazytainer 的工作原理、适用场景与完整可复制的 Docker Compose 配置并补充仓库中的示例文件、Kubernetes/Podman 场景下的配套用法。三种方案总览与选型建议方案唤醒机制是否感知 Minecraft 主机名典型误触发风险适用场景mc-routerMinecraft 感知的路由/多路复用器检测到真实玩家连接握手是按玩家连接使用的主机名路由低能区分真实 MC 握手单端口背后多台服务器、需要按主机名路由 自动启停Lazymc经由 lazymc-docker-proxy代理检测到玩家连接否单服务器代理低单台服务器、希望保留 MOTD/查询等代理能力Lazytainer网络流量包阈值 无活动超时否纯流量监控较高可能被端口扫描/ICMP ping 触发不想引入专用 MC 代理、接受流量级判断三种方案有一个共同前提都需要通过 Docker socket/var/run/docker.sock以只读方式挂载获得启动/停止后端容器的能力且都应使用ro挂载以限制权限面。下文逐条展开。方案一mc-router —— Minecraft 感知的路由 自动启停mc-router 是一个Minecraft-aware感知 Minecraft 协议的 router/multiplexer两个核心能力按主机名路由玩家根据玩家连接时使用的 hostname 把连接分发给对应后端容器一台宿主机暴露一个端口即可承载多个服务器自动扩缩容检测到玩家加入时自动启动后端容器scale up空闲超时后再次停止scale down。最小可用配置仓库中 examples/mc-router-autoscale/compose-minimal.yml 提供了最简示例services: router: image: itzg/mc-router environment: IN_DOCKER: true AUTO_SCALE_DOWN: true AUTO_SCALE_UP: true AUTO_SCALE_DOWN_AFTER: 2h AUTO_SCALE_ASLEEP_MOTD: Server is asleep. Join again to wake it up! ports: - 25565:25565 volumes: - /var/run/docker.sock:/var/run/docker.sock:ro vanilla: image: itzg/minecraft-server environment: EULA: TRUE labels: mc-router.host: vanilla.example.com paper: image: itzg/minecraft-server environment: EULA: TRUE TYPE: PAPER labels: mc-router.host: paper.example.com各环境变量的含义源自示例文件注释变量说明IN_DOCKER: true告知 mc-router 自身运行在容器内、通过挂载的 docker.sock 管理容器AUTO_SCALE_UP: true玩家加入时自动启动对应后端全局开关可按后端用 label 覆盖AUTO_SCALE_DOWN: true无人活动超时后自动停止后端全局开关可按后端用 label 覆盖AUTO_SCALE_DOWN_AFTER: 2h空闲多久后缩容默认 10m且这是仅全局生效的设置不能用 per-backend label 覆盖AUTO_SCALE_ASLEEP_MOTD服务器“睡着”时向查询/加入者展示的 MOTD默认为空字符串不展示 MOTD直接显示 offline详细配置per-backend 的 label 覆盖examples/mc-router-autoscale/compose.yml 是带完整注释的“详细版”演示了如何在全局开启自动扩缩容的前提下用容器 label 对单个后端做差异化配置mc-router.host: fabric.example.com声明该后端响应的主机名玩家用这个域名连接时流量就路由到它mc-router.auto-scale-up: false/mc-router.auto-scale-down: false针对单个后端禁用自动启停示例中的 fabric 服务mc-router.auto-scale-asleep-motd: Paper is folded. Join to unfold!覆盖该后端的“休眠 MOTD”。从源码结构看此处指 compose 文件的 label 约定mc-router 的自动扩缩容判定顺序是先读全局环境变量作为默认值再读后端容器 label 做覆盖唯独AUTO_SCALE_DOWN_AFTER属于全局唯一设置。这意味着在多服务器共享一个路由器的场景下空闲超时时间统一控制而“哪些服务器允许自动休眠”可以按后端单独决定——例如让主服保持常开、副服按需唤醒。相关部署形态Kubernetes Kustomize本仓库 kustomize/README.md 给出了配套的 overlay 示例通过给 Service 打注解mc-router.itzg.me/externalServerName: forge.example.com让 K8s 中的 mc-router 感知外部服务器名配合 kustomize/base 的基础资源使用Podman Quadletsexamples/podman-quadlets 演示了用 quadlet 模板mc.container中Labelmc-router.host%p-%i.example.com部署多台可自动扩缩容的服务器并用mc-router.container承载路由器本身。更多说明见 Examples 文档的 mc-router 章节。方案二Lazymclazymc-docker-proxy—— 让服务器“睡到被叫醒”Lazymc 可以让服务器“睡着”直到有玩家连接。在 Docker 环境下通常经由 lazymc-docker-proxy 使用工作模式是玩家连接到代理代理负责启动/停止服务器容器通常要求 Minecraft 容器在自定义user-defined网络上拥有静态 IP这样容器被停止后重新拉起时代理仍能按固定地址找到它。仓库示例 examples/lazymc/docker_compose.yml 完整演示了这一点# Lazymc requires that the minecraft server have a static IP. networks: minecraft-network: driver: bridge ipam: config: - subnet: 172.18.0.0/16 # 自定义子网Docker 默认网桥是 172.17.0.0/16需避开 services: lazymc: image: ghcr.io/joesturge/lazymc-docker-proxy:latest networks: minecraft-network: ipv4_address: 172.18.0.2 # .1 保留给网关IP 从 .2 开始 restart: unless-stopped volumes: - data:/server:ro # 只读挂载服务器目录 - /var/run/docker.sock:/var/run/docker.sock:ro ports: - 25565:25565 # 只暴露代理服务器容器无需对外暴露端口 mc: image: itzg/minecraft-server:java21 networks: minecraft-network: ipv4_address: 172.18.0.3 # 给服务器容器分配静态 IP labels: - lazymc.enabledtrue # 开启 lazymc 管理 - lazymc.groupmc # 让代理找到要管理的容器 - lazymc.server.addressmc:25565 # 指向 Minecraft 服务端点 tty: true stdin_open: true restart: no # 关键只能由 lazymc 容器管理启停 environment: EULA: TRUE volumes: - data:/data volumes: data:配置要点解析静态 IP 是硬性前提示例特意创建了172.18.0.0/16子网文件注释提醒需落在 RFC1918 私网段内且未被其他服务占用。服务器容器停止后Docker 的默认网桥不会记住其分配因此必须用 user-defined network 显式固定ipv4_addressrestart: no是刻意设计注释明确说明该容器应“solely managed by the lazymc container”否则容器被 lazymc 停止后 Docker 的 restart 策略会把它再次拉起来导致休眠形同虚设。这与 mc-router 场景不同——mc-router 通过 label 匹配容器并由自身启停而这里启停动作完全交给代理容器数据一致性代理以只读方式挂载data:/server:ro在服务器休眠期间仍可读取 MOTD、服务器图标等元信息回复客户端查询。更多说明见 Examples 文档的 Lazymc 章节。方案三Lazytainer —— 基于网络流量包阈值的启停Lazytainer 的思路与前两者不同它基于网络流量决定容器启停使用“包阈值 无活动超时”两个参数但不感知 Minecraft 主机名。这意味着它有两个特性需要注意触发条件简单粗暴只要到达指定端口的入站数据包达到阈值就唤醒容器在嘈杂网络环境中可能被端口扫描、ping 等无关流量误触发这一点在 autoscale.md 中已被明确标注。仓库示例 examples/lazytainer/docker_compose.ymlservices: lazytainer: image: ghcr.io/vmorganp/lazytainer:master environment: VERBOSE: false ports: - 25565:25565 volumes: - /var/run/docker.sock:/var/run/docker.sock:ro labels: - lazytainer.group.minecraft.sleepMethodstop # 休眠方式stop而非 pause - lazytainer.group.minecraft.ports25565 # 监听哪个端口的流量 - lazytainer.group.minecraft.minPacketThreshold2 # 收到 2 个入站包即唤醒 - lazytainer.group.minecraft.inactiveTimeout600 # 600s 无活动则休眠注释先给服务器留 bootstrap 时间之后可调低 restart: unless-stopped network_mode: bridge mc: image: itzg/minecraft-server environment: EULA: TRUE TYPE: PAPER MEMORY: 4G volumes: - ./data:/data labels: - lazytainer.groupminecraft # 与上面的 group.minecraft 对应 depends_on: - lazytainer network_mode: service:lazytainer # 关键复用代理的网络命名空间 tty: true stdin_open: true restart: unless-stopped参数与机制要点minPacketThreshold2连续收到 2 个入站数据包才启动容器——阈值设为 1 更容易被扫描触发设为 2 是对“端口扫描只打一个包”场景的简单防护inactiveTimeout600从最后一次活动起 10 分钟内无流量就执行sleepMethod示例选stop完全停掉容器释放内存Lazytainer 也支持pause方式挂起进程network_mode: service:lazytainer从 compose 结构看Minecraft 容器共享 lazytainer 的网络命名空间流量直接经过 Lazytainer 的端口从而让它天然具备“观察该服务器全部进出流量”的能力也意味着服务器容器无需自己暴露端口depends_on保证先有代理、后有服务器避免首次启动时序问题。更多说明见 Examples 文档的 Lazytainer 章节。方案横向对比如何为场景选一个结合三个方案在 autoscale.md 中的定位需要“一个端口、多台服务器、按域名路由”只有 mc-router 提供这一能力且其自动启停与路由一体化是功能最完整的选项只有一台服务器、想要成熟稳定的 MC 代理行为含休眠期间的 MOTD/查询响应Lazymc 方案更“专”但静态 IP restart: no的组合配置要求最高网络配置稍有不慎唤醒后会失联已有流量监控诉求、不想引入 MC 专用代理Lazytainer 最轻量但要接受“按包计数”的粗粒度判定部署在被大量扫描/探测暴露端口如公网 25565的环境中时应调高minPacketThreshold或容忍误唤醒。三种方案的共同运维注意项docker.sock 一律只读挂载三个示例均使用:ro避免代理容器获得完整 Docker daemon 控制权被管理的服务器容器不要依赖 Docker 自身的restart策略自动拉起Lazymc 示例中restart: no是最直接的体现空闲超时参数mc-router 的AUTO_SCALE_DOWN_AFTER默认 10m、Lazytainer 的inactiveTimeout要留出服务器冷启动的时间余量——mc-router 示例取2h、Lazytainer 示例取600s并注释“可后续调低”都是同一考虑。延伸阅读自动扩缩容概念与三种方案的原始说明docs/misc/autoscale/autoscale.md可运行的完整示例examples/mc-router-autoscale/compose.yml、examples/mc-router-autoscale/compose-minimal.yml、examples/lazymc/docker_compose.yml、examples/lazytainer/docker_compose.yml与自动暂停/自动停止容器内守护进程方式的区别autopause 文档 与 autostop 文档 描述的是“按时间/人数策略在容器内部停止”的方案而本文的 autoscaling 关注的是“无人连接即停机、有人连接即唤醒”的按需启停Podman Quadlets 多实例部署examples/podman-quadletsKubernetes 场景kustomize/README.md。【免费下载链接】docker-minecraft-serverDocker image that provides a Minecraft Server for Java Edition that automatically installs/upgrades versions, modloaders, modpacks and more at startup项目地址: https://gitcode.com/GitHub_Trending/do/docker-minecraft-server创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考