快轉到主要內容

如何在Ubuntu系統以Docker架設Minecraft Java版伺服器

Linux系統 Self-hosting自架 Minecraft Docker
🗓️ 民國112年 癸卯年
✍ 切換正體/簡體字
目錄

*本文為Ubuntu Linux架設Minecraft Java版伺服器的教學,如果您想在Linux電腦玩Minecraft Java版,請參閱 此篇

Mojang開發的Minecraft Java版伺服器(Minecraft Java Edition server)是給那些需要大型多人連線的玩家所準備的,屬於專有軟體。相較於單純的局域網分享,開Minecraft伺服器能應對更多人數的玩家需求,同時也還可以安裝各種模組(mod)、插件(plugin)增強遊戲效果。

本文Ivon使用容器化技術,將Minecraft伺服器跑在Docker容器裡,簡化部署流程,並減少對伺服器系統的依賴。

1. 環境
#

  • 系統:Ubuntu 22.04 LTS 安裝教學
  • CPU: 4核心x86架構CPU
  • RAM:8GB
  • 硬碟空間:20GB

雖說這裡用Ubuntu系統做示範,但因為主要是依賴Docker來跑,不需設定Java,只要能裝Docker,用CentOS/Debian的Linux電腦來架也可以。

2. 撰寫Docker-compose
#

此處使用itzg組織維護的映像檔,該映像檔基於Mojang官方發表的最新 Minecraft伺服器軟體所建置(對應最新穩定版的Minecraft,例如1.20),支援x86與ARM架構的電腦。

  1. 請先安裝 Docker

  2. 新增存放世界資料的目錄,這裡就是伺服器的根目錄了。

cd ~
mkdir minecraft_server
cd minecraft_server
  1. 參考 官方說明,新增docker-compose.yml
vim docker-compose.yml
  1. 填入以下內容。這裡跑二個服務,一個是Minecraft伺服器服務,一個是備份世界的服務(後述)
version: "3.8"

services:
  # 伺服器服務
  mc:
    image: itzg/minecraft-server
    container_name: "mc"
    tty: true
    stdin_open: true
    ports:
      - "25565:25565"
    environment:
      # 自動同意伺服器的EULA
      EULA: "TRUE"
      # 設定分配8GB RAM
      MEMORY: "8G"
      # 設定JVM啟動參數,設定最多使用75% RAM
      JVM_OPTS: "-XX:MaxRAMPercentage=75"
    volumes:
      # 在目前的目錄新增存放資料的目錄
      - ./data:/data

  # 自動備份服務
  backups:
    image: itzg/mc-backup
    environment:
      BACKUP_INTERVAL: "24h"
      RCON_HOST: mc
      PRE_BACKUP_SCRIPT: |
        echo "Before backup!"
        echo "Also before backup from $$RCON_HOST to $$DEST_DIR"        
      POST_BACKUP_SCRIPT_FILE: /post-backup.sh
    volumes:
      # 與Minecraft伺服器共用目錄,唯讀
      - ./data:/data:ro
      # 備份至mc-backups
      - ./mc-backups:/backups
      - ./post-backup.sh:/post-backup.sh:ro
  1. 啟動服務
sudo docker compose up -d
  1. ip addr查看Linux電腦的區域IP:
# 範例輸出,IP為192.168.0.5

wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    inet 192.168.0.5/24 brd 192.168.0.255 scope global dynamic noprefixroute wlan0
  1. 如果Linux有防火牆,記得開放25565通訊埠
sudo ufw allow 25565

sudo ufw reload
  1. 於同一區域網路下的電腦,開啟Minecraft,點選多人遊戲 → 新增伺服器,輸入<Linux電腦區域IP>:25565嘗試連線。

3. 調整Minecraft的伺服器設定
#

  1. Minecraft伺服器的資料位於~/minecraft_server/data,若要修改伺服器設定。先將容器服務停止:
sudo docker compose down
  1. 再編輯~/minecraft_server/data/server.properties檔案。
vim ~/data/server.properties

server.properties定義伺服器的設定,例如玩家人數、生存或創造、遊戲難度、要載入的世界等等。詳細用法參考 Minecraft Wiki


此外,data目錄下還有其它重要檔案:

world目錄即為伺服器載入的世界。玩家一連線就會生成一個空白世界,可自行替換成現有世界。

