Minecraft(Bedrock)複数ワールドをDockerで構築

⚠この記事が公開されたのは 2023年9月28日で、内容が古く、間違っている可能性があります。

VPSにてDocker利用、同一IP、別ポートにて複数ワールドを構築しました。

環境

  • Xserver VPS(2GBプラン) ※プレイ人数やワールド規模に応じて変更してください
  • Ubuntu 22.04 (64bit)
  • Docker 24.0.5-64bit
  • Minecraft Bedrock Edition 1.20.31.01

インストール

Xserver VPSにてOS:Ubuntu 22.04, アプリケーション:Dockerを選択してUbuntuを起動したらDocker Composeをインストールします。

$ sudo apt update
$ sudo apt install docker-compose-plugin

ポート開放

$ sudo ufw enable
$ sudo ufw reload
$ sudo ufw status

Status: activeを確認できたら

$ sudo ufw allow 19133
$ sudo ufw allow 19135

19132がマイクラサーバーのデフォルトのポート番号ですが、19133と19135をそれぞれのワールド用に使用することにしました。他のポート番号でもOKです。
19134, 19136はiPv6で使用する可能性があるかもしれないと思ってひとつとばしているのですが、今回は使用しないので開放しなくて大丈夫です。

$ sudo ufw status

リストに19133, 19135があり、Action, Fromの項目がALLOW, Anywhereになっているか確認。

参考: Xserver VPSにDockerを導入する|Zenn

https://zenn.dev/ikkik/articles/4f2e7886b945be

docker-compose.ymlの作成

opt直下にbedrockディレクトリを作成します。

$ sudo mkdir /opt/bedrock

/opt/bedrock直下にdocker-compose.ymlを作成し、内容を記述します。

$ sudo vi /opt/bedrock/docker-compose.yml
docker-compose.yml
version: '3.4'

services:
#1つ目のワールド
  bds1:
    image: itzg/minecraft-bedrock-server:latest
    container_name: bedrock_server1
    environment:
      EULA: "TRUE"
      SERVER_NAME: HogeServer1
      LEVEL_NAME: hogeserver1
      GAMEMODE: survival
      DIFFICULTY: normal
      # 以下のマイクラのサーバープロパティは任意です
      # ALLOW_CHEATS: false 
      # VIEW_DISTANCE: 5
      # TICK_DISTANCE: 3
      # OPS: 0123456789012345
      # CONTENT_LOG_FILE_ENABLED: false
    ports:
      - 19133:19132/udp
    volumes:
      - /data:/data
    stdin_open: true
    tty: true
#2つ目のワールド
  bds2:
    image: itzg/minecraft-bedrock-server:latest
    container_name: bedrock_server2
    environment:
      EULA: "TRUE"
      SERVER_NAME: HogeServer2
      LEVEL_NAME: hogeserver2
      GAMEMODE: survival
      DIFFICULTY: normal
      # 以下のマイクラのサーバープロパティは任意です
      # ALLOW_CHEATS: false 
      # VIEW_DISTANCE: 5
      # TICK_DISTANCE: 3
      # OPS: 0123456789012345
      # CONTENT_LOG_FILE_ENABLED: false
    ports:
      - 19135:19132/udp
    volumes:
      - /data:/data
    stdin_open: true
    tty: true
#バックアップ用※必要な場合
  backup:
    image: kaiede/minecraft-bedrock-backup:latest
    container_name: bedrock_server_backup
    restart: always
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /opt/bedrock/backups:backups
      - /opt/bedrock/data:/server
    depends_on:
      bds2:
        condition: service_healthy
    environment:
      TZ: Asia/Tokyo
    tty:true

バックアップ用のconfig.ymlの作成 ※不要なら飛ばしてください

/opt/bedrock/backups直下にconfig.ymlを作成し、内容を記述します。

$ sudo mkdir /opt/bedrock/backups
$ sudo vi /opt/bedrock/backups/config.yml
config.yml
containers:
  bedrock:
    - name: bedrock_server1
      worlds:
        - /server/worlds
schedule:
  interval: 24h
trim:
  trimDays: 2
  keepDays: 31
  minKeep: 2

dockerの起動確認

