【第1回】Minecraft Bedrockサーバー用コンテナを作る

こんにちは。今回はMinecraft Bedrockサーバー(以下、Bedrockサーバー)を動かすコンテナイメージを作成します。

長くなりそうなので、記事は3回程に分けて投稿する予定です。

はじめに

Minecraft(統合版)はPC、Nintendo SwitchiOSAndroidなどのプラットフォームで展開されている有名なサンドボックスゲームです。

また、クロスプレイにも対応しておりRealmsやサーバーを利用することで、離れた場所にいるプレイヤーと一緒に遊べます。

本記事ではMinecraft公式のBedrockサーバーをコンテナで動かし、コンテナやDockerfileの作り方について学んでいきます。

想定読者

  • Dockerは使っているけれど、Dockerfileは何となく書いている方
  • Minecraftをみんなで遊びたい方

前提

  • 筆者の環境はApple Silicon搭載のMac
  • Docker Desktop for Macを導入済み

なぜコンテナ化するのか

Bedrockサーバーはステートレスではないため、一般的なWebサービスと比べるとコンテナ化のメリットは少ないでしょう。

ただし、アーキテクチャの制約や永続ボリュームの利用、設定ファイルの管理など、コンテナ化に際して考慮すべき点が多い分、それらを学ぶ良い機会にもなります。

さらに、近年はARMを採用するコンピュータが増えているため、Dockerを利用してx86_64のバイナリを動作させられる環境を用意しておくことで、環境構築の手間を大幅に削減できるでしょう。

(もっとも、実際のところは趣味が理由で、理屈は後付けです…)

作業用コンテナを使った動作確認

今回は作業用コンテナを使用して、Bedrockサーバーが起動し、Minecraftクライアント(アプリ)から接続できるところまで確認します。

作業用コンテナの起動

Bedrockサーバーはx86_64のバイナリイメージしか配布されていないため、作業用に同アーキテクチャのコンテナを立ち上げます。

もし、x86_64のマシンを使っている場合でも、これから作成するDockerfileの挙動を把握するために作業用コンテナを立ち上げましょう。

また、コンテナとMinecraftクライアントで通信ができるように、あらかじめUDPの19132番ポートを開放します。

Bedrockサーバーは公式でUbuntuをサポートしていますが、今回はDebianベースのコンテナイメージを選択しました。理由は次回説明します。

$ docker container run --platform=linux/amd64 --rm -p 19132:19132/udp -it debian:bookworm-slim /bin/bash
root@8de161ca6300:/#

作業用コンテナのセットアップ

Bedrockサーバーを起動するためにいくつかのパッケージが必要です。以下のコマンドで必要なパッケージをインストールします。

パッケージのインストールはDockerfile作成を考慮し、aptではなくapt-getを利用し、必要最小限のパッケージのみ導入します。

root@8de161ca6300:/# apt-get update && apt-get install -y --no-install-recommends ca-certificates curl unzip

また、作業用ディレクトリを作成し、以降の作業はそのディレクトリ内でおこないます。

root@8de161ca6300:/# mkdir work
root@8de161ca6300:/# cd work/
root@8de161ca6300:/work#

サーバーのダウンロード

Minecraftの公式サーバーをダウンロードします。ブラウザで以下のサイトを開きます。

www.minecraft.net

今回は「UBUNTU (LINUX) 用 MINECRAFT 専用サーバーのソフトウェア」を利用しますが、作業用コンテナ内でファイルを利用したいためダウンロードリンクを確認します。

リンクを確認したら、コンテナ内でcurlコマンドを利用してアクセスするため、User-Agentを指定してダウンロードします。User-Agentを指定しないと、ダウンロードが失敗します。

root@8de161ca6300:/work# curl -s \
  -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36' \
  -O 'https://www.minecraft.net/bedrockdedicatedserver/bin-linux/bedrock-server-1.21.51.02.zip'
root@8de161ca6300:/work#

これで、Bedrockサーバーがダウンロードされました。

アーカイブの展開と確認

ダウンロードしたファイルをunzipコマンドで展開し、lsコマンドで中身を確認します。

