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
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
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
#!/bin/bash
SCREEN_NAME='minecraft'
cd /opt/bedrock
screen -UAmdS $SCREEN_NAME docker compose up -d
$ vi /opt/bedrock/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
[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
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統合版のサーバーをdockerで構築|Qiita
https://qiita.com/kudamatsu/items/b37ee7461cbc8e0f62b2