前回に引き続き、Docker環境でMinecraftサーバを建てた記事の続きです。
前回の記事では、仮想マシンとしてDockerホストを構築し、Docker環境が動作するところまでを確認しました。
今回は、続きとしてMinecraftサーバの起動と各種プラグインの導入まで行います。
前編:Dockerホスト構築編
後編:Minecraftコンテナ構築編
Minecraftサーバのコンテナ群を準備する
起動するdockerコンテナの構成
今回、Minecraftサーバを建てるにあたって、Dockerホスト上に3つのDockerコンテナを建てます。itzg/minecraft-server
itzg/minecraft-server - Docker Image | Docker Hub
Minecraft向けのDockerイメージとしては最も有名かつ安定していると思われるイメージです。
起動時に渡す環境変数を変更することにより、バニラ版のMinecraftサーバの他にBukkitやSpigot、Paperなど各種MOD版サーバを立ち上げることが可能です。
また、各MODサーバで利用可能なプラグインについても、ダウンロードURLや配布サイトのIDを指定しておくことにより、自動でダウンロード・展開されるためサーバー再構築時におけるプラグインの取得漏れなども防ぐことが出来ます。
サーバーバージョンを明示的に指定しない設定にした場合、常に最新版のサーバが検索されて更新されるため、バージョンアップ時の手動でのダウンロードやビルドなどが不要となる点でも非常にメンテナンスが楽となっています。
今回、Dockerホスト上にマウントした別のVMFS(仮想ストレージ)のディレクトリをボリュームマウントし、Minecraftのサーバデータを保管することとしました。
(OS領域と分けることで、データ領域のみの拡張・移行などが容易となるため)
itzg/mc-backup
itzg/mc-backup - Docker Image | Docker Hub
上記のMinecraftサーバ用Dockerイメージと同じ作者によるイメージで、Minecraftサーバを外部からバックアップすることが出来ます。(いわゆるサイドカー構成)
コンテナ内では一定間隔でスクリプトが回っており、rcon経由でサーバ内をsave-allし、その瞬間のデータをtar形式で取得し、設定したディレクトリ内に日付・時間を付与してバックアップします。
今回、コンテナに直接NFSストレージ領域をマウントし、NFSサーバ上にファイルを保管することとしました。
prometheus/node-exporter
prometheus/node-exporter · Quay
こちらは必須なコンテナではありませんが、サーバを動作させているDockerホストのメトリクス情報(CPU使用率、メモリ使用量、ネットワーク・ディスク負荷など)を取得し、サーバが正常に動作しているか監視するために利用します。
別途用意したPrometheusサーバや可視化ツールのGrafanaと連携することにより、サーバステータスをリアルタイムに監視することが可能となります。
今回、こちらのコンテナのみ別枠で個別に起動したため、docker-compose.ymlには含めていませんが、含めてしまって一括起動するという手もありです。
docker-compose.ymlを準備する
上記のDockerコンテナを一括管理するため、docker-composeを利用したコンテナの設定を行います。
今回は、下記のようなdocker-compose.ymlを作成しました。
内容について、個々に修正が必要な箇所を紹介します。
minecraft: ports
Minecraftサーバコンテナで開放するポートをマッピングします。
今回は、Minecraftが標準で利用する 25565 ポートの他に以下のポートをマッピングしています。
- リモートからのrconで利用する 25575 ポート
- GeyserMC, floodgate経由でコンソール版Minecraftとクロスプレイをする際に利用する UDP の 19132 ポート
- 地図プラグインであるDynmapが利用する 8123 ポート
- PrometheusサーバがPrometheus Exporterプラグインに対してアクセスする際に利用する 9225 ポート
この他、各自で利用するプラグインによっては追加でのポートマッピングが必要となる場合がありますので、必要に応じて追加・削除をする必要があります。
minecraft: environment
今回利用するDockerイメージの特徴の一つが、このenvironmentを利用した各種設定の自動化です。
- EULA=TRUE【必須】
- サーバの起動時にはEULAの同意が必要であるためTRUEを指定
- TYPE=SPIGOT【任意】
- MOD版サーバを利用する場合は、MODサーバ種別を指定
- SEED=1234567890【任意】
- 新規ワールド生成時のシード値
- MEMORY=8G【任意】
- コンテナが利用するメモリの上限値、ホストのメモリ以上の指定は危険
- LOG_TIMESTAMP=TRUE【任意】
- TRUEにすると、起動時のログにもタイムスタンプが付くため再起動の時間がわかりやすくなる
- SPIGET_RESOURCES=274,8631【任意】
- Spigot用のプラグインについて、https://www.spigotmc.org/resources/~~~ といったURL末尾に付与されるID番号を指定することで、自動でプラグインをダウンロード・配置できる
- 上記の場合、274はDynmap、8631はCoreProtectとなる
- Spigotのページから別サイトに飛んでDLするタイプの
- MODS_FILE=/extra/mods.txt【任意】
- 指定したファイルにプラグインのjarファイルがダウンロードできるURLを記載しておくことで、サーバ起動時に自動でダウンロード・配置される
- /extra/mods.txt はボリュームマウントでReadOnlyマウントすると良い
- REMOVE_OLD_MODS=FALSE【任意】
- TRUEにすると、サーバを再起動するたびに/pluginsフォルダを真っ更にする
- 作っては破壊するような用途のサーバ以外ではFALSEにする方が良い
- ただし、プラグインの更新があった場合などは手動でケアが必要になる
minecraft: volumes
Minecraftのサーバデータが配置されるフォルダとして、/dataを任意のフォルダにマウントしています。
中のファイルを手で触る予定があまりないのであれば、名前付きボリュームなどでも大丈夫なはずです。
また、environmentで MODS_FILE を指定している場合は、そのファイルもここでマウントしておくのがオススメです。
backup: volumes
バックアップ用のコンテナにマウントするフォルダを指定します。
/dataにはMinecraftコンテナ側で指定している/dataと同じ領域を指定する必要がある溜め、上記で名前付きボリュームとした場合は同名を指定します。
/backupsにはバックアップ先のフォルダを指定しますが、サンプル例ではNFSマウントとしています。(名前付きボリュームをNFSマウントしている)
mods.txtを準備する
MODS_FILEを利用しているため、mods.txtにダウンロードするプラグインを記載しておきます。
今回は、Multiverse系のファイルと、Promtetheus-Exporter、LuckPerms、GeyserMC、Floodgateなどをダウンロードするように指定しました。
latestとして指定しているものについては、サーバを再起動する際に常に最新版がチェックされます。
Minecraftサーバコンテナを起動する
Dockerコンテナを一括起動する
準備が完了したら、docker-compose.ymlが配置されたフォルダ内で以下のコマンドを叩き、コンテナを起動します。
$ docker-compose up -d ; docker-compose logs -f
-dをつけてupすることにより、サービスとしてバックグラウンド起動することが出来ます。
ただし、その場合起動ログなどの標準出力内容が確認できなくなってしまうため、セミコロンで区切られた後半の logs -f でログをリアルタイムに確認します。
minecraft-minecraft-1 | [init] 2022-08-01 09:55:12+00:00 Running as uid=1000 gid=1000 with /data as 'drwxrwxr-x 12 1000 1000 4096 Aug 1 09:53 /data'
minecraft-minecraft-1 | [init] 2022-08-01 09:55:13+00:00 Resolved version given LATEST into 1.19.1 and major version 1.19
minecraft-minecraft-1 | [init] 2022-08-01 09:55:13+00:00 Resolving type given SPIGOT
minecraft-minecraft-1 | [init] 2022-08-01 09:55:15+00:00 Downloading Spigot from https://download.getbukkit.org/spigot/spigot-1.19.1.jar ...
minecraft-minecraft-1 | [init] 2022-08-01 09:55:15+00:00 Getting plugins via Spiget
minecraft-minecraft-1 | [init] 2022-08-01 09:55:15+00:00 Downloading resource 274 ...
minecraft-minecraft-1 | [init] 2022-08-01 09:55:15+00:00 resource '274' not checked because version meta file newer than '5' minutes
minecraft-minecraft-1 | [init] 2022-08-01 09:55:15+00:00 Downloading resource 8631 ...
minecraft-minecraft-1 | [init] 2022-08-01 09:55:15+00:00 resource '8631' not checked because version meta file newer than '5' minutes
minecraft-minecraft-1 | [init] 2022-08-01 09:55:32+00:00 server.properties already created, skipping
minecraft-minecraft-1 | [init] 2022-08-01 09:55:33+00:00 Checking for JSON files.
minecraft-minecraft-1 | [init] 2022-08-01 09:55:34+00:00 Setting initial memory to 12G and max to 12G
minecraft-minecraft-1 | [init] 2022-08-01 09:55:34+00:00 Starting the Minecraft server...
ログが出力され、「Starting the Minecraft server...」となると、各種プラグインの配置などが開始されてサーバの起動が開始されます。
初回起動時はプラグインのダウンロードの他、ワールド生成が発生するため時間がかかりますので、ログを眺めながら起動完了を待ちましょう。
minecraft-minecraft-1 | [09:56:32] [Server thread/INFO]: Done (47.338s)! For help, type "help"
minecraft-minecraft-1 | [09:56:32] [Server thread/INFO]: Starting remote control listener
minecraft-minecraft-1 | [09:56:32] [Server thread/INFO]: Thread RCON Listener started
minecraft-minecraft-1 | [09:56:32] [Server thread/INFO]: RCON running on 0.0.0.0:25575
上記の表示(Done!の部分)が出れば起動完了です。
また、合わせてbackup用のコンテナが起動していることも確認できると思います。
minecraft-backup-1 | 2022-08-13T07:32:57+0000 INFO waiting initial delay of 2m...
minecraft-backup-1 | 2022-08-13T07:34:57+0000 INFO waiting for rcon readiness...
minecraft-backup-1 | 2022-08-13T07:34:57+0000 INFO Command executed successfully rcon-cli save-on
minecraft-backup-1 | 2022-08-13T07:34:57+0000 INFO Command executed successfully rcon-cli save-off
minecraft-backup-1 | 2022-08-13T07:34:57+0000 INFO Command executed successfully rcon-cli save-all flush
minecraft-backup-1 | 2022-08-13T07:34:57+0000 INFO Command executed successfully sync
minecraft-backup-1 | 2022-08-13T07:34:57+0000 INFO Backing up content in /data to /backups/world-20220813-073457.tgz
Minecraftサーバに接続してみる
起動が完了したら、DockerホストのIPアドレス宛にサーバ接続してみます。
無事接続できれば、起動成功です。
接続できない場合
Dockerホストのファイアウォールで止まっている
Dockerホストとして利用しているPhoton OSでは、デフォルトでiptablesによるファイアウォールが有効になっています。
必要に応じてファイアウォールの穴あけが必要となります。
特に、外部からの接続が必要となる 25565/tcp や 19132/udp などは必須で開ける必要があります。
$ sudo iptables -A INPUT -p tcp --dport 25565 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 25575 -j ACCEPT
$ sudo iptables -A INPUT -p udp --dport 19132 -j ACCEPT
Dockerコンテナのポートマッピングが間違っている
docker-compose.ymlに記載する ports は {ホスト側ポート}:{コンテナ側ポート} です。
事情により25565以外のポートを使いたい場合で変更している場合や、そもそも入力ミスしている場合など気をつけてください。
コンテナが起動できていない
何らかのエラーなどによりコンテナが終了していないか確認してください。
以下のコマンドでDockerコンテナのステータスを確認できます。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bfaf54094e96 itzg/mc-backup "/usr/bin/backup loop" 3 days ago Up 3 days minecraft-backup-1
4e97550cd75e itzg/minecraft-server "/start" 2 weeks ago Up 3 days (healthy) 0.0.0.0:8123->8123/tcp, :::8123->8123/tcp, 0.0.0.0:9225->9225/tcp, :::9225->9225/tcp, 0.0.0.0:25565->25565/tcp, :::25565->25565/tcp, 0.0.0.0:25575->25575/tcp, :::25575->25575/tcp, 0.0.0.0:19132->19132/udp, :::19132->19132/udp minecraft-minecraft-1
itzg/minecraft-serverのコンテナのSTATUSが「Up N days」となっていることを確認してください。
DownやExitedとなっている場合は、何らかの理由でコンテナが終了してしまっています。
docker-compose logs | less などを駆使して原因を探る必要があります。
まとめ
後編となったDocker設定編はボリューミーな内容となってしまいましたが、手動での準備と比較して簡単にMinecraftサーバが構築できるのではないか、と思います。
敢えてDocker環境で構築するメリットとしては以下のようなことが考えられます。
- サーバ側はdokcer-compose.ymlとmods.txtのメンテナンスのみで良い
- docker-compose.ymlとmods.txtを保管しておけばサーバ再構築が容易
- 全く同じ構成で別のサーバを建てたい場合に横展開が容易
- サーバが不要になった場合、docker-compose downするだけで破壊可能
特に、2と3は非常にdockerらしい部分かなと考えています。
4についてはVMで建てている場合はVMの停止でも同様ですが、複数用途で使ってしまっているVMの場合は難しいこともあるため、docker特有のメリットが出ていると思われます。
作るだけなら無料で出来ますので、Dockerの実用的な勉強がてら作ってみるのもいかがでしょうか。
(逸般の誤家庭ならDockerホストくらいすぐ作れますよね?)