root@8de161ca6300:/work# unzip -q bedrock-server-1.21.51.02.zip -d bedrock-server
root@8de161ca6300:/work# cd bedrock-server
root@8de161ca6300:/work/bedrock-server# ls -l
total 165712
-rw-rw-r--  1 root root         3 Dec 10 17:35 allowlist.json
-rwxrwxr-x  1 root root 169604952 Dec 10 17:47 bedrock_server
-rw-rw-r--  1 root root     28041 Dec 10 17:35 bedrock_server_how_to.html
drwxrwxr-x 55 root root      4096 Dec 10 17:47 behavior_packs
drwxrwxr-x  3 root root      4096 Dec 10 17:47 config
drwxrwxr-x  9 root root      4096 Dec 10 17:47 definitions
-rw-rw-r--  1 root root         3 Dec 10 17:35 permissions.json
-rw-rw-r--  1 root root      8548 Dec 10 17:42 profanity_filter.wlist
-rw-rw-r--  1 root root       398 Dec 10 17:35 release-notes.txt
drwxrwxr-x  5 root root      4096 Dec 10 17:47 resource_packs
-rw-rw-r--  1 root root     10007 Dec 10 17:35 server.properties
root@8de161ca6300:/work/bedrock-server#

bedrock_serverというサーバー本体のバイナリが確認できたので、起動に必要なライブラリが揃っているかlddコマンドで確認します。

root@8de161ca6300:/work/bedrock-server# ldd bedrock_server
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ffff54fe000)
        libcurl.so.4 => /lib/x86_64-linux-gnu/libcurl.so.4 (0x00007ffff544f000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ffff5370000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007ffff5350000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007ffff534b000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffff516a000)
        /lib64/ld-linux-x86-64.so.2 (0x00007ffffffcc000)
        librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007ffff5163000)
        libnghttp2.so.14 => /lib/x86_64-linux-gnu/libnghttp2.so.14 (0x00007ffff5134000)
        libidn2.so.0 => /lib/x86_64-linux-gnu/libidn2.so.0 (0x00007ffff5103000)
        librtmp.so.1 => /lib/x86_64-linux-gnu/librtmp.so.1 (0x00007ffff50e4000)
        libssh2.so.1 => /lib/x86_64-linux-gnu/libssh2.so.1 (0x00007ffff50a3000)
        libpsl.so.5 => /lib/x86_64-linux-gnu/libpsl.so.5 (0x00007ffff508f000)
        libssl.so.3 => /lib/x86_64-linux-gnu/libssl.so.3 (0x00007ffff4fe4000)
        libcrypto.so.3 => /lib/x86_64-linux-gnu/libcrypto.so.3 (0x00007ffff4b5e000)
        libgssapi_krb5.so.2 => /lib/x86_64-linux-gnu/libgssapi_krb5.so.2 (0x00007ffff4b0b000)
        libldap-2.5.so.0 => /lib/x86_64-linux-gnu/libldap-2.5.so.0 (0x00007ffff4aac000)
        liblber-2.5.so.0 => /lib/x86_64-linux-gnu/liblber-2.5.so.0 (0x00007ffff4a9c000)
        libzstd.so.1 => /lib/x86_64-linux-gnu/libzstd.so.1 (0x00007ffff49e0000)
        libbrotlidec.so.1 => /lib/x86_64-linux-gnu/libbrotlidec.so.1 (0x00007ffff49d1000)
        libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007ffff49b2000)
        libunistring.so.2 => /lib/x86_64-linux-gnu/libunistring.so.2 (0x00007ffff47fc000)
        libgnutls.so.30 => /lib/x86_64-linux-gnu/libgnutls.so.30 (0x00007ffff45e0000)
        libhogweed.so.6 => /lib/x86_64-linux-gnu/libhogweed.so.6 (0x00007ffff4597000)
        libnettle.so.8 => /lib/x86_64-linux-gnu/libnettle.so.8 (0x00007ffff4547000)
        libgmp.so.10 => /lib/x86_64-linux-gnu/libgmp.so.10 (0x00007ffff44c6000)
        libkrb5.so.3 => /lib/x86_64-linux-gnu/libkrb5.so.3 (0x00007ffff43ec000)
        libk5crypto.so.3 => /lib/x86_64-linux-gnu/libk5crypto.so.3 (0x00007ffff43bf000)
        libcom_err.so.2 => /lib/x86_64-linux-gnu/libcom_err.so.2 (0x00007ffff43b9000)
        libkrb5support.so.0 => /lib/x86_64-linux-gnu/libkrb5support.so.0 (0x00007ffff43a9000)
        libsasl2.so.2 => /lib/x86_64-linux-gnu/libsasl2.so.2 (0x00007ffff438c000)
        libbrotlicommon.so.1 => /lib/x86_64-linux-gnu/libbrotlicommon.so.1 (0x00007ffff4369000)
        libp11-kit.so.0 => /lib/x86_64-linux-gnu/libp11-kit.so.0 (0x00007ffff4235000)
        libtasn1.so.6 => /lib/x86_64-linux-gnu/libtasn1.so.6 (0x00007ffff4220000)
        libkeyutils.so.1 => /lib/x86_64-linux-gnu/libkeyutils.so.1 (0x00007ffff4217000)
        libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007ffff4206000)
        libffi.so.8 => /lib/x86_64-linux-gnu/libffi.so.8 (0x00007ffff41fa000)