whitelist.json:定義白名單,設定只有在該列表的玩家才能加入世界。需在server.propertieswhite-list=設為true才會啟用白名單機制。伺服器管理員可以在遊戲中以/whitelist指令編輯白名單,用/list uuids列出所有玩家的UUID。再如下填寫:

[
  {
    "uuid": "UUID",
    "name": "玩家名稱"
  },
  {
    "uuid": "UUID",
    "name": "玩家名稱"
  }
]

ops.json:定義作為伺服器管理員(OP)的玩家。

banned-players.json:黑名單玩家。

banned-ips.json:禁止連線的IP。

logs目錄:輸出Minecraft伺服器的系統訊息,方便除錯。

mods目錄:安裝Forge、Fabric模組之用。

plugins目錄:安裝插件之用。

config目錄:放置模組設定檔。


修改完成後,再重新啟動容器服務:

cd ~/minecraft_server
sudo docker compose up -d

3. 設定定時備份世界的排程任務
#

備份Minecraft世界有助於復原遊戲資料。

我們在上面的docker-compose.yml已經跑了一個mc-backup的服務,它每24小時就會將世界備份到~/minecraft_server/mc-backups目錄,以壓縮檔形式儲存。

僅供參考:手動systemd timer定時備份法

最簡單的Minecraft世界備份方式就是將世界目錄製成壓縮檔。

新增備份目錄

mkdir ~/backup

壓縮世界檔案,檔名帶入目前時間

zip -r world_$(date +"%Y%m%d") ~/backup

ls ~/backup指令看壓縮檔有無出現在backup目錄

# 範例輸出
world_20230722.zip

接著要將上述步驟自動化,我們將設定一個sytemd unit,設定每日0時,將Minecraft伺服器的世界(worlds目錄)做成壓縮檔備份,並儲存到使用者家目錄(需填寫完整路徑,如/home/user/backup,其中user是您的使用者名稱)

  1. 往系統新增systemd unit
sudo vim /etc/systemd/systemd/backup-minecraft-data.service
  1. 填入以下內容,指令為使用zip工具,建立檔名帶有備份當下時間的壓縮檔。
[Unit]
Description=backup-minecraft-data

[Service]
Type=oneshot
# 對容器發送rcon指令,強迫Minecraft存檔,再行備份
ExecStart=docker exec -i mc rcon-cli save && sudo docker exec -i mc rcon-cli save-off && /usr/bin/zip -r world_$(date +"%Y%m%d") "/home/user/backup" && docker exec -i mc rcon-cli save-on

WorkingDirectory=/home/user/backup/minecraft_server
  1. 再建立一個systemd timer
sudo vim /etc/systemd/systemd/backup-minecraft-data.timer
  1. 填入以下內容
[Unit]
Description=backup-minecraft-data

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target
  1. 最後,啟用服務
sudo systemctl daemon-reload
sudo systemctl enable --now backup-minecraft-data.timer

4. 開放外部連線的作法
#

如果您的伺服器沒有固定的公共IP,又想讓區域網路外部連線進來,那麼推薦在所有電腦(含Minecraft伺服器的電腦本身)安裝 內網穿透軟體,進行連線。

屆時Minecaft伺服器的IP,就是改用虛擬區域IP來連線,例如安裝ZeroTier後,Mineraft伺服器可能會分配到一個172.30.155.1的虛擬區域IP,那麼在Minecraft裡面就用這個IP連線。

延伸閱讀
#

itzg Minecraft伺服器官方參考文件 Minecraft Server on Docker (Java Edition)

itzg Minecraft伺服器備份方案參考文件 docker-mc-backup

教學/架設伺服器 - Minecraft Wiki

相關文章

標籤式圖片管理軟體,Hydrus Network的Docker遠端存取方案
Linux系統 Self-hosting自架 Hydrus Network Docker Media Server Photo Gallery
Docker跑calibre-web,架設閱讀電子書伺服器
Linux系統 Self-hosting自架 Calibre Docker
你知道Docker會讓Linux的UFW防火牆失效嗎?用ufw-docker解決此問題
Linux系統 Self-hosting自架 Linux Docker

留言板

此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。要討論程式碼請用Giscus,匿名討論請用Disqus。

這是Giscus留言板,需要Github帳號才能留言。支援markdown語法,若要上傳圖片請貼Imgur連結。您的留言會在Github Discussions向所有人公開。

這是Disqus留言板,您可能會看到Disqus強制投放的廣告。有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。