Featured image of post Docker Minecraft 开服记

Docker Minecraft 开服记

我大概从2013年开始接触到了 Minecraft ,算下来,今年正好是我接触 Minecraft 的第十个年头。

熟悉 Docker 以后,我着手开始把我现在跑的服务容器化,从某种意义上,这非常「优雅」——可以很方便的管理各个服务,还不用担心各种环境不兼容的问题。

暑假将至,为了方便和朋友们联机玩 MC,遂自行搭建一个服务器,顺便进一步熟悉 Docker 和 Docker Compose。

服务器选择

服务器有两个要求,一是性能要足够强,二是距离要足够近,目前我手头有三台机器,分别位于香港和洛杉矶,不是性能不够就是距离太远,延迟太高。所以,都无法满足需求。

最近恰逢618,各大云主机厂商都有活动,遂购入一台某大厂轻量服务器,位于上海,2C4G5M,对于一个入门 MC 服务器来说完全足够。当然,买了这一个服务器不可能只是跑跑 MC,别的一些对带宽要求不高的服务我肯定也会放在上面。

那么直接 Deploy,似乎用的还是 AMD 的新 EPYC,还行。

安装 Docker

相比于一键脚本,我个人还是偏好手动安装 Docker。个人为了方便直接用了 Root,这不是最佳实践,尽可能用普通用户并在必要的时候用sudo

添加 PGP 密钥:

1
$ curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

source.list添加软件源:

1
2
3
$ echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

更新软件包缓存并安装 Docker:

1
2
$ apt update
$ apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

启动 Docker:

1
2
$ systemctl enable docker
$ systemctl start docker

至此 Docker 已经安装完成,顺遍装好了 Docker Compose。

Docker 换源

国内服务器这点非常蛋疼。

换源还要有一个命令行的文本编辑器,于是我决定先装个 Vim:

1
$ apt install vim

编辑/创建/etc/docker/daemon.json

1
$ vim /etc/docker/daemon.json

编辑成如下内容:

1
2
3
4
5
{
   "registry-mirrors": [
   "https://mirror.ccs.tencentyun.com"
  ]
}

https://mirror.ccs.tencentyun.com是某大厂的内网镜像,内网拉取速度极快,还不计流量,不在内网里的服务器无法使用,应当换成下列镜像:

  • https://hub-mirror.c.163.com
  • https://ustc-edu-cn.mirror.aliyuncs.com
  • https://mirror.baidubce.com

随后重启 Docker 服务即可完成换源:

1
$ systemctl restart docker

粗略部署

我部署服务的原则是先 Get it to work,再 Polish。

对于 MC 这种 community driven 的游戏来说,社区的力量是强大的,基本上什么样的需求都能在社区里找到对应的解决方案。我直接采用了 itzg/docker-minecraft-server

不得不吐槽的是,这个项目的文档写得实在是没有那么友好,摸索了一下,总算是把这个服务基本的跑起来了。这时我的docker-compose.yml如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
version: "3"

services:
  mc:
    image: itzg/minecraft-server
    ports:
      - 25565:25565
    environment:
      EULA: "TRUE"
    tty: true
    stdin_open: true
    restart: unless-stopped
    volumes:
      # attach a directory relative to the directory containing this compose file
      - ./minecraft-data:/data

这样的 Docker Compose 配置能以最新的版本把一个基础的 Vanilla Server 跑起来,只能勉强满足几个人的联机需求,肯定也没几个人会将这样的配置用到生产环境。

进一步调整

要进一步调整,要先确认调整的方向,否则就是无头苍蝇,误打误撞,没有目标,十分痛苦。实际感受一番后,我大致整理出了此时配置的问题,有些是 Vanilla 客户端的问题:

  • 版本不固定
  • 缺少基本的性能数据
  • 图标和 MOTD 需要调整
  • 没有白名单
  • 不能装插件
  • 有正版验证(无所谓,我有正版)

有了这个方向,我就可以有目标的去调整这个 Server 的配置。接下来要做的,就是查阅这个项目的文档,做出自己需要的修改。

固定版本

说实话 MC 的版本更新还挺频繁的,前一个版本尚未体验下一个版本就会出现。我暂时先固定这服务器的 MC 版本为1.19.4,日后充分游玩再慢慢升级。

同时 Vanilla Server 实在是太垃圾,顺便将其换成 PAPER 岂不美哉?分别设置VERSIONTYPE两个环境变量即可。藉由 Paper 的优点,这样也同时解决了服务器插件和性能数据的问题。

白名单

设置ENABLE_WHITELISTENFORCE_WHITELIST两个环境变量,即可强制服务器核查白名单。同时,不要忘记将自己加入白名单,由于服务器的 OP 会被自动加入白名单,只需要将自己提前设置为 OP 即可,设置OPS即可做到这一点。

图标和 MOTD

设置ICONMOTD两个环境变量即可自定义服务器的图标和标语。

正版验证

设置ONLINE_MODE变量即可控制正版验证的开关。

需要注意的是,关闭ONLINE_MODE后,服务器会根据玩家的离线 UUID 判断身份,离线 UUID 和在线 UUID 不同,此时添加 OP 和黑白名单都需要改用离线 UUID 进行。

最终的 docker-compose.yml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
version: "3"

services:
  mc:
    image: itzg/minecraft-server
    ports:
      - 25565:25565
    environment:
      EULA: "TRUE"
      TYPE: "PAPER"
      VERSION: "1.19.4"
      VIEW_DISTANCE: 8
      ENABLE_WHITELIST: "TRUE"
      ENFORCE_WHITELIST: "TRUE"
      OPS: ""
      ONLINE_MODE: "TRUE"
      SERVER_NAME: "Pub of NightCity"
      MOTD: "Want to have a drink?"
      ICON: ""
      OVERRIDE_SERVER_PROPERTIES: "TRUE"
    tty: true
    stdin_open: true
    restart: unless-stopped
    volumes:
      # attach a directory relative to the directory containing this compose file
      - ./minecraft-data:/data

一些杂七杂八的事情

RCON 的连接

服务器运行后,若要在不进入游戏的情况下管理服务器,就需要用到 RCON。方法很简单,使用这个项目绑定的 rcon-cli 即可:

1
$ docker exec -i <name_of_container> 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,继续探索这个游戏无限的可能性。

Licensed under CC BY-NC-SA 4.0