docker psで起動したコンテナーすべてのSTATUSがheathyならOKです。

$ sudo cd /opt/bedrock/
$ sudo docker compose up -d
$ sudo docker ps
CONTAINER ID    IMAGE   COMMAND CREATED STATUS  PORTS   NAMES
1234567890AB    kaiede/minecraft-bedrock-backup "usr/local/bin/entr..." 28 hours ago UP 14 hours (healthy)  bedrock_server_backup
234567890ABC    itzg/minecraft-bedrock-server:latest    "usr/local/bin/entr..." 28 hours ago UP 14 hours (healthy)  bedrock_server2
34567890ABCD    itzg/minecraft-bedrock-server:latest    "usr/local/bin/entr..." 28 hours ago UP 14 hours (healthy)  bedrock_server1

起動時のdocker自動実行と毎日再起動

起動用(start.sh)と停止用(stop.sh)のスクリプトを/opt/bedrock/server直下に作成します。

$ mkdir /opt/bedrock/server
$ vi /opt/bedrock/start.sh
start.sh
#!/bin/bash
SCREEN_NAME='minecraft'
cd /opt/bedrock
screen -UAmdS $SCREEN_NAME docker compose up -d
$ vi /opt/bedrock/stop.sh
stop.sh
#!/bin/bash
SCREEN_NAME='minecraft'
echo [`date '+%F %T'`] 'server stop script start'i
docker compose down
shutdown -r now

再起動した際にdocker(composeで設定したすべてのコンテナ)が自動実行されるように設定します。

vi /etc/systemd/system/minecraft.service
minecraft.service
[Unit]
Description=a minecraft server service
After=network-online.target
[Service]
Type=simple
user=root
Group=docker
RemainAfterExit=yes
ExecStart=/opt/bedrock/server/start.sh
Restart=always
RestartSec=3s
[Install]
WantedBy=multi-user.target

再起動してコンテナがすべて正常に起動していればOKです。

$ sudo shutdown -r now
$ sudo docker ps
CONTAINER ID    IMAGE   COMMAND CREATED STATUS  PORTS   NAMES
1234567890AB    kaiede/minecraft-bedrock-backup "usr/local/bin/entr..." 28 hours ago UP 14 hours (healthy)  bedrock_server_backup
234567890ABC    itzg/minecraft-bedrock-server:latest    "usr/local/bin/entr..." 28 hours ago UP 14 hours (healthy)  bedrock_server2
34567890ABCD    itzg/minecraft-bedrock-server:latest    "usr/local/bin/entr..." 28 hours ago UP 14 hours (healthy)  bedrock_server1

毎日0:00にインスタンスごと再起動するようにcrontabを設定します。
また再起動した際にIPアドレスが変わった場合に備えてDDNSの記述も設定します。
DDNSはDDNS Now(https://ddns.kuku.lu/)を事前に登録、使用した例です。

$ crontab -e
crontab
0 0 * * * /opt/bedrock/server/stop.sh
0-59 * * * * wget -O DDNSNow_update.log "https://f5.si/update.php?domain=DDNSNowユーザ名&password=DDNSNowパスワード"

一般ユーザーでもコンテナを実行できるように任意のユーザー(例:hogeuser)とグループ(例:docker)を追加してbedrock以下の所有者も変更する

$ sudo adduser hogeuser
docker:x:993:hogeuser
$ sudo groupadd docker
$ sudo usermod -G docker hogeuser
$ sudo cat /etc/group | grep docker
$ sudo chown -R hogeuser:docker /opt/bedrock

一般ユーザーでログインし直してdockerの起動確認

$ exit

一般ユーザーにて

$ cd /opt/bedrock
$ docker compose down

正常にコンテナを終了、削除できたか確認して改めてコンテナを起動

$ docker ps
$ docker compose up -d

最後にもう一度コンテナが正常に起動しているか確認し、PCなどからそれぞれのワールドにログインできるか確認してください。

$ docker ps
Minecraft Bedrock Edition(PC)のサーバー追加画面

参考: minecraft統合版のサーバーをdockerで構築|Qiita
https://qiita.com/kudamatsu/items/b37ee7461cbc8e0f62b2