用 Docker 搭建 Minecraft 服务端

Author Avatar
天空之间 1月 21, 2017
  • 在其它设备中阅读本文章

为什么要写这个

因为到了假期,NV 假期服务器即将开服啦~
以往我们使用的是很坑很坑的阿里云,各种卡顿,价格昂贵,所以这次我想到可以使用 Docker 容器来架设服务器,于是就有了这篇文章~
如果你想加入服务器游玩的话,请看最后一节,服务器的QQ群~

Docker 是什么

Docker 是一个虚拟化容器,他提供一种轻量级应用运行环境,保持开发环境和生产环境的一致化。它与虚拟机的最大区别在于,每个容器不包含自己的操作系统内核,而是由宿主系统提供内核运行,这让容器可以在相同的硬件条件下进行更细颗粒度的资源调节,充分使用系统资源。

Minecraft

Minecraft 是由 Mojang 公司开发的一款沙盒类开放世界游戏,现在已被 Microsoft 公司收购。在 MCP 计划的带领下涌现了很多优秀的 Mod 对游戏的可玩性有着巨大的提升,在此期间,Mod 加载器 ModLoader 、 Forge 、 LiteLoader 陆续出现,让各个 Mod 得到了协调统一。同时,在服务端方面出现了 Bukkit 、 Spigot 、 Sponge 等支持插件的服务端,让游戏服务器更容易管理。
在漫长的岁月中 Minecraft 从最初的版本发展到了 1.11.2 ,经历了 1.2.5 Mod 时代的辉煌。
同时,Minecraft 本体也历经 红石更新 / 地形更新 / 寒霜更新 / 战斗更新 / 冒险更新 一步一步的完善。
Mod 加载器也从最初的 ModLoader 变为 ModLoader 与 Forge 并存,到 1.5 时代 ModLoader 停止开发,退出了历史舞台,Forge 提供了 FML (ForgeModLoader) 来兼容 ModLoader 开发的 Mod。
到现在 LiteLoader 作为可与 Forge 加载器共存在同一个游戏中,让玩家同时享受2种加载器带来的 Mod。

SpongeForge

SpongeForge 是新一代的服务端插件解决方案,他解决了历史遗留中插件和 Mod 共存下的种种难处,这也是现在 1.10 版本以上的服务端插件加载方案。同时,我今天也将使用它构建一个同时支持插件和 Mod 的服务端。
SpongeForge 官网:点击此处

PS 为什么这些外国人开发的服务端都跟水过不去….
水桶 –> 水龙头 –> 炼药锅 –> 海绵

如何搭建

说了那么多,我们该开始真正的搭建一个服务端了!
我这次以 1.10.2 为例

搭建服务端

因为我们需要一个同时支持插件和 Mod 的服务端,所以我先去找了下在 1.7 时代最常用的服务端 KCauldron ,然而,他并不支持 1.10.2 ,所以,我换了一种方案——使用 Forge + SpongeForge 同时支持插件和 Mod 。

下载 Forge 服务端

先来到 Forge下载页,下载 1.10.2 版的 Forge Installer ,然后双击打开会看到下图。

选择 Install Server ,然后选择一个空目录,点击 确定 即可完成服务端的下载。

首次运行

现在,执行 java -jar forge-1.10.2-12.18.3.2185-universal.jar (中间的版本号请自己根据情况修改) ,会发现服务端启动了几秒之后自动退出了,这是到底为什么呢?

同意 EULA

这是因为 1.7 版本以上的服务端必须同意 Mojang 的用户协议才能启动,现在会发现根目录下多出了 eula.txt 文件,打开这个文件,更改里面的 eula=falseeula=true 后,再次启动服务端,就会发现服务端已经被成功启动了。

安装 Mod

这一步我相信只做过客户端整合的人都会非常熟悉,把你需要的 Mod 放入 mods 文件夹,并确认版本符合就可以了。
当然,有些 Mod 并不支持服务端,这时你只能忍痛去掉他们了。

安装插件支持

由于 1.10.2 这里使用 SpongeForge 来支持插件,所以到 SpongeForge 下载页下载 SpongeForge 并放入 mods 文件夹即可。

寻找并安装插件

这里和安装 Mod 一样,只需要找到对应版本的插件放入服务端的 mods 文件夹里就可以了。
Sponge 插件列表

配置服务端

服务端设置

因为服务端的默认设置不太符合中国国情(咳咳) 所以,我们需要做一些修改。
打开 server.properties 文件,修改以下配置

online = false #关闭正版验证
motd = Winter Vacation Server 2017 #标语

插件设置

最终我选择了 Nucleus the Ultimate Essentials Inspector FlexibleLogin PermissionManager WorldEdit Web-API 这几个插件

Nucleus the Ultimate Essentials

这是一个游戏内基础命令插件,我相信,用过以前 Essentials 插件的人应该不会陌生。

Inspector

一个记录插件,用于记录用户状态变化,方块变化,并可以查询和回档。

FlexibleLogin

因为关闭了正版验证,所以我们需要额外的登录插件来实现登录,FlexibleLogin 正是 Sponge 体系下的登录认证插件,它甚至支持 TOTP 模式创建动态登录密码。

PermissionManager

用于管理权限,细致的调整玩家可以使用的功能和命令。

WorldEdit

我相信各位建筑师和腐竹们应该不会陌生,游戏内方便的大范围地形修改插件。

Web-API

因为 Docker 化之后没法直接访问控制台,所以我们需要一个替代控制台的方案,Web-API 是个不错的选择。
这个插件为了安全可以设置访问密钥,访问 帮助文档 以获得更多消息
访问 http://127.0.0.1:8080/api/cmd 来执行命令并获取返回值

权限调配

先创建3个组,分别为 players builders admin

players 组

将这个组设置为基础,这是所有玩家的基础组,拥有基础权限

nucleus.suicide.exempt.*
inspector.toggle
nucleus.teleport.tpahere.exempt.cost
inspector.use
nucleus.teleport.tpahere.base
nucleus.home.list.base
nucleus.home.base
nucleus.spawn.exempt.cost
nucleus.teleport.tpa.exempt.cost
nucleus.teleport.tpaccept.base
nucleus.home.set.base
nucleus.teleport.tpa.base
nucleus.hat.base
nucleus.spawn.base
nucleus.warp.base
nucleus.home.set.exempt.*
nucleus.teleport.teleport.exempt.cost
nucleus.home.exempt.cost

主要涵盖查询方块状态、传送、设置家、使用hat命令

builder 组

这个组的权限从 players 继承而来并拥有以下额外权限

worldedit.*
nucleus.fly.exempt.*
nucleus.fly.base

主要允许建筑师使用 WorldEdit 插件来完成建筑,同时给予飞行权限

admin 组

给予 * 权限,是服务器的管理者

Sponge 下的权限管理

在 Sponge 下,一旦启动权限插件,op权限就会大部分失效,需要执行权限插件的添加权限命令,为管理员添加 * 权限才能正常工作

/pm users your_username set permission * 

如果你已经创建了权限组,则可以使用下面的命令将一个人添加到组

/pm users your_username add group your_groupname

选择 Docker 镜像

Docker 的起始是由一个基础镜像开始的,你可以选择 Ubuntu 镜像从头开始配置,或者找一个符合你要求的镜像开始配置,我这次选择的是 psiag/oracle-java 镜像开始的,这个镜像包含配置好的 java 8 可以直接使用。

编写打包脚本

因为 Dockerfile 编写时可以使用 ADD 或者 COPY 来添加文件到镜像,我选择的是使用 ADD 命令解包一个 tar 文件并添加到镜像。
先使用 tar -cvf 目标 文件1 文件2 ... 命令,将需要的文件打包为 tar 。
一个服务端中我们需要以下文件和文件夹

config
crash-reports (空文件夹)
libraries
mods
world (空文件夹)
eula.txt
forge-1.10.2-12.18.3.2185-universal.jar
minecraft_server.1.10.2.jar
server.properties

tar -cvf Server.tar config crash-reports libraries mods world eula.txt forge-1.10.2-12.18.3.2185-universal.jar minecraft_server.1.10.2.jar server.properties

这样就会打包出 Server.tar 文件
然后我们可以把 Docker 构建命令也放进 sh 脚本中,最终文件为下面这样
build.sh

tar -cvf Server.tar config crash-reports libraries mods world eula.txt forge-1.10.2-12.18.3.2185-universal.jar minecraft_server.1.10.2.jar server.properties  
docker build -t thisimagetag .

注:thisimagetag 换成你想设置的标签

编写 Dockerfile

在相同目录下创建一个 Dockerfile 文件,放入以下内容

FROM psiag/oracle-java  
MAINTAINER cubesky  
ADD Server.tar /mcserver  
EXPOSE 25565  
EXPOSE 8080  
WORKDIR /mcserver/  
VOLUME /mcserver/world  
VOLUME /mcserver/crash-reports  
CMD ["/usr/bin/java","-jar","forge-1.10.2-12.18.3.2185-universal.jar","nogui"]  

Dockerfile 解释

  1. 使用 FROM 引入带有 java 8 的镜像
  2. 使用 MAINTAINER 来标记作者
  3. 使用 ADD 命令来添加文件到镜像
  4. 使用 EXPOSE 来定义需要暴露给公网的端口,在这个镜像中使用了以下端口
    • 8080 Web-API 的控制接口
    • 25565 Minecraft 的连接端口
  5. 使用 VOLUME 声明需要持久化的文件,一般来说,将 world 文件夹持久化,防止丢失地图就可以了
  6. 使用 CMD 定义启动点

构建镜像

因为我们之前已经写好了构建脚本,现在执行 sudo sh build.sh 就能开始构建了,喝杯咖啡等下吧~(因为 docker 命令需要最高权限,所以请使用 sudo 命令启动脚本)

上传镜像 (可选)

在你的构建服务器上执行下面的命令来登陆到 docker 注册服务

docker login 注册服务地址

按照提示输入用户名和密码
然后执行以下命令来标记要上传的镜像(最后的标签可以省略)

docker tag thisimagetag 注册服务地址/用户名/镜像标记名:标签

最后使用

docker push 注册服务地址/用户名/镜像标记名:标签

来完成推送镜像到注册服务
注:这一步取决于你的网络和注册服务的网络情况,推送镜像可能需要数十分钟

运行

命令行运行

先创建一个 world 的空文件夹,然后执行

docker run --name mc -d -v world:/mcserver/world -p 25565:25565 -p 8080:8080 -it thisimagetag  

就可以直接启动服务端了~ (thisimagetag 是这个镜像的标签)

使用云

如果你使用容器云 CaaS 那么在你上一步上传镜像之后,需要在面板上进行如下操作

  1. 创建一个存储卷
  2. 到应用面板中部署你刚刚上传的镜像,我个人推荐选择 1核 4G内存 以上的容器。
  3. 设置容器端口转发生效
  4. 设置容器为有状态服务,将 /mcserver/world 挂载点挂载到存储卷
  5. 启动容器,等待部署完成
  6. Enjoy!

欢迎来到 NV假期休闲服

欢迎到我们的服务器游玩
群号码:579263743
或者可以扫描加群二维码

点击这个链接也可以哦
579263743

本文使用 CC BY-NC-SA 3.0 中国大陆 协议许可
具体请参见 知识共享协议

本文链接:https://liyin.date/2017/01/21/docker-minecraft-server/