今回は、Java版と統合版(Switch等)でクロスプレイができるMinecraftサーバーを構築した。
単にマイクラを動かすだけならOSに直接Javaを入れるのが早いが、情報系の学生として、今後の個人開発や研究にも使える「自分専用の拡張可能なインフラ」にしたかった。
そこで、以下の要件を満たすため、ProxmoxとDockerを組み合わせた仮想化構成を採用した。
- ホストOSを絶対に汚さない(環境破壊を防ぐ)
- 他のサービスと完全に分離する
- トラブル時に一瞬でロールバックできる
本記事では、構築の全体像はもちろん、実際に直面した「LXC特有の設定の罠」や「ヘアピンNAT」といった躓きポイントも解説していく。これから自宅サーバーを構築する方の参考になれば幸いである。
システム構成と前提条件
本環境を構築するにあたり、ベースとなるハードウェアとソフトウェアの構成は以下の通りである。
ハードウェア構成
自宅に余っていたPCパーツなどを活用し、以下のスペックでサーバーを組み上げた。
| パーツ | スペック |
| CPU | AMD Ryzen 5 3600 (6コア/12スレッド) |
| メモリ | DDR4 16GB |
| ストレージ | M.2 NVMe SSD 500GB |
もし手元に余っているPCがない場合は、Amazonで3~5万円台で買えるIntel N100搭載のミニPCなどが、省電力かつProxmoxの入門機として非常に人気でおすすめである。
ソフトウェア構成
OSを直接インストールするのではなく、Proxmoxを用いた仮想化環境を土台とする。
| 役割 | ソフトウェア |
| ハイパーバイザ (ホストOS) | Proxmox VE 9.1 |
| コンテナOS (LXC) | Ubuntu 24.04 |
| ミドルウェア | Docker / Docker Compose |
| マイクラサーバーソフト | PaperMC (動作が軽くプラグインが使用可能) |
| クロスプレイ用プラグイン | GeyserMC / Floodgate |
前提とするネットワーク環境
本記事の手順を進めるにあたり、以下のネットワーク環境が整っていることを前提とする。
- LAN内でUbuntuコンテナのIPアドレスを固定できること
- ルーターの設定(ポート転送など)を用いて、外部へネットワークを公開できる環境であること
Step0: Proxmox VEのインストール

この記事では割愛する。詳しくは別のサイトを参照してほしい。
LAN内の別のPCから、ブラウザでWEBインターフェースにアクセスできればOKである。以下、WEBインターフェース上で操作していく。
Step1: Proxmox上でのLXC(コンテナ)作成
Proxmox上で仮想環境を立ち上げる際、完全な仮想マシン(VM)ではなく、軽量でホストとカーネルを共有するLXC(Linuxコンテナ)を採用する。これにより、オーバーヘッドを最小限に抑え、マイクラサーバーへ最大限のパフォーマンスを割り当てることが可能になる。
テンプレートのダウンロード
まずはベースとなるOSのイメージを用意する。

- Proxmox管理画面の左メニューから、ローカルストレージを選択する。
- 「CT Templates」を開き、「Templates」をクリックする。
- リストの中から「ubuntu」と検索し、好きなバージョンをダウンロードする。
コンテナ(CT)の作成とリソース割り当て
画面右上の「Create CT」ボタンから、ウィザードに従って設定を進めていく。
General

- Hostname: 任意の名前を入力(例: mc-server)。
- Unprivileged container / Nesting: チェックを入れたままでOK。
- Password: rootユーザーのパスワードを設定。
Template

先程ダウンロードしたUbuntuのテンプレートを選択する。
Disks

16~32GBを指定する。プラグインの導入に備えて余裕を持たせておく。
CPU

2~4コアを割り当てる。マイクラサーバー程度であればこれでも十分。
Memory

- Memory (MiB): 8196MB程度割り当てる。もちろんメモリに余裕があるなら更に多くてもOK。
- Swap (MiB): 512MBのままで問題ない。
Network

- IPv4: Staticを選択。
- IPv4/CIDR: マイクラサーバーに割り当てたい固定IPアドレスを指定する。スラッシュの後ろまで入力が必要。
- Gateway (IPv4): ルーターなどゲートウェイのIPアドレスを指定する。
Confirm

設定が合っていることを確認して、「Finish」をクリックする。
LXCが作成され始めるのでしばらく待つ。
Step2: 初回起動とDockerの導入
初回起動
無事LXCが作成できたらいよいよ起動する。


