我大概从2013年开始接触到了 Minecraft ,算下来,今年正好是我接触 Minecraft 的第十个年头。
熟悉 Docker 以后,我着手开始把我现在跑的服务容器化,从某种意义上,这非常「优雅」——可以很方便的管理各个服务,还不用担心各种环境不兼容的问题。
暑假将至,为了方便和朋友们联机玩 MC,遂自行搭建一个服务器,顺便进一步熟悉 Docker 和 Docker Compose。
服务器选择
服务器有两个要求,一是性能要足够强,二是距离要足够近,目前我手头有三台机器,分别位于香港和洛杉矶,不是性能不够就是距离太远,延迟太高。所以,都无法满足需求。
最近恰逢618,各大云主机厂商都有活动,遂购入一台某大厂轻量服务器,位于上海,2C4G5M,对于一个入门 MC 服务器来说完全足够。当然,买了这一个服务器不可能只是跑跑 MC,别的一些对带宽要求不高的服务我肯定也会放在上面。
那么直接 Deploy,似乎用的还是 AMD 的新 EPYC,还行。
安装 Docker
相比于一键脚本,我个人还是偏好手动安装 Docker。个人为了方便直接用了 Root,这不是最佳实践,尽可能用普通用户并在必要的时候用sudo。
添加 PGP 密钥:
 |  | 
向source.list添加软件源:
 |  | 
更新软件包缓存并安装 Docker:
 |  | 
启动 Docker:
 |  | 
至此 Docker 已经安装完成,顺遍装好了 Docker Compose。
Docker 换源
国内服务器这点非常蛋疼。
换源还要有一个命令行的文本编辑器,于是我决定先装个 Vim:
 |  | 
编辑/创建/etc/docker/daemon.json:
 |  | 
编辑成如下内容:
 |  | 
https://mirror.ccs.tencentyun.com是某大厂的内网镜像,内网拉取速度极快,还不计流量,不在内网里的服务器无法使用,应当换成下列镜像:
https://hub-mirror.c.163.comhttps://ustc-edu-cn.mirror.aliyuncs.comhttps://mirror.baidubce.com
随后重启 Docker 服务即可完成换源:
 |  | 
粗略部署
我部署服务的原则是先 Get it to work,再 Polish。
对于 MC 这种 community driven 的游戏来说,社区的力量是强大的,基本上什么样的需求都能在社区里找到对应的解决方案。我直接采用了 itzg/docker-minecraft-server。
不得不吐槽的是,这个项目的文档写得实在是没有那么友好,摸索了一下,总算是把这个服务基本的跑起来了。这时我的docker-compose.yml如下:
 |  | 
这样的 Docker Compose 配置能以最新的版本把一个基础的 Vanilla Server 跑起来,只能勉强满足几个人的联机需求,肯定也没几个人会将这样的配置用到生产环境。
进一步调整
要进一步调整,要先确认调整的方向,否则就是无头苍蝇,误打误撞,没有目标,十分痛苦。实际感受一番后,我大致整理出了此时配置的问题,有些是 Vanilla 客户端的问题:
- 版本不固定
 - 缺少基本的性能数据
 - 图标和 MOTD 需要调整
 - 没有白名单
 - 不能装插件
 - 有正版验证(无所谓,我有正版)
 
有了这个方向,我就可以有目标的去调整这个 Server 的配置。接下来要做的,就是查阅这个项目的文档,做出自己需要的修改。
固定版本
说实话 MC 的版本更新还挺频繁的,前一个版本尚未体验下一个版本就会出现。我暂时先固定这服务器的 MC 版本为1.19.4,日后充分游玩再慢慢升级。
同时 Vanilla Server 实在是太垃圾,顺便将其换成 PAPER 岂不美哉?分别设置VERSION和TYPE两个环境变量即可。藉由 Paper 的优点,这样也同时解决了服务器插件和性能数据的问题。
白名单
设置ENABLE_WHITELIST和ENFORCE_WHITELIST两个环境变量,即可强制服务器核查白名单。同时,不要忘记将自己加入白名单,由于服务器的 OP 会被自动加入白名单,只需要将自己提前设置为 OP 即可,设置OPS即可做到这一点。
图标和 MOTD
设置ICON和MOTD两个环境变量即可自定义服务器的图标和标语。
正版验证
设置ONLINE_MODE变量即可控制正版验证的开关。
需要注意的是,关闭ONLINE_MODE后,服务器会根据玩家的离线 UUID 判断身份,离线 UUID 和在线 UUID 不同,此时添加 OP 和黑白名单都需要改用离线 UUID 进行。
最终的 docker-compose.yml
 |  | 
一些杂七杂八的事情
RCON 的连接
服务器运行后,若要在不进入游戏的情况下管理服务器,就需要用到 RCON。方法很简单,使用这个项目绑定的 rcon-cli 即可:
 |  | 
注意将<name_of_container>换成自己的容器名。
作者还推荐了一个叫做rcon-web-admin的项目,打算过一阵子尝试。
安装插件
Paper 支持 Bukkit 的插件,还有自己的插件,插件数量上完全无需担心。
我们在配置docker-compose.yml时,已经做了 bind 操作,会在docker-compose.yml所在目录的相对路径下创建一个叫做minecraft-data的文件夹,并绑定到容器的data目录,将下载好的插件.jar文件丢进./minecraft-data/plugins目录就完成了插件的安装。
我选用了 World Edit,Grief Prevention 和 Dead Chest 三个插件,保证原汁原味的生存体验。
最后
如果你有开服经验并且偏向手动修改server.properties,将OVERRIDE_SERVER_PROPERTIES设置为FALSE即可将server.properties的控制权交还到我们手中,这也是一种配置的手段。
Docker 开服还是相对容易的,社区已经造好了轮子,免去了很多不必要的麻烦。稍后我会继续 play around with the server,继续探索这个游戏无限的可能性。