root@8de161ca6300:/work/bedrock-server#

必要なライブラリも揃っていることが確認できました。

Bedrockサーバーの起動

コンテナ内でBedrockサーバーが起動できるか試します。

root@8de161ca6300:/work/bedrock-server# ./bedrock_server
NO LOG FILE! - setting up server logging...
[2024-12-22 02:56:52:683 INFO] Starting Server
[2024-12-22 02:56:52:683 INFO] Version: 1.21.51.02
[2024-12-22 02:56:52:683 INFO] Session ID: 8fc0339d-ce9d-420b-84bf-5b0392cb06c1
[2024-12-22 02:56:52:683 INFO] Build ID: 29823500
[2024-12-22 02:56:52:683 INFO] Branch: r/21_u5
[2024-12-22 02:56:52:683 INFO] Commit ID: 15737c809ed75cbc4a361ffa3c5c2df76ff78d42
[2024-12-22 02:56:52:683 INFO] Configuration: Publish
[2024-12-22 02:56:52:686 INFO] Level Name: Bedrock level
[2024-12-22 02:56:52:689 INFO] No CDN config file found for dedicated server
[2024-12-22 02:56:52:690 INFO] Game mode: 0 Survival
[2024-12-22 02:56:52:690 INFO] Difficulty: 1 EASY
[2024-12-22 02:56:52:697 INFO] Content logging to console is enabled.
[2024-12-22 02:56:52:953 INFO] Opening level 'worlds/Bedrock level/db'
[2024-12-22 02:56:53:150 INFO] [SERVER] Pack Stack - None
[2024-12-22 02:56:54:409 INFO] IPv4 supported, port: 19132: Used for gameplay and LAN discovery
[2024-12-22 02:56:54:409 INFO] IPv6 supported, port: 19133: Used for gameplay
[2024-12-22 02:56:54:443 INFO] Server started.
[2024-12-22 02:56:54:443 INFO] ================ TELEMETRY MESSAGE ===================
[2024-12-22 02:56:54:443 INFO] Server Telemetry is currently not enabled.
[2024-12-22 02:56:54:443 INFO] Enabling this telemetry helps us improve the game.
[2024-12-22 02:56:54:443 INFO]
[2024-12-22 02:56:54:443 INFO] To enable this feature, add the line 'emit-server-telemetry=true'
[2024-12-22 02:56:54:443 INFO] to the server.properties file in the handheld/src-server directory
[2024-12-22 02:56:54:443 INFO] ======================================================

気になるメッセージがいくつかでていますが、サーバーのプロセスは無事に起動しました。

Bedrockサーバーへの接続

MinecraftクライアントからBedrockサーバーへ接続できるか確認します。

動作確認にはiOS版のMinecraftを使用します。アプリを起動し「プレイ」ボタンをタップ後、「フレンド」タブをタップします。

すると「LAN ゲーム」の項目に「Dedicated Server」が表示されます。しばらく待っても表示されない場合は、ファイアウォールやDockerのネットワークを見直しましょう。

The Dedicated Server is displayed on the screen.
Bedrockサーバーが表示される

次に、表示された「Dedicated Server」をタップしてコンテナに接続します。こちらも上手く接続できました。

Successfully connected to the Bedrock Server container.
Bedrockサーバーのコンテナへの接続が成功

接続の確認ができたらゲームを終了します。コンテナ側の標準出力には、以下のようなメッセージが表示されます。

[2024-12-22 03:03:18:985 INFO] Player connected: takenorio, xuid: ****************
[2024-12-22 03:03:22:794 INFO] Player Spawned: takenorio xuid: ****************, pfid: ****************
[2024-12-22 03:04:12:626 INFO] Player disconnected: takenorio, xuid: ****************, pfid: ****************

Bedrockサーバーを停止し、exitコマンドでコンテナも終了します。

^C
root@8de161ca6300:/work/bedrock-server# exit
exit

まとめ

作業用コンテナ上のBedrockサーバーにMinecraftのアプリケーションから接続できることを確認しました。

次回は作業用コンテナの動作確認結果を元にDockerfileを作成します。