「Start」ボタンを押して起動した後、「Console」タブからログインする。ユーザー名はroot、パスワードは先程設定したものを入力してEnterキーを押す。パスワードは入力しても表示はされないので注意。
パッケージのアップデート
まずはシステムのパッケージ一覧を最新状態にし、インストール済みのソフトウェアをアップグレードしておく。
apt update && apt upgrade -yDockerのインストール
DockerのインストールにはGPGキーの追加などめんどくさい手順があるが、公式がインストールスクリプトを用意してくれているのでそれを使う。
wget -qO- https://get.docker.com | sh動作確認
インストールが完了したら、正しくコマンドが通るかバージョンを確認する。
docker version
docker compose versionここでそれぞれバージョン情報が返ってくれば、導入は成功である。
Step3: マイクラサーバー(PaperMC)の構築
Dockerの準備が整ったら、いよいよマイクラサーバー本体を立ち上げる。 今回は、動作が軽量でプラグインが使える「PaperMC」を採用し、Java版と統合版(スマホ・Switch等)のクロスプレイ環境を構築していく。
PCでガッツリ遊ぶならJava版、ベッドに寝転がりながら手軽に遊ぶならSwitch版など、プラットフォームの垣根を越えてプレイスタイルを自由に選べるのがクロスプレイ最大の魅力である。
Dockerを使用する最大のメリットは、環境構築が設定ファイル(docker-compose.yml)1つで完結し、不要になればフォルダごと消すだけで跡形もなくクリーンに撤去できる点にある。
作業ディレクトリとdocker-compose.ymlの作成
まずはマイクラのデータ一式を保存するための専用ディレクトリを作成する。
次に、移動した後docker-compose.ymlファイルを作成する。
mkdir -p ~/minecraft/data
cd ~/minecraft
nano docker-compose.yml以下の内容をコピーして貼り付ける。今回はマイクラサーバーのコンテナとして、デファクトスタンダードとなっているitzg/minecraft-serverイメージを利用する。
services:
mc:
image: itzg/minecraft-server
tty: true
stdin_open: true
ports:
- "25565:25565" # Java版のデフォルトポート
- "19132:19132/udp" # 統合版(スマホ・Switch等)のデフォルトポート
environment:
EULA: "TRUE" # 利用規約への同意
TYPE: "PAPER" # サーバーの種類(PaperMC)
VERSION: "LATEST" # マイクラのバージョン
MEMORY: "7G" # メモリ割り当て(超重要)
volumes:
- ./data:/data
restart: unless-stopped
保存して閉じる。
サーバーの起動とプラグインの導入
設定ファイルを保存したら、以下のコマンドでコンテナをバックグラウンド起動する。
docker compose up -d
docker compose logs -f初回起動時は、必要なデータのダウンロードとワールドの生成が行われるため数分かかる。ログを確認し、「Done」という文字が表示されれば起動完了だ。
起動が確認できたら一度サーバーを停止して、クロスプレイを実現するためのプラグインをダウンロードする。
docker compose down
cd ~/minecraft/data/plugins
wget https://download.geysermc.org/v2/projects/geyser/versions/latest/builds/latest/downloads/spigot -O Geyser-Spigot.jar
wget https://download.geysermc.org/v2/projects/floodgate/versions/latest/builds/latest/downloads/spigot -O Floodgate-Spigot.jar
ダウンロードが完了したら再度サーバーを起動する。
cd ~/minecraft
docker compose up -dこれでサーバー内部の準備はすべて完了した。
この段階でローカルネットからサーバーのIPアドレスを指定するとアクセスできるはずである。
Step4: ネットワーク設定
サーバーが無事に起動し、ローカルネットワーク(自宅のWi-Fi等)から接続して遊べるようになったら、次はいよいよ外部の友人を招き入れるためのネットワーク設定を行う。
ここで直面するのが、「ポート開放」と「ヘアピンNAT」という2つの大きな壁である。
ルーターのポート開放(ポートフォワーディング)
外部から自宅のネットワーク内にあるLXC(マイクラサーバー)へ通信を通すため、家庭用ルーターの管理画面から設定を行う。
転送先のIPアドレスには、今回作成したLXCのローカルIP(例:192.168.11.101)を指定し、以下の2つのルールを作成する。
| バージョン | ポート | プロトコル |
|---|---|---|
| Java版 | 25565 | TCP |
| 統合版 | 19132 | UDP |
統合版のプロトコルは「UDP」である。ここをTCPにしてしまい、スマホ勢が接続できないというのは非常によくあるミスなので注意が必要だ。
設定後、スマホのWi-Fiを切り、4G/5G回線から接続テストを行って繋がれば成功である。
なお、サーバーの安定稼働にはルーターの処理能力と有線LAN接続が欠かせない。この機会にルーターとLANケーブルを新品に買い替えるのも一つの手である。
ヘアピンNATについて
自宅のWi-Fiに繋いだスマホから、自宅のグローバルIP宛てにアクセスして家の中に戻ってくる通信(ヘアピンNAT / NATループバック)は、ルーターが遮断してしまうことがある。
この場合、ルータの設定からヘアピンNATを有効化することで解決できるが、項目が存在しないこともある。諦めてモバイル回線を使ってテストしよう。
Proxmox自体の外部アクセスについて
マイクラのポートは開放したが、Proxmoxの管理画面(ポート8006番)は絶対にルーターで開放してはいけない。世界中からの攻撃の的になってしまうためだ。
外出先からサーバーのメンテナンスを行いたい場合は、別途「Tailscale」などのVPNを導入し、安全なトンネル経由でアクセスする構成を強く推奨する。
おわりに
本記事では、ProxmoxのLXCとDockerを組み合わせ、ホスト環境を汚さないMinecraftクロスプレイサーバーを構築した。
実際に稼働させているが、LXCの低オーバーヘッドのおかげで非常に快適に動作している。不要になれば丸ごと消去できる手軽さはコンテナ化ならではの最大のメリットである。
自宅にProxmoxが1台あれば、遊びからインフラ学習まで活用幅は無限に広がる。本記事が、モダンな自宅サーバー運用を目指す方の参考になれば幸いである。
参考文献









コメント