用 Docker 部署 Minecraft 服务器:原版 / Paper / Spigot / Forge / Fabric / BungeeCord 全面实战
这篇是给未来自己和喜欢折腾的服主看的:从零开始,用 Docker 把 Minecraft 服务器(原版 / Paper / Spigot / Forge / Fabric / BungeeCord)一网打尽,顺带把 Java 版本、内存、端口、备份和常见坑都说清楚,之后再开新服直接照着抄。
一、整体思路:用 Docker 管理所有 Minecraft 服务端
传统部署 Minecraft 服务端通常是:
- 直接在系统里装 JDK;
- 下载
server.jar(原版或 Paper 等); - 自己写脚本启动。
问题是:
- 环境难以迁移:换一台机器要重配一遍 Java/脚本;
- 多服管理麻烦:开多个不同版本 / 不同核心容易乱;
- 升级/回滚不方便。
Docker 化之后的好处:
- Java 环境、启动脚本都在镜像里,宿主机只要有 Docker 就能跑;
- 数据分离在挂载卷中,迁移就是复制一份目录;
docker-compose一键启动/停止多个服(生存 / 创造 / 练级 / Mod 服 / Bungee 网关)。
本文会围绕一个非常好用的镜像:
itzg/minecraft-server:支持 Vanilla / Paper / Spigot / Forge / Fabric / Quilt / Sponge 等 多种类型;itzg/bungeecord:可用来搭建 BungeeCord / Waterfall 等代理。
二、准备工作:硬件 / 端口 / 目录 / Java 认知
1. 基本硬件建议
根据经验(仅供参考,具体还和玩家数量 / 插件 / 模组复杂度有关):
- 纯原版小服(2–5 人):
- CPU:2 核
- 内存:4G(分配给 MC 2G 左右)
- 磁盘:20G+
- Paper/Spigot 生电 / 生存 10–20 人:
- CPU:4 核以上
- 内存:8G 以上(MC 分配 4–6G)
- SSD 磁盘更香
- Forge / Fabric 大型模组服:
- CPU:4–8 核
- 内存:8–16G(根据模组数量增加)
2. 端口规划
默认情况下:
- 游戏端口:
25565/TCP(主世界服); - 如果做 BungeeCord:
- Bungee 代理端口:
25565; - 后端各子服各用一个端口,例如:
- 生存服:
25566 - 创造服:
25567 - Mod 服:
25568
- 生存服:
- Bungee 代理端口:
所有端口需要在:
- 云服务器安全组 / 防火墙中放行;
- 家宽环境下在路由器做端口转发。
3. 数据目录规划
统一放在宿主机一个目录如:
mkdir -p ~/docker-data/minecraftcd ~/docker-data/minecraft计划如下:
~/docker-data/minecraft/vanilla:原版核心存档与配置;~/docker-data/minecraft/paper:Paper 服;~/docker-data/minecraft/spigot:Spigot 服;~/docker-data/minecraft/forge:Forge 模组服;~/docker-data/minecraft/fabric:Fabric 模组服;~/docker-data/minecraft/bungee:BungeeCord 代理;
4. Java 版本与内存配置
使用 itzg/minecraft-server 的好处是:
- 镜像内已经包含适配好的 Java;
- 可以通过环境变量控制内存分配。
常用环境变量:
MEMORY:如4G,控制-Xmx最大堆大小;- 也可以通过
JVM_OPTS自己指定高级 GC 配置等(如 G1GC、ZGC)。
不同 MC 版本对 Java 版本要求概略:
- 1.16 以下:Java 8;
- 1.17–1.18:Java 16/17;
- 1.19+:推荐 Java 17。
itzg/minecraft-server 默认会根据版本自动选择合适的 Java,通常无需自己操心。
三、基础镜像与最小原版服示例
首先拉取通用服务端镜像:
docker pull itzg/minecraft-server:latest生产环境建议固定版本,如:
itzg/minecraft-server:java17或指定日期/版本标签。
1. 最小原版生存服(docker run 方式)
先在宿主机创建数据目录:
mkdir -p ~/docker-data/minecraft/vanilla运行:
docker run -d \ --name mc-vanilla \ -e EULA=TRUE \ -e VERSION=1.20.4 \ -e MEMORY=4G \ -p 25565:25565 \ -v ~/docker-data/minecraft/vanilla:/data \ itzg/minecraft-server:latest参数说明:
EULA=TRUE:必须 同意 Mojang EULA,否则服务端不会启动;VERSION=1.20.4:指定 MC 版本;MEMORY=4G:给 JVM 分配 4G 内存;-p 25565:25565:暴露游戏端口;-v ~/docker-data/minecraft/vanilla:/data:- 容器内
/data是服务端所有文件(世界存档 /server.properties/ops.json等)的目录; - 挂到宿主机做持久化。
- 容器内
查看日志:
docker logs -f mc-vanilla看到类似 Done (xx.xx s)! For help, type "help" 就说明服已正常启动。
以后只要不删除 ~/docker-data/minecraft/vanilla,换机器只需:
- 装 Docker;
- 拷贝这个目录;
- 再跑一遍
docker run或docker-compose;
服务器就 “原封不动” 地迁移过去了。
四、用 docker-compose 管理原版核心
推荐用 docker-compose 管理所有 MC 服。
在 ~/docker-data/minecraft 下新建 docker-compose.yml(先从一个原版服开始):
version: "3.9"
services: mc-vanilla: image: itzg/minecraft-server:latest container_name: mc-vanilla restart: unless-stopped ports: - "25565:25565" environment: EULA: "TRUE" VERSION: "1.20.4" MEMORY: "4G" # 设置简单白名单/在线模式等也可以用 env: # ONLINE_MODE: "TRUE" # ENABLE_WHITELIST: "TRUE" volumes: - ./vanilla:/data同目录执行:
docker compose up -ddocker compose logs -f mc-vanilla停服:
docker compose down注意:
down不会删卷,只要不加-v,世界存档和配置都在./vanilla中安全存放。
五、Paper 服务器(推荐生产用):高性能原版体验
Paper 是基于 Spigot 的高性能分支,特点:
- 更高 TPS,更好性能优化;
- 更丰富的配置项;
- 插件生态兼容 Spigot/Bukkit;
- 适合绝大多数 “生存 + 插件” 服。
itzg/minecraft-server 中,只需要把 TYPE 改为 PAPER 即可。
在 docker-compose.yml 中新增一个服务:
mc-paper: image: itzg/minecraft-server:latest container_name: mc-paper restart: unless-stopped ports: - "25566:25565" # 宿主 25566 -> 容器 25565 environment: EULA: "TRUE" TYPE: "PAPER" VERSION: "1.20.4" MEMORY: "6G" # 开启白名单(可选) # ENABLE_WHITELIST: "TRUE" # 设置服务器图标/描述等也可通过挂载文件解决 volumes: - ./paper:/data说明:
- 宿主机端口 25566 对应容器 25565,这样不会和原版服冲突;
- 你可以同时开原版和 Paper,分别用 25565 和 25566。
启动:
docker compose up -d mc-paperdocker compose logs -f mc-paperPaper 标签页中你可以找到更多配置文件:
paper.ymlspigot.ymlbukkit.yml
都位于 ./paper 目录里,可以按需要优化。
六、Spigot 服务器:插件服的经典选择
Spigot 是 Bukkit 的一个高性能分支,很多插件仍然把它当作最基础的服务端。
依然可以通过 TYPE=SPIGOT 方式部署:
mc-spigot: image: itzg/minecraft-server:latest container_name: mc-spigot restart: unless-stopped ports: - "25567:25565" environment: EULA: "TRUE" TYPE: "SPIGOT" VERSION: "1.20.4" MEMORY: "4G" volumes: - ./spigot:/dataSpigot 和 Paper 的主要区别在于:
- Paper 补充了更多优化和配置项;
- Spigot 更趋近于 “官方改的稳定性能版”。
现在主流更推荐 Paper 作为性能服首选,Spigot 可以作为兼容性备选。
七、Forge 模组服:大型模组生存
Forge 是老牌模组框架,很多经典整合包都基于 Forge。
itzg/minecraft-server 支持 TYPE=FORGE:
mc-forge: image: itzg/minecraft-server:latest container_name: mc-forge restart: unless-stopped ports: - "25568:25565" environment: EULA: "TRUE" TYPE: "FORGE" VERSION: "1.16.5" # 例如多数整合包使用的经典版本 MEMORY: "8G" # 模组多时适当给大一点 # FORGE_VERSION: "" # 如需特定 Forge 构建可加 volumes: - ./forge:/data启动后:
- Forge 会在
/data/mods、/data/config等目录中生成文件; - 你可以把
.jar模组放到宿主机的./forge/mods中; - 对应配置文件放
./forge/config。
提醒:Forge 模组服对内存和 CPU 要求会明显高于纯原版,越多模组越夸张。
八、Fabric 模组服:轻量级新秀
Fabric 是另一种模组 API,相对 Forge 更轻量、更新速度更快。
同样通过 TYPE=FABRIC 部署:
mc-fabric: image: itzg/minecraft-server:latest container_name: mc-fabric restart: unless-stopped ports: - "25569:25565" environment: EULA: "TRUE" TYPE: "FABRIC" VERSION: "1.20.4" MEMORY: "6G" # FABRIC_LOADER_VERSION: "" # 如需特定 Loader 可指定 volumes: - ./fabric:/dataFabric 模组服的要点:
- 模组同样放在
/data/mods; - 很多 Fabric 模组和 Forge 不兼容,整合包时要注意区分;
- 有不少性能优化类 Fabric 模组(如 Lithium、Phosphor 等),适合做 “轻量高性能模组服”。
九、BungeeCord / Waterfall:多服代理与跨服传送
当你想要:
- 一个统一入口 IP / 端口;
- 后面挂多个子服(大厅服、生存服、创造服、小游戏服……);
这时就需要一个代理层:BungeeCord / Waterfall / Velocity 等。
这里以 itzg/bungeecord 为例搭建一个 BungeeCord 节点。
1. 自定义 Docker 网络
为了让 BungeeCord 和各子服通过容器名互通,先在 compose 中定义一个网络:
networks: minecraft-net: driver: bridge2. BungeeCord 服务
在 docker-compose.yml 中添加:
bungeecord: image: itzg/bungeecord:latest container_name: mc-bungee restart: unless-stopped ports: - "25565:25577" # 默认 Bungee 监听 25577,我们映射到宿主 25565 environment: # 按需设置最大内存等 JAVA_OPTS: "-Xmx1G" volumes: - ./bungee:/server networks: - minecraft-net说明:
- Bungee 默认监听 25577 端口,我们把它映射到宿主 25565;
- 日后玩家只需要连你的
IP:25565即可,由 Bungee 根据配置分发。
3. 后端子服示例(挂到 Bungee 上)
对于后端子服,不必再把端口映射到宿主机,只需要暴露在 Docker 网络中即可。
比如把前面的 Paper 服调整为后端服:
mc-paper-backend: image: itzg/minecraft-server:latest container_name: mc-paper-backend restart: unless-stopped environment: EULA: "TRUE" TYPE: "PAPER" VERSION: "1.20.4" MEMORY: "6G" ONLINE_MODE: "FALSE" # 重要:后端服关闭正版验证,由 Bungee 统一处理 ENABLE_RCON: "FALSE" volumes: - ./paper-backend:/data networks: - minecraft-net几个关键点:
- 后端 Paper 服不需要
ports(不映射到宿主); - 必须
ONLINE_MODE=FALSE,否则和 Bungee 的验证会冲突; - 在
./bungee的config.yml中配置后端:- 如
address: mc-paper-backend:25565(容器名 + 端口)。
- 如
Bungee/Waterfall/Velocity 更详细的权限、跨服传送、子服管理配置本身就能写一篇,从 Docker 的角度,核心在于:端口 / 在线模式 / Docker 网络 / 配置文件挂载。
十、常用环境变量与配置技巧
itzg/minecraft-server 支持的大量环境变量,这里列几个最常用的:
- 基础:
EULA:必须为TRUE;VERSION:MC 版本;TYPE:VANILLA/PAPER/SPIGOT/FORGE/FABRIC等;MEMORY:分配给 JVM 的内存,如4G;
- 玩家与验证:
ONLINE_MODE:TRUE/FALSE,是否启用正版验证(Bungee 后端需关掉);ENABLE_WHITELIST:TRUE时启用白名单;WHITELIST:逗号分隔玩家名列表;OPS:逗号分隔 OP 玩家,例如OPS: "PlayerA,PlayerB";
- RCON / 控制:
ENABLE_RCON:是否启用远程控制;RCON_PASSWORD:RCON 密码;RCON_PORT:RCON 端口;
- 世界与游戏规则(部分选项也可以通过
server.properties或命令控制):DIFFICULTY:peaceful/easy/normal/hard;ALLOW_NETHER、ENABLE_COMMAND_BLOCK、SPAWN_ANIMALS等;
- 高级 JVM 配置:
JVM_OPTS/JVM_XX_OPTS:加 GC、压缩指针等参数;- 如:
JVM_OPTS: "-XX:+UseG1GC -XX:+UnlockExperimentalVMOptions -XX:MaxGCPauseMillis=200"。
此外:
- 如果你更习惯直接编辑
server.properties,完全可以在第一次启动后:- 停服;
- 修改
./xxx/server.properties; - 再起服。
Docker 只是帮你封装了运行环境,并不限制你手动改配置。
十一、备份、迁移与升级
1. 备份
备份最简单粗暴的方式就是 打包数据目录:
cd ~/docker-data/minecrafttar czf mc-vanilla-backup-$(date +%Y%m%d).tar.gz ./vanillatar czf mc-paper-backup-$(date +%Y%m%d).tar.gz ./paper建议:
- 备份前先停服或至少让世界保存一次(
/save-all); - 把压缩包上传到其他机器或对象存储;
- 重要模组服 / 大型建筑服可以设定定期备份计划。
2. 迁移
迁移步骤通常是:
-
在新机器装 Docker;
-
把
~/docker-data/minecraft整个目录拷贝过来; -
使用同一个
docker-compose.yml; -
在新机器执行:
Terminal window docker compose up -d -
等待启动完成后,玩家改连新 IP 即可。
3. 升级
升级包括:
- 升级镜像(JVM / 核心);
- 升级 MC 版本。
升级镜像:
-
修改
docker-compose.yml中的image标签(如从latest改为java17-XXXX); -
执行:
Terminal window docker compose pulldocker compose up -d
升级 MC 版本(比如从 1.19.4 到 1.20.4):
- 确保备份完成;
- 改
VERSION环境变量; - 启动服务端,看控制台是否提示世界升级;
- 升级后如发现严重问题,可以用备份回滚。
对于有大量模组的 Forge/Fabric 服,升级版本属于高风险操作,通常建议新开一套世界慢慢迁移。
十二、常见问题与排查思路
1. 容器启动即退出 / 不断重启
常见原因:
- 没有设置
EULA=TRUE; - 环境变量配置错误(版本和类型不兼容、拼写错误);
- 映射目录权限问题(尤其是 Linux 上);
- 模组冲突或插件错误导致服务端崩溃。
排查命令:
docker logs mc-xxx根据控制台输出解决:
- 看有没有 “You need to agree to the EULA”;
- 看是否有某个模组 / 插件报错堆栈。
2. 玩家连不上服务器
检查顺序:
-
服务端是否真的在监听端口:
Terminal window docker psss -tulnp | grep 25565 -
云服务器上安全组是否放行了对应端口;
-
家宽下路由器端口映射是否正确,公网 IP 是否为运营商 CGNAT;
-
客户端是否填写了正确的 IP:端口,没写错号。
3. 延迟高 / TPS 低
考虑因素:
- 硬件资源是否够(CPU / 内存 / 磁盘 IO);
- 模组/插件是否过多;
- 玩家是否分布太广(跨洲连线);
- 是否同时跑了过多世界 / 维度。
优化建议:
- 使用 Paper 替代纯原版;
- 合理调整
view-distance/simulation-distance; - 使用性能优化插件 / 模组(如 Paper 的相关插件、Fabric 的优化模组);
- 考虑增加节点或拆分为多个子服,通过 Bungee 连接。
4. 世界损坏 / 崩档
常见情形:
- 硬关机;
- 磁盘写满;
- 模组写存档时崩溃。
处理思路:
- 先备份当前目录(即便已损坏);
- 如果有近期备份,尝试回滚;
- 有些情况下可以通过 region 编辑器(如 MCA Selector)修复局部区域,但这已经属于高级操作。
十三、从零搭满:Minecraft + Docker 部署清单
最后总结一份完整 checklist,作为今后开服时的速查表:
- 选定机器(云服务器 / 家宽主机),安装 Docker;
- 规划好端口(25565 主入口 + 若干子服端口);
- 在宿主创建
~/docker-data/minecraft,并规划好子目录结构; - 拉取
itzg/minecraft-server和itzg/bungeecord镜像; - 写一个
docker-compose.yml:- 原版服(
TYPE=VANILLA); - Paper / Spigot 插件服;
- Forge / Fabric 模组服;
- 如需多服入口,增加 BungeeCord 服务和后台子服;
- 原版服(
- 配置必要的环境变量:
EULA、VERSION、TYPE、MEMORY、ONLINE_MODE、白名单/OPS 等; docker compose up -d启动,查看日志确保无报错;- 去各服的数据目录下微调
server.properties、paper.yml、模组配置等; - 对外公布 IP/端口,测试多端(PC/移动)连接;
- 配置定期备份与监控,升级前一定先备份,必要时用 Bungee 拆分压力。
做到这里,你就拥有了一套高度可控、易迁移、易扩展的 Minecraft Docker 服主架构:
无论是一个安静的小伙伴生存服,还是多服联机的大型社区,都可以在这套基础上按需堆砌与优化,而不必每次都从手动装 Java 和 server.jar 开始折腾。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!