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
{
  "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,繼續探索這個遊戲無限的可能性。