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