家庭内マイクラサーバにDocker導入

先日公開された洞窟アップデートを適用するときにちょっと困ったことが起こったので、その時の記録です。

自宅のマイクラサーバは目的の異なる2つのワールドが同居し稼働しています。一つは、Modと呼ばれるゲーム改造ツールを組み込みオリジナルにはない要素を追加し冒険を主軸にした「Mod環境」。もう一つは、建築したり農作業したりといった生活を中心に行う「まったり環境」といった感じです。

VerUp前

こんな環境を作って家族で遊んでいるのですが、先日配信された洞窟アップデートをまったり環境に適用しよう!ということになりました。

マイクラサーバは非常によくできていて、実行ファイルを新しいバージョンに差し替え再起動すれば、作ってきたワールドは、そのまま引き継がれ、冒険の進んでいない未知の世界に踏み込んだところから新要素が適用されるように作られています。

マイクラサーバを止め、サーバ実行ファイルを入れ替え再起動をかけたのですが、なにやらランタイムエラーを吐いて起動してくれませんでした。

まったり環境VerUp後

そこで公式のアップデート内容を調べてみると、今回のアップデートを正しく動作させるにはJava-16へバージョンアップが必要とありました。

Javaはそれなりに下位互換性を持っているから、Mod環境には影響ないだろうと思っていたので、サーバ内のJavaラインタイムを最新版であるJava-16へアップデートし、サーバを再起動。

起動したサーバ内の状況を確認すると、まったり環境は正常に起動してプレイヤーのログイン待ちになったのだけれど、Mod環境がランタイムエラーを吐き止まってしまいました。

JavaVerUp後

Mod環境のJavaランタイムエラーの内容を見てみると、マイクラサーバ内部で使用しているライブラリにバージョン依存があるようで、単純なアップデートでは解決できないようでした。

さて困った、どうしよう?

サーバをもう一台買い足すには小遣いが足らない。かといって一つサーバに異なるバージョンのJavaをインストールするのも、イヤな感じがしてならない。サーバ環境を弄らずに、アプリ環境だけを自由に入れ替えできるものはないものか?と。

あれこれ悩んでいたのですが、ダメもとで気になっていた仮想環境を構築することのできるDockerを挟み、それぞれの環境をコンテナとして分離することを試してみることにしました。そもそもDockerは使ったことがないし、使い方も、構築の仕方もわからない。ネット記事を読み漁りながら、今回の用途に合いそうな構成で試してみることにしました。

・マイクラ実行環境はコンテナで分離
・マイクラサーバのDockerイメージは出来合いのものを使用
・ワールドやModのデータはコンテナからアクセスできる別の場所に保存
・環境ごとの接続要求は接続ポートで振り分け

Docker導入後

構成づくりでいくつかトラブルがあったものの、この構成で何とか両方の環境を立ち上げ、問題になっていたJavaのランタイムエラーも解消することができました。本来同居が難しいものがコンテナ化で同居できるなんてDockerスゲー。

遊べるようになったけれど新たな課題として、未知の世界に踏み込んだ時のワールド生成負荷が非常に重くコンテナが停止するケースがある。といったことが新たに判ってきました。まぁ、サーバPCが4世代Corei3だからってのもありますが… そういった負荷対策をどうするかが宿題かなと思います。