今すぐ実践!DockerでMCP Gatewayを動かす方法
はじめに
Minecraftサーバーの運営は、多岐にわたる技術的な知識を要求されることがあります。特に、複数のサーバーを統合したり、認証システムを強化したりする際には、プロキシサーバーの導入が不可欠です。本記事では、Minecraftサーバー向けの認証プロキシである「MCP Gateway」を、コンテナ仮想化技術のデファクトスタンダードである「Docker」を用いてデプロイし、運用する方法について、詳細かつ網羅的に解説します。
MCP Gatewayは、Minecraftサーバーの認証、IPフォワード、複数のサーバー間での切り替えなどを可能にする強力なツールです。通常、これを直接OS上にインストールして運用することも可能ですが、Dockerを利用することで、環境構築の手間を劇的に削減し、システムの可搬性(ポータビリティ)と再現性、そして隔離性を高めることができます。これにより、OSのバージョンや他のソフトウェアとの依存関係に悩まされることなく、クリーンで安定した環境でMCP Gatewayを動作させることが可能になります。
この記事は、以下の読者を対象としています。
- Minecraftサーバーの運営経験があり、より高度な設定や統合に興味がある方。
- Dockerの基本的な概念は理解しているが、実際のアプリケーションデプロイに応用したい方。
- MCP Gatewayの導入を検討しており、その最適なデプロイ方法を探している方。
- 既存のBungeeCordやVelocity環境に認証レイヤーを追加したい方。
約5000語のボリュームで、MCP Gatewayの基本的な概念から、Docker環境の構築、DockerfileとDocker Composeを用いた具体的なデプロイ手順、さらには高度な設定やトラブルシューティングまで、ステップバイステップで解説していきます。この記事を読み終える頃には、あなたはDocker上でMCP Gatewayを自在に操り、あなたのMinecraftサーバー環境をより堅牢で柔軟なものにすることができるでしょう。
さあ、DockerとMCP Gatewayの強力な組み合わせで、あなたのMinecraftサーバー環境を次のレベルへと引き上げましょう!
1. MCP Gatewayとは?
MCP Gatewayは、Minecraftサーバーのための高機能な認証プロキシサーバーです。Minecraftプレイヤーがサーバーに接続する際、彼らの接続要求はまずMCP Gatewayによって受け付けられ、そこで様々な処理が行われます。これにより、通常のMinecraftサーバーでは実現が難しい、高度な機能やセキュリティ対策を導入することが可能になります。
1.1. MCP Gatewayの目的と主な機能
MCP Gatewayの主な目的は、MinecraftクライアントとバックエンドのMinecraftサーバー(またはBungeeCord/Velocityなどのプロキシ)の間に位置し、以下の機能を提供することです。
- 認証プロキシ: Minecraftのオンラインモード認証(Mojang/Microsoftアカウントによる認証)を代行し、有効なプレイヤーのみをサーバーに接続させることができます。これにより、正規のユーザーのみがアクセスできるようになり、セキュリティが向上します。オフラインモードでの運用も可能です。
- IPフォワード: クライアントの実際のIPアドレスをバックエンドサーバーに転送します。BungeeCordやVelocityのようなプロキシサーバーを使用している場合、通常はプロキシサーバーのIPアドレスしかバックエンドサーバーには見えませんが、MCP GatewayのIPフォワード機能を使えば、元のクライアントIPを正しく取得できるようになります。これは、IPベースのプラグイン(例:IPアドレスによるBAN、国別制限など)を使用する際に非常に重要です。
- サーバー切り替え: 複数のMinecraftサーバーを所有している場合、MCP Gatewayはそれらすべてを単一のエントリポイント(ゲートウェイポート)で公開し、プレイヤーの接続先を制御できます。例えば、特定のプレイヤーを特定のサーバーにリダイレクトしたり、負荷分散のために接続先を自動的に選択させたりすることが可能です。
- ホワイトリスト/ブラックリスト: 特定のプレイヤー名やUUID、IPアドレスに基づいて、接続を許可または拒否することができます。
- DNSクエリ: 接続先のサーバーアドレスをDNSクエリで解決する機能を持つため、動的なサーバーアドレス設定に対応できます。
- 接続制限とレートリミット: DDoS攻撃などからサーバーを保護するため、1つのIPアドレスからの同時接続数や短時間での接続試行回数を制限する機能も備えています。
- カスタマイズ可能な応答: 認証失敗時や接続拒否時など、特定の状況下でクライアントに表示するメッセージをカスタマイズできます。
1.2. なぜMCP Gatewayが必要か?
多くのMinecraftサーバー運営者にとって、MCP Gatewayは以下のような理由で非常に有用です。
- 複数サーバーの統合: RPGサーバー、PVPサーバー、ミニゲームサーバーなど、複数のMinecraftサーバーを運営している場合、プレイヤーはそれぞれのサーバーに異なるIPアドレスで接続しなければなりません。MCP Gatewayを導入することで、プレイヤーは単一のIPアドレスに接続するだけで、そこから様々なバックエンドサーバーにアクセスできるようになります。これにより、プレイヤーの利便性が向上し、サーバー管理も一元化されます。
- BungeeCord/Velocityとの連携: 多くの大規模サーバーネットワークでは、BungeeCordやVelocityのようなプロキシサーバーが使用されています。これらはサーバー間の接続をスムーズにし、ロビーシステムなどを提供しますが、標準ではクライアントのIPアドレスをバックエンドサーバーに転送しません。MCP GatewayのIPフォワード機能は、この問題を解決し、バックエンドサーバーのプラグインが正確なクライアントIPを利用できるようにします。また、BungeeCord/Velocityの前に置くことで、認証レイヤーを強化したり、特定のプレイヤーグループを事前にフィルタリングしたりすることも可能です。
- セキュリティの強化: オンラインモード認証を強制することで、不正なクライアント(海賊版)の接続をブロックし、正規のユーザーのみを許可します。これは、サーバーのセキュリティと公平性を保つ上で非常に重要です。また、接続制限機能は、悪意ある接続試行や一部のDDoS攻撃に対する第一線の防御となります。
- メンテナンスと柔軟性: MCP Gatewayを使用すると、バックエンドサーバーのメンテナンス中に、プレイヤーを一時的にメンテナンスサーバーにリダイレクトしたり、ダウンタイムなしでサーバーを切り替えたりする柔軟性が得られます。
MCP Gatewayは、その名の通り「ゲートウェイ」として機能し、Minecraftサーバーの運用をより効率的で安全、かつ柔軟なものにするための重要なコンポーネントとなり得ます。
2. Dockerとは?
Dockerは、アプリケーションとその依存関係を「コンテナ」と呼ばれるポータブルで自己完結型のパッケージにまとめ、分離された環境で実行するためのオープンソースプラットフォームです。これにより、開発環境と本番環境の差異に起因する問題を減らし、アプリケーションのデプロイ、スケーリング、管理を簡素化できます。
2.1. コンテナ技術の基本
コンテナは、アプリケーションを実行するために必要なすべてのもの(コード、ランタイム、システムツール、ライブラリ、設定など)をパッケージ化したものです。OSのカーネルを共有しつつ、ユーザー空間は完全に隔離されます。
- イメージ: コンテナを作成するための設計図であり、実行可能なソフトウェアパッケージです。Docker Hubなどのレジストリから取得したり、
Dockerfile
というテキストファイルから自分でビルドしたりできます。 - コンテナ: イメージの実行可能なインスタンスです。コンテナは互いに分離されており、ホストシステムからも隔離されています。
2.2. 仮想マシンとの比較
Dockerコンテナはしばしば仮想マシン(VM)と比較されますが、両者には重要な違いがあります。
特徴 | Dockerコンテナ | 仮想マシン(VM) |
---|---|---|
構造 | OSのカーネルをホストと共有 | 各VMが完全なゲストOS(カーネルを含む)を持つ |
サイズ | 軽量(数十MB〜数百MB) | 重い(数GB〜数十GB) |
起動速度 | 数秒 | 数分 |
リソース | オーバーヘッドが非常に小さい | オーバーヘッドが大きい(各VMにCPU、メモリを割り当てる) |
可搬性 | 非常に高い(どこでも同じように動作) | 高い(イメージを移動可能だが、環境に依存する) |
隔離性 | プロセスレベルでの隔離(セキュリティはVMより劣る) | OSレベルでの完全な隔離(セキュリティが高い) |
コンテナは軽量で高速に起動するため、アプリケーションのデプロイやスケーリングに適しています。VMはより高いレベルの隔離とセキュリティが必要な場合に適していますが、リソースの消費が大きくなります。
2.3. Dockerを使うメリット
MCP GatewayのようなアプリケーションをDockerで動かすことには、多くのメリットがあります。
- ポータビリティ(可搬性): Dockerコンテナは、どこでも同じように動作します。開発者のPC、テスト環境、本番サーバーなど、異なる環境であっても「Dockerがインストールされていれば」同じように動作するため、「私の環境では動いたのに…」といった問題を回避できます。
- 再現性: Dockerfileを使用することで、コンテナがどのように構築されるかをコードとして定義できます。これにより、誰でも、いつでも、まったく同じ環境を再現できるようになります。
- 隔離性: 各コンテナは分離された環境で動作するため、MCP Gatewayが他のシステム上のソフトウェアと競合する心配がありません。また、MCP Gatewayが使用するライブラリや依存関係が、ホストシステムや他のアプリケーションに影響を与えることもありません。
- 簡単デプロイと管理: Docker Composeと組み合わせることで、MCP Gatewayとその依存関係(もしあれば)を単一のコマンドで起動、停止、管理できます。これにより、手動でのインストールや設定の手間が大幅に削減されます。
- リソース効率: VMに比べてオーバーヘッドが少ないため、より多くのアプリケーションを限られたハードウェアリソース上で実行できます。
- バージョン管理: Dockerイメージはタグ付けできるため、MCP Gatewayの特定のバージョンを簡単にデプロイしたり、以前のバージョンにロールバックしたりできます。
2.4. Dockerの基本コマンド
MCP GatewayをDockerで運用する際に必要となる主なコマンドを簡単に紹介します。
docker pull <image_name>:<tag>
: Docker HubなどのレジストリからDockerイメージをダウンロードします。docker build -t <image_name>:<tag> <path_to_dockerfile>
: 指定されたDockerfileから新しいDockerイメージをビルドします。-t
はタグ付け(名前付け)を行います。docker run -d -p <host_port>:<container_port> --name <container_name> <image_name>:<tag>
: Dockerイメージから新しいコンテナを起動します。-d
: バックグラウンドでコンテナを実行します(detached mode)。-p
: ホストOSのポートとコンテナのポートをマッピングします。--name
: コンテナにわかりやすい名前を付けます。
docker ps
: 実行中のコンテナ一覧を表示します。-a
オプションを付けると、停止中のコンテナも表示されます。docker logs -f <container_name_or_id>
: コンテナの標準出力(ログ)をリアルタイムで表示します。docker exec -it <container_name_or_id> <command>
: 実行中のコンテナ内でコマンドを実行します。-it
はインタラクティブシェルを開く際に使用します。docker stop <container_name_or_id>
: 実行中のコンテナを停止します。docker start <container_name_or_id>
: 停止中のコンテナを再開します。docker rm <container_name_or_id>
: コンテナを削除します(停止している必要がある)。docker rmi <image_name>:<tag>
: Dockerイメージを削除します。
これらのコマンドは、Dockerを使ったアプリケーション管理の基本となります。Docker Composeを使う場合は、これらのコマンドを直接使う機会は減りますが、内部的な動作を理解する上で重要です。
3. 動作環境の準備
MCP GatewayをDocker上で動作させるためには、いくつかの事前準備が必要です。ここでは、必要なソフトウェアのインストールと、ネットワーク設定について解説します。
3.1. OSの選択
Dockerは主要なOS(Linux, Windows, macOS)で動作しますが、本番環境での運用を考慮すると、Linuxを推奨します。LinuxはDockerのネイティブプラットフォームであり、リソース効率が高く、安定性に優れています。
- Linux (Ubuntu, CentOS, Debianなど): 最も推奨される環境です。特にサーバー用途ではUbuntu ServerやDebianがよく利用されます。
- Windows (WSL2 または Docker Desktop): Windows上でDockerを利用する場合、WSL2(Windows Subsystem for Linux 2)を有効にしてDocker Desktopをインストールするのが最もパフォーマンスが良い方法です。WSL2はLinuxカーネルをWindows上で動作させるため、Dockerの動作が非常に効率的になります。
- macOS (Docker Desktop): macOSもDocker Desktopをインストールすることで利用できます。Macユーザーは開発環境として手軽に利用できます。
本記事では、Linux環境を前提としたコマンド例を示しますが、Dockerの基本的な動作はOSに依存しません。
3.2. Dockerのインストール方法
各OSでのDockerのインストール方法を簡潔に紹介します。公式ドキュメントを参照するのが最も確実です。
3.2.1. Linux (Ubuntuの例)
Ubuntuでのインストールは、以下の手順で行います。他のLinuxディストリビューションでも、パッケージマネージャーが異なるだけで基本的な流れは同じです。
- 既存のDockerをアンインストール(初回インストール時は不要):
bash
sudo apt-get remove docker docker-engine docker.io containerd runc - 必要なパッケージをインストール:
bash
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release - DockerのGPGキーを追加:
bash
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg - Dockerリポジトリを追加:
bash
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null - Docker Engineをインストール:
bash
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin - (オプション)Dockerコマンドをsudoなしで実行できるようにする:
bash
sudo usermod -aG docker $USER
newgrp docker
この後、一度ログアウトして再ログインするか、newgrp docker
を実行すると、sudo
なしでdocker
コマンドを実行できるようになります。 - 動作確認:
bash
docker run hello-world
“Hello from Docker!”と表示されれば成功です。
3.2.2. Windows / macOS
Docker Desktopをダウンロードしてインストールします。
- Windows: Docker Desktop for Windows
- macOS: Docker Desktop for Mac
インストールウィザードに従うだけで、Docker EngineとDocker Composeプラグインが同時にインストールされます。Windowsでは、WSL2の有効化が求められる場合があります。
3.3. Docker Composeのインストール方法
Docker Composeは、複数のコンテナからなるアプリケーションを定義し、実行するためのツールです。Docker Desktopには標準で含まれていますが、Linux環境で個別にインストールする場合は以下の手順で行います。
Docker Compose V2 (Docker CLI Plugin) の場合:
Docker Engineのインストール時にdocker-compose-plugin
をインストールしていれば、docker compose
(スペースあり)として利用できます。これが最新の推奨される方法です。
例:docker compose up -d
Docker Compose V1 (スタンドアロンバイナリ) の場合:
古いバージョンを使用する場合は、Pythonのpipを使うか、直接バイナリをダウンロードします。
- バイナリをダウンロード:
bash
sudo curl -L "https://github.com/docker/compose/releases/download/v2.24.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
(バージョン番号は最新版に合わせて変更してください。最新版はGitHubのリリースページで確認できます。) - 実行権限を付与:
bash
sudo chmod +x /usr/local/bin/docker-compose - 動作確認:
bash
docker-compose --version
バージョン情報が表示されれば成功です。
本記事では、最新のdocker compose
(V2、スペースあり)を使用することを前提に記述します。
3.4. 必要なポート開放
MCP Gatewayは、Minecraftクライアントからの接続を受け付けるために特定のポートを使用します。デフォルトでは、Minecraftの標準ポートである25565/TCPが使用されます。
- ファイアウォールの設定: サーバーのOSレベルのファイアウォール(例:
ufw
on Ubuntu,firewalld
on CentOS)で、TCPポート25565を外部からのアクセスに対して許可する必要があります。- UFW (Ubuntu):
bash
sudo ufw allow 25565/tcp
sudo ufw enable # 初回有効化
sudo ufw status - firewalld (CentOS/RHEL):
bash
sudo firewall-cmd --add-port=25565/tcp --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --list-ports
- UFW (Ubuntu):
- クラウドプロバイダのセキュリティグループ/ネットワークACL: AWS EC2、Google Cloud Compute Engine、Azure VMなどのクラウド環境でサーバーを運用している場合、インスタンスレベルまたはネットワークレベルのセキュリティ設定(セキュリティグループ、ネットワークACLなど)でも、TCPポート25565のインバウンドルールを許可する必要があります。
これらのポートが正しく開放されていないと、MCP Gatewayが正常に起動しても、Minecraftクライアントから接続することができません。
これで、MCP GatewayをDockerで動かすための基本的な環境が整いました。
4. MCP Gatewayの基本的なセットアップ
MCP GatewayをDockerで動かす前に、まずMCP Gateway自体の設定について理解し、config.yml
ファイルを作成する必要があります。
4.1. プロジェクトディレクトリの作成
まず、MCP Gatewayの関連ファイルを格納するためのディレクトリを作成しましょう。
例として、mcp-gateway
というディレクトリを作成します。
bash
mkdir mcp-gateway
cd mcp-gateway
このディレクトリ内に、MCP GatewayのJARファイル、設定ファイル、そしてDocker関連のファイルを配置していきます。
4.2. MCP Gatewayの設定ファイル(config.yml
)の解説
MCP Gatewayは、すべての設定をconfig.yml
というYAML形式のファイルで管理します。このファイルを正しく設定することが、MCP Gatewayを意図通りに動作させる上で最も重要です。
以下に、主要な設定項目とそれぞれの意味を解説します。
“`yaml
ゲートウェイがリッスンするポート。Minecraftのデフォルトは25565。
gatewayPort: 25565
オンラインモード認証を有効にするか。
true: Mojang/Microsoftの認証サーバーでプレイヤーを認証します。正規のMinecraftアカウントのみが接続可能。
false: 認証を行いません。どんなユーザー名でも接続可能(オフラインモード)。開発やローカルテスト向け。
onlineMode: true
認証設定。
authenticator:
# 認証の種類。Yggdrasil(Mojang/Microsoft認証)または Offline。
type: Yggdrasil
# Yggdrasil認証の場合のみ: 認証サーバーのアドレス。通常はMojangのデフォルトでOK。
# servicesHost: “sessionserver.mojang.com”
# authenticateHost: “authserver.mojang.com”
# secureProfile: true # プロファイルがMojang/Microsoftによって署名されているか検証(推奨)
バックエンドサーバーの定義。
servers:
# 各サーバーはユニークな名前を持つ
lobby:
# サーバーのアドレス(IPアドレスまたはホスト名)
address: “192.168.1.100” # 例: ロビーサーバーの内部IP
# サーバーのポート
port: 25565
# このサーバーをデフォルトの接続先とするか(trueの場合、明示的に指定されない接続はここへ)
default: true
survival:
address: “survival.example.com” # 例: 生存サーバーのDNS名
port: 25565
default: false
# 別のサーバーを追加する例 (メンテナンスサーバーなど)
maintenance:
address: “192.168.1.101”
port: 25565
default: false
# このサーバーがアクティブな場合、他のサーバーへの接続をブロックし、メンテナンスメッセージを表示する
# isMaintenance: true
# maintenanceMessage: “&cサーバーは現在メンテナンス中です。しばらくお待ちください。”
プレイヤーの実際のIPアドレスをバックエンドサーバーに転送するか。
BungeeCordやVelocityなどを使用している場合に重要。
BungeeCord/VelocityがIPフォワーディングをサポートしている必要がある。
ipForwarding: false
IPフォワーディングのプロトコル (BUNGEECORD, MODERN_FORWARDING)。
modernForwarding (Velocityなど) を使う場合は true に設定。
modernForwarding: true
接続時のDNSクエリに関する設定。
dnsQuery:
# DNSクエリを有効にするか。
enabled: true
# SRVレコードクエリを有効にするか。
srvQueryEnabled: true
# DNSキャッシュのTTL(秒)。
cacheTtl: 60
ホワイトリスト/ブラックリスト設定。
whitelist:
enabled: false
players:
– “PlayerName1”
– “PlayerName2”
blacklist:
enabled: false
players:
– “GrieferName”
接続制限とレートリミット。
maxConnectionsPerIp: 5 # 1つのIPアドレスからの最大同時接続数
connectionRateLimit:
enabled: false
limit: 10 # 30秒間に許可される接続試行回数
interval: 30 # 監視期間(秒)
ログレベル (INFO, DEBUG, WARN, ERROR)。
logLevel: INFO
その他の設定(詳細はMCP Gatewayの公式ドキュメントを参照)
motd:
enabled: false
line1: “&aWelcome to My Server!”
line2: “&bPowered by MCP Gateway”
maxPlayers: 100 # クライアントに表示される最大プレイヤー数
favicon: “path/to/favicon.png” # サーバーリストに表示されるアイコン
“`
重要なポイント:
gatewayPort
: このポートにMinecraftクライアントが接続します。通常は25565
です。onlineMode
: 非常に重要です。true
にするとMojang/Microsoftアカウント認証が有効になり、正規のプレイヤーのみが接続できます。false
にすると誰でもどんなユーザー名でも接続できてしまうため、セキュリティ上のリスクがあります。本番環境では必ずtrue
に設定してください。servers
: 少なくとも1つのサーバーを定義し、そのうち1つをdefault: true
に設定する必要があります。これにより、明示的なサーバー指定なしで接続してきたプレイヤーをそのサーバーに誘導します。ipForwarding
: BungeeCordやVelocityなどのプロキシサーバーを使用している場合は、通常true
に設定します。これにより、バックエンドサーバーがクライアントの実際のIPアドレスを認識できるようになります。バックエンドサーバー側もIPフォワードに対応している必要があります(spigot.yml
やserver.properties
でbungeecord: true
などの設定が必要な場合がある)。- バックエンドサーバーのアドレス:
address
はIPアドレス(例:192.168.1.100
)またはホスト名(例:minecraft.example.com
)のいずれかを指定できます。Dockerコンテナからアクセスできるアドレスである必要があります。もしバックエンドのMinecraftサーバーもDockerコンテナとして動作している場合、それらのコンテナが同じDockerネットワーク上にいるか、またはホストOSからアクセスできるIPアドレス(例:host.docker.internal
やブリッジIP)を指定する必要があります。
4.3. 簡単なconfig.yml
の例
ここでは、最も基本的な設定例を示します。
“`yaml
mcp-gateway/config.yml
gatewayPort: 25565
onlineMode: true
authenticator:
type: Yggdrasil
servers:
main:
address: “192.168.1.100” # あなたのMinecraftサーバーのIPアドレスまたはホスト名
port: 25565
default: true
ipForwarding: false # BungeeCord/Velocityを使わない場合はfalseでOK
logLevel: INFO
“`
このconfig.yml
ファイルを、先ほど作成したmcp-gateway
ディレクトリ内に保存してください。
MCP Gateway JARファイルの準備:
MCP Gatewayの実行にはJARファイルが必要です。公式のGitHubリポジトリのリリースセクションから最新版のJARファイルをダウンロードし、mcp-gateway
ディレクトリ内に配置してください。ファイル名は通常MCPGateway-<version>.jar
のようになっていますが、便宜上mcp-gateway.jar
にリネームしておくと管理がしやすくなります。
例: https://github.com/mcp-gateway/mcp-gateway/releases/download/vX.Y.Z/MCPGateway-X.Y.Z.jar
をダウンロードし、mcp-gateway.jar
にリネーム。
これで、mcp-gateway
ディレクトリには少なくともconfig.yml
とmcp-gateway.jar
の2つのファイルが準備できました。
5. Dockerイメージの作成(Dockerfile)
MCP GatewayをDockerコンテナとして実行するためには、まずDockerイメージを作成する必要があります。Dockerfileは、イメージをビルドするための手順を記述したテキストファイルです。
5.1. なぜカスタムイメージが必要か
MCP GatewayはJARファイルとして提供されるJavaアプリケーションです。これを実行するにはJava Runtime Environment (JRE) が必要です。また、作成したconfig.yml
ファイルやMCP GatewayのJARファイルをコンテナ内に組み込む必要があります。
Docker Hubには多数のJavaの公式イメージが存在しますが、それらにはMCP Gateway自体は含まれていません。そのため、ベースとなるJavaイメージの上に、MCP GatewayのJARファイルと設定ファイルをコピーし、実行コマンドを定義したカスタムイメージを作成する必要があります。
5.2. Dockerfile
の基本構造
Dockerfile
は、以下のような命令で構成されます。
FROM <base_image>:<tag>
: ベースとなるイメージを指定します。WORKDIR <path>
: 以降のコマンドが実行されるワーキングディレクトリを設定します。COPY <source> <destination>
: ホストマシンからコンテナ内にファイルやディレクトリをコピーします。RUN <command>
: イメージビルド時にコンテナ内で実行されるコマンドです。パッケージのインストールなどに使用します。EXPOSE <port>
: コンテナがリッスンするポートをドキュメント化します。これはポートを開放するわけではなく、情報提供に過ぎません。実際のポートマッピングはdocker run
やdocker-compose.yml
で行います。ENV <key>=<value>
: 環境変数を設定します。ENTRYPOINT ["executable", "param1", "param2"]
/CMD ["param1", "param2"]
: コンテナが起動したときに実行されるコマンドを定義します。ENTRYPOINT
はコンテナのメインプロセスとして実行され、CMD
はENTRYPOINT
のデフォルト引数として機能します。通常、アプリケーションを実行する場合はENTRYPOINT
を使用します。
5.3. MCP Gateway向けのDockerfile
の具体例
mcp-gateway
ディレクトリ内にDockerfile
という名前で以下のファイルを作成してください。
“`dockerfile
mcp-gateway/Dockerfile
ベースイメージとしてJava 17 JREを使用
Eclipse TemurinはOpenJ9よりもパフォーマンスが安定している傾向があり、メモリ使用量も適切。
focalはUbuntu 20.04ベースのディストリビューション。
FROM eclipse-temurin:17-jre-focal
メンテナンス担当者情報(任意)
LABEL maintainer=”Your Name your.email@example.com“
コンテナ内のワーキングディレクトリを設定
このディレクトリにmcp-gateway.jarとconfig.ymlを配置する
WORKDIR /app
ホストのmcp-gateway.jarをコンテナの/app/mcp-gateway.jarにコピー
ホストのconfig.ymlをコンテナの/app/config.ymlにコピー
COPY mcp-gateway.jar .
COPY config.yml .
MCP Gatewayがリッスンするポートを公開する(情報として)
EXPOSE 25565
コンテナ起動時に実行されるコマンドを定義
Javaアプリケーションを実行するために java -jar コマンドを使用
-Xms512M -Xmx1G はJVMのメモリ割り当て設定の例。
512MBの初期ヒープサイズ、最大1GBのヒープサイズ。これはサーバーの規模に応じて調整してください。
config.yml を引数として渡すことで、指定した設定ファイルを使用
ENTRYPOINT [“java”, “-Xms512M”, “-Xmx1G”, “-jar”, “mcp-gateway.jar”, “–config”, “config.yml”]
“`
Dockerfileの解説:
FROM eclipse-temurin:17-jre-focal
:- MCP GatewayはJavaで動作するため、Java実行環境が必要です。
eclipse-temurin
はEclipse Foundationが提供するOpenJ9またはHotSpot JVMのディストリビューションで、安定性とパフォーマンスに優れています。 17-jre-focal
は、Java 17のJRE(Java Runtime Environment)で、Ubuntu 20.04 (Focal Fossa) をベースイメージとしています。通常、Minecraftサーバー関連のアプリケーションはJava 17またはJava 21で動作することが多いため、最新の推奨バージョンを選びます。
- MCP GatewayはJavaで動作するため、Java実行環境が必要です。
WORKDIR /app
:- コンテナ内で作業を行うディレクトリを
/app
に設定します。これにより、以降のCOPY
コマンドなどで相対パスを指定できるようになります。
- コンテナ内で作業を行うディレクトリを
COPY mcp-gateway.jar .
とCOPY config.yml .
:- ホストマシン(
Dockerfile
が置かれているディレクトリ)にあるmcp-gateway.jar
とconfig.yml
ファイルを、コンテナ内の現在のワーキングディレクトリ(/app
)にコピーします。
- ホストマシン(
EXPOSE 25565
:- このコンテナがポート25565で通信をリッスンすることを宣言します。これはあくまでドキュメント目的であり、実際にこのポートをホストマシンからアクセス可能にするためには、
docker run
コマンドの-p
オプションやdocker-compose.yml
のports
セクションでポートマッピングを行う必要があります。
- このコンテナがポート25565で通信をリッスンすることを宣言します。これはあくまでドキュメント目的であり、実際にこのポートをホストマシンからアクセス可能にするためには、
ENTRYPOINT ["java", "-Xms512M", "-Xmx1G", "-jar", "mcp-gateway.jar", "--config", "config.yml"]
:- コンテナが起動したときに実行されるコマンドです。
java -jar mcp-gateway.jar
は、JARファイルをJavaで実行するための標準コマンドです。-Xms512M -Xmx1G
は、JVMのメモリ割り当てオプションです。Xms
は初期ヒープサイズ、Xmx
は最大ヒープサイズを設定します。これはMCP Gatewayが使用できるメモリ量に直結するため、サーバーの規模や予想される同時接続数に応じて適切に調整してください。目安として、小規模サーバーならXmx512M
〜1G
、中規模ならXmx2G
〜4G
、大規模ならそれ以上が必要です。--config config.yml
は、MCP Gatewayにどの設定ファイルを使用するかを指示する引数です。これにより、コンテナ内の/app/config.yml
が読み込まれます。
これで、MCP GatewayのDockerイメージを作成するためのDockerfile
が完成しました。次のステップでは、Docker Composeを使ってこれをビルドし、実行します。
6. Docker Composeによる管理
Docker Composeは、複数のコンテナからなるアプリケーションを定義し、実行するためのツールです。docker-compose.yml
というYAMLファイルを使って、サービス(コンテナ)、ネットワーク、ボリュームなどの設定をまとめて記述することで、複雑な環境も単一のコマンドで簡単に管理できるようになります。
MCP Gateway単体を動かす場合でも、Docker Composeを使うことで、ポートマッピング、ボリュームマッピング、再起動ポリシーなどを宣言的に定義でき、手動でのdocker run
コマンドに比べてはるかに管理が容易になります。
6.1. Docker Composeを使うメリット
- 宣言的な設定: サービスやネットワーク、ボリュームなどのインフラストラクチャをコード(YAML)として定義できます。これにより、設定のバージョン管理や共有が容易になります。
- 単一コマンドでの管理:
docker compose up
コマンド一つで、定義されたすべてのサービスを起動できます。停止、再起動、ログ表示なども同様に簡単です。 - 依存関係の管理: 複数のサービスがある場合、起動順序や依存関係を定義できます(例: データベースが起動してからアプリケーションを起動する)。
- 永続化とデータ管理: ボリュームマッピングを使って、コンテナ内のデータをホストマシンに永続化できます。
- 環境の再現性: チーム開発や異なる環境へのデプロイ時に、まったく同じ環境を簡単に再現できます。
6.2. docker-compose.yml
の基本構造
docker-compose.yml
ファイルは、通常以下のような構造をしています。
“`yaml
version: ‘3.8’ # Docker Composeファイルのバージョン
services: # アプリケーションを構成するサービス群
build: . # Dockerfileがあるディレクトリを指定してイメージをビルド
image: my-mcp-gateway:latest # 既存のイメージを使用する場合
ports: # ホストとコンテナのポートマッピング
– “host_port:container_port”
volumes: # ボリュームマッピング(データ永続化)
– “host_path:container_path”
– “volume_name:container_path”
environment: # 環境変数
– KEY=VALUE
networks: # ネットワーク設定
–
restart: always # コンテナの再起動ポリシー
networks: # カスタムネットワークの定義(任意)
driver: bridge
volumes: # 名前付きボリュームの定義(任意)
“`
6.3. MCP Gateway向けdocker-compose.yml
の具体例
mcp-gateway
ディレクトリ内にdocker-compose.yml
という名前で以下のファイルを作成してください。
“`yaml
mcp-gateway/docker-compose.yml
version: ‘3.8’ # Docker Composeファイルのバージョン。最新の推奨バージョンを使用。
services:
mcp-gateway: # サービス名。コンテナ名にも使われる。
build: . # Dockerfileが現在のディレクトリにあることを示す。これによりイメージがビルドされる。
container_name: mcp_gateway_server # コンテナに任意の名前を付ける(オプション)
ports:
# ホストOSのポート25565を、コンテナのポート25565にマッピング
# これにより、外部からホストの25565ポートにアクセスすると、コンテナのMCP Gatewayに接続される
– “25565:25565”
volumes:
# ホストの現在のディレクトリにある config.yml をコンテナの /app/config.yml にマウント
# これにより、ホストの config.yml を編集するだけで、コンテナの設定が反映される(要再起動)
– “./config.yml:/app/config.yml”
# ホストの ./logs ディレクトリをコンテナの /app/logs にマウント
# MCP Gatewayのログがホストに永続化される
– “./logs:/app/logs”
environment:
# Javaアプリケーションのメモリ設定をDockerfileのENTRYPOINTから上書きしたい場合などに使用。
# 今回はDockerfileで直接指定しているため不要だが、動的に変更したい場合に便利。
# – “JAVA_OPTS=-Xms512M -Xmx2G”
TZ: Asia/Tokyo # タイムゾーンの設定(任意だが推奨)
restart: always # コンテナが終了した場合、常に再起動する。サーバー運用では必須。
“`
docker-compose.yml
の解説:
version: '3.8'
: 使用するDocker Composeファイルの構文バージョンを指定します。最新バージョン(執筆時点では3.8が広く使われている)を使用するのが推奨です。services:
: ここに定義された各エントリが、個別のDockerコンテナ(サービス)を生成します。mcp-gateway:
: これがサービスの論理名であり、生成されるコンテナの接頭辞にもなります(例:mcp_gateway_server
)。build: .
:- この行は、Docker Composeに「現在のディレクトリ(
.
)にあるDockerfile
を使用してDockerイメージをビルドしなさい」と指示します。 - 初回起動時や
Dockerfile
に変更があった場合にイメージがビルドされます。既にビルド済みのイメージがある場合でも、更新があれば再ビルドされます。
- この行は、Docker Composeに「現在のディレクトリ(
container_name: mcp_gateway_server
:- 生成されるコンテナに人間が読みやすい名前を付けます。これを指定しない場合、Docker Composeはサービス名とプロジェクト名を組み合わせた名前(例:
mcp-gateway_mcp-gateway_1
)を自動生成します。
- 生成されるコンテナに人間が読みやすい名前を付けます。これを指定しない場合、Docker Composeはサービス名とプロジェクト名を組み合わせた名前(例:
ports:
:- "25565:25565"
: これはポートマッピングの定義です。- 左側の
25565
はホストOSのポート番号です。 - 右側の
25565
はコンテナ内部のポート番号です。 - この設定により、ホストOSのIPアドレスとポート25565にアクセスすると、それがコンテナ内のMCP Gatewayのポート25565に転送されます。Minecraftクライアントは、このホストのIPアドレスとポート25565に接続することになります。
- 左側の
volumes:
:- "./config.yml:/app/config.yml"
:- これは「バインドマウント」と呼ばれるボリュームマッピングです。
- ホストOSの現在のディレクトリ(
mcp-gateway
)にあるconfig.yml
ファイルを、コンテナ内部の/app/config.yml
にマウントします。 - これにより、コンテナ起動後もホストの
config.yml
を編集するだけで、設定変更が可能です(ただし、多くの場合、変更を反映させるにはコンテナの再起動が必要です)。コンテナが削除されても設定ファイルが失われることがありません。
- "./logs:/app/logs"
:- 同様に、ホストOSの
mcp-gateway/logs
ディレクトリを、コンテナ内部の/app/logs
にマウントします。 - MCP Gatewayが出力するログファイルがこのディレクトリに書き込まれるため、コンテナが削除されてもログが失われず、ホストOSから簡単にログを確認できるようになります。
- 同様に、ホストOSの
environment:
:TZ: Asia/Tokyo
: コンテナ内のタイムゾーンを設定します。ログのタイムスタンプなどが正確になります。必要に応じて変更してください。
restart: always
:- コンテナの再起動ポリシーを定義します。
always
は、コンテナが停止した場合(エラー終了、手動停止、ホスト再起動など、いかなる理由であっても)、常に自動的に再起動することを意味します。サーバー運用において、サービスが自動的に復旧することは非常に重要です。
- コンテナの再起動ポリシーを定義します。
これで、MCP GatewayをDocker Composeで管理するための設定ファイルが完成しました。
7. 実践!MCP Gatewayのデプロイと動作確認
いよいよ、これまでに準備したファイルを使ってMCP Gatewayをデプロイし、動作確認を行います。
7.1. ファイルの配置構造
作業ディレクトリmcp-gateway
は、最終的に以下のようなファイル構造になっていることを確認してください。
mcp-gateway/
├── Dockerfile
├── config.yml
├── docker-compose.yml
└── mcp-gateway.jar
Dockerfile
: Dockerイメージをビルドするための手順。config.yml
: MCP Gatewayの設定ファイル。docker-compose.yml
: Docker ComposeでMCP Gatewayサービスを定義するためのファイル。mcp-gateway.jar
: MCP Gatewayの実行可能JARファイル(GitHub Releasesからダウンロードしてリネームしたもの)。
logs
ディレクトリは、コンテナが起動してログが出力され始めると自動的に作成されます。
7.2. デプロイ手順
mcp-gateway
ディレクトリに移動し、以下のコマンドを実行します。
-
Dockerイメージのビルド:
まず、docker-compose.yml
でbuild: .
が指定されているため、サービスを起動する前にイメージがビルドされます。明示的にビルドしたい場合は以下のコマンドを実行します。
bash
cd mcp-gateway
docker compose build mcp-gatewaydocker compose build
:docker-compose.yml
ファイルに基づいてイメージをビルドします。mcp-gateway
: 特定のサービス(この場合はmcp-gateway
サービス)のみをビルド対象と指定します。省略すると、ファイル内のすべてのサービスがビルドされます。- 初回実行時は、Javaのベースイメージのダウンロードと、MCP Gatewayイメージのビルドが行われるため、時間がかかる場合があります。
-
MCP Gatewayコンテナの起動:
イメージが正常にビルドされたら、以下のコマンドでMCP Gatewayコンテナを起動します。
bash
docker compose up -ddocker compose up
:docker-compose.yml
で定義されたサービスを起動します。-d
(detached mode): コンテナをバックグラウンドで実行します。これにより、コマンドを実行したシェルを閉じてもコンテナが動作し続けます。
コンテナが正常に起動すると、特に何もメッセージが表示されないか、各サービスが作成され起動したことを示すメッセージが表示されます。
7.3. 動作確認
コンテナが起動したら、以下の手順で動作を確認します。
-
コンテナの状態確認:
bash
docker compose ps
以下のような出力が表示されれば、mcp-gateway
サービスがUp
状態であり、正常に動作していることを示します。NAME COMMAND SERVICE STATUS PORTS
mcp_gateway_server "java -Xms512M -Xmx1G…" mcp-gateway Up (healthy) 0.0.0.0:25565->25565/tcp
STATUS
がUp
になっていることを確認してください。 -
ログの確認:
MCP Gatewayが正常に起動し、エラーがないかログを確認します。
bash
docker compose logs -f mcp-gatewaydocker compose logs
: サービス名を指定してそのコンテナのログを表示します。-f
(follow): リアルタイムで新しいログメッセージを追跡します。Ctrl+C
で停止できます。
MCP Gatewayが正常に起動すると、以下のようなメッセージがログに出力されます。
mcp_gateway_server | [INFO] Starting MCP Gateway...
mcp_gateway_server | [INFO] Listening on /0.0.0.0:25565
mcp_gateway_server | [INFO] Default server set to 'main' (192.168.1.100:25565)
mcp_gateway_server | [INFO] MCP Gateway started successfully!
もしエラーが出ている場合は、ログにエラーメッセージが表示されるはずです。特にjava.lang.OutOfMemoryError
やPort already in use
などのエラーに注意してください。 -
Minecraftクライアントからの接続テスト:
Minecraftクライアントを起動し、マルチプレイのサーバー追加画面で、MCP Gatewayが動作しているサーバーのIPアドレス(またはホスト名)と、config.yml
で設定したgatewayPort
(デフォルトは25565)を入力して接続を試みます。- 例: サーバーアドレス:
your_server_ip_address:25565
your_server_ip_address
は、MCP GatewayをデプロイしたサーバーのグローバルIPアドレスです。
正常に接続できれば、MCP Gateway経由で設定したバックエンドのMinecraftサーバーに接続できているはずです。
- 例: サーバーアドレス:
7.4. 停止と再起動
- コンテナの停止:
bash
docker compose down
このコマンドは、docker-compose.yml
で定義されたすべてのサービスを停止し、関連するコンテナ、ネットワーク、ボリューム(匿名ボリュームのみ)を削除します。
バインドマウントされたボリューム(./config.yml
や./logs
)のデータは削除されません。 - コンテナの再起動:
設定ファイル(config.yml
)を変更した場合など、コンテナを再起動して変更を適用する必要がある場合があります。
bash
docker compose restart mcp-gateway
または、停止後に再起動します。
bash
docker compose stop mcp-gateway
docker compose start mcp-gateway
docker compose up -d
を再度実行しても、既に稼働中の場合はコンテナを停止して再作成するため、設定変更が反映されます(イメージを再ビルドする場合はdocker compose up -d --build
)。
7.5. トラブルシューティングのヒント
もしMCP Gatewayが正常に動作しない場合は、以下の点をチェックしてください。
- ポート衝突:
Port already in use
などのエラーがログに出ている場合、ホストOSの25565番ポートが他のアプリケーション(例: 別のMinecraftサーバー、別のプロキシ)によって使用されている可能性があります。- 対策: 他のアプリケーションを停止するか、
config.yml
およびdocker-compose.yml
のgatewayPort
とports
マッピングを別のポート(例: 25566)に変更してください。
config.yml
の設定ミス:- YAMLの構文エラー(インデント、コロンの忘れなど)。YAMLバリデータツールで確認するか、ログのエラーメッセージを確認してください。
servers
セクションのaddress
やport
が正しくない(バックエンドサーバーにアクセスできない)。default: true
のサーバーが定義されていない。onlineMode
が意図しない設定になっている。
- Javaバージョンの問題:
- MCP Gatewayが要求するJavaバージョンと、Dockerfileで指定したJavaバージョンが異なる場合。通常、最新のMCP GatewayはJava 17以上を要求します。
- メモリ不足:
java.lang.OutOfMemoryError
がログに出ている場合、JVMに割り当てられたメモリが不足しています。- 対策:
Dockerfile
またはdocker-compose.yml
のJAVA_OPTS
(ENTRYPOINT
やenvironment
)で-Xmx
の値を増やしてください。
- ファイアウォール/セキュリティグループ:
- ホストOSやクラウドプロバイダのファイアウォールで、TCPポート25565が開放されているか再度確認してください。
- MCP Gateway JARファイルが見つからない:
mcp-gateway.jar
がmcp-gateway
ディレクトリに正しく配置されているか、ファイル名がDockerfile
のCOPY
コマンドと一致しているか確認してください。
これらの手順とヒントを参考に、MCP GatewayをDocker上で正常にデプロイできるはずです。
8. 高度な設定とユースケース
MCP GatewayとDockerの組み合わせは、基本的なデプロイを超えて、さらに多くの高度なシナリオに対応できます。ここでは、そのいくつかを紹介します。
8.1. オンラインモードとオフラインモード
onlineMode: true
(推奨):
Mojang/Microsoftの認証サーバーと通信し、プレイヤーのMinecraftアカウントが正規のものであるかを確認します。これにより、海賊版ユーザーの接続を防ぎ、サーバーのセキュリティを確保します。本番環境では必須の設定です。onlineMode: false
:
認証を行わず、どのようなユーザー名でも接続を許可します。これは、オフラインサーバーや開発環境でのテスト、またはAuthMeなどのプラグインによる独自の認証システムを使用する場合に利用されます。ただし、この設定はセキュリティ上のリスクが高いため、慎重に使用してください。
8.2. 認証プラグインとの連携 (Yggdrasil, AuthMe)
- Yggdrasil認証:
authenticator.type: Yggdrasil
を設定することで、Mojang/Microsoftのデフォルト認証サーバーを使用します。これはonlineMode: true
と組み合わせて使われます。
もし、カスタムの認証プロキシ(例: Authlib-Injectorなど)を使用している場合は、authenticator.servicesHost
やauthenticator.authenticateHost
をそのプロキシのアドレスに設定することも可能です。 - AuthMeなどのプラグイン:
もしバックエンドのMinecraftサーバーでAuthMeのような認証プラグインを使用し、オフラインモードでの運用を考えている場合、MCP GatewayはonlineMode: false
で設定します。これにより、MCP Gatewayは認証をスキップし、接続をバックエンドサーバーに転送します。バックエンドサーバーでAuthMeが認証処理を行います。この場合、IPフォワーディングは重要になることがあります。
8.3. 複数サーバーの管理
config.yml
のservers
セクションを適切に設定することで、複数のMinecraftサーバーをMCP Gatewayの下に配置し、プレイヤーの接続を制御できます。
yaml
servers:
lobby:
address: "192.168.1.100"
port: 25565
default: true
survival:
address: "192.168.1.101"
port: 25565
creative:
address: "192.168.1.102"
port: 25565
- デフォルトサーバー:
default: true
に設定されたサーバーは、プレイヤーが特定のサーバーを指定せずに接続してきた場合のデフォルトの接続先となります。 - サーバー切り替えコマンド: MCP Gateway自体はサーバー切り替えコマンドを提供しません。通常、これはBungeeCord/Velocityのようなプロキシサーバーの機能です。MCP Gatewayはあくまで「ゲートウェイ」であり、認証とIPフォワードが主目的です。もしサーバー切り替え機能が必要な場合は、MCP Gatewayの「後ろ」にBungeeCord/Velocityを配置することを検討してください。
8.4. IPフォワーディング
ipForwarding: true
を設定することで、クライアントの実際のIPアドレスをバックエンドサーバーに転送できます。これは非常に重要な機能です。
- BungeeCord/Velocity連携:
BungeeCordやVelocityのようなプロキシサーバーをMCP Gatewayのバックエンドに配置する場合、ipForwarding: true
は必須です。これにより、バックエンドのMinecraftサーバー(Spigot/Paperなど)が、プロキシサーバーのIPではなく、プレイヤーの実際のIPアドレスを認識できるようになります。config.yml
での設定:
yaml
ipForwarding: true
modernForwarding: false # BungeeCordの場合はfalse, Velocityの場合はtrue- バックエンドサーバーの設定:
Spigot/Paperサーバーの場合、spigot.yml
またはpaper.yml
でbungeecord: true
を設定する必要があります。
yaml
# spigot.yml or paper.yml
settings:
bungeecord: true
この設定により、Spigot/PaperはBungeeCord/VelocityがIPアドレスを転送する特殊なプロトコルを理解し、正しいIPアドレスを認識するようになります。modernForwarding: true
を使用する場合は、Velocityのプロトコルに合わせた設定が必要です。
- Fabric/Forgeサーバーでの対応:
MODサーバーの場合、Forge/Fabricは標準でBungeeCord/VelocityのIPフォワードプロトコルをサポートしていません。しかし、一部のMOD(例: FabricProxy-Lite for Fabric, ForgeProxy for Forge)を導入することで、IPフォワーディングに対応させることが可能です。これにより、MODサーバーでもIPベースの機能(IP制限、GeoIPなど)を利用できるようになります。
8.5. TLS/SSL暗号化
Minecraftの接続はデフォルトで暗号化されていません。MCP Gateway自体には直接TLS/SSLをサポートする機能は通常含まれていませんが、より安全な接続を提供するために、リバースプロキシ(Nginx, Traefik, Caddyなど)をMCP Gatewayの前に配置することを検討できます。
- Nginx/Traefik + Certbot:
リバースプロキシを設置し、ポート443でTLS接続を受け付け、それをMCP Gatewayの非暗号化ポート25565に転送します。Let’s EncryptとCertbotを使用すれば、無料でSSL証明書を取得できます。
これにより、Webサイトと同様にMinecraftの通信も暗号化され、中間者攻撃などから保護できます。
これはかなり高度な設定となるため、NginxやTraefikの知識が必要です。
8.6. 永続化とバックアップ
Dockerコンテナは一時的なものであるため、重要なデータはホストOSに永続化する必要があります。
- 設定ファイル (
config.yml
):docker-compose.yml
で./config.yml:/app/config.yml
のようにバインドマウントすることで、ホストOSに保存されます。 - ログファイル:
docker-compose.yml
で./logs:/app/logs
のようにマウントすることで、MCP GatewayのログがホストOSのlogs
ディレクトリに保存され、コンテナが削除されても失われません。定期的にバックアップを取ることで、問題発生時の調査に役立ちます。 - その他データ: もしMCP Gatewayがデータベースファイルなどを生成する場合、それらも同様にボリュームマウントして永続化することが重要です。
8.7. パフォーマンスチューニング
MCP GatewayはJavaアプリケーションであるため、JVMのメモリ設定がパフォーマンスに大きく影響します。
- JVMオプション (
-Xms
,-Xmx
):
Dockerfile
のENTRYPOINT
で設定した-Xms512M -Xmx1G
はあくまで一例です。-Xms
: 初期ヒープサイズ。起動時のメモリ使用量。-Xmx
: 最大ヒープサイズ。MCP Gatewayが使用できる最大のメモリ量。
サーバーの同時接続数や全体的な負荷に応じて、この値を調整します。
例:-Xms2G -Xmx4G
(2GBから4GB)
これらの値は、サーバーの物理メモリの範囲内で設定する必要があります。過剰な設定は、スワップの発生やシステム全体の不安定化を招く可能性があります。
- Dockerリソース制限:
docker-compose.yml
のサービス定義内で、resources
またはdeploy.resources
セクションを使って、CPUやメモリの使用量を制限できます。
yaml
services:
mcp-gateway:
# ...
deploy: # または resources:
resources:
limits:
memory: 4G # 最大メモリを4GBに制限
cpus: '2.0' # 最大2CPUコアに制限
これにより、MCP Gatewayが暴走した場合でも、ホストOSや他のコンテナに影響を与えるのを防ぐことができます。
8.8. 監視とロギング
- Dockerログドライバー:
Dockerは様々なログドライバーをサポートしています(json-file, syslog, journaldなど)。docker-compose.yml
でログドライバーを設定し、集中ログ管理システム(Fluentd, Logstashなど)と連携させることで、複数のコンテナのログを一元的に収集・分析できます。 - Prometheus/Grafanaとの連携:
Javaアプリケーションの監視には、JMX (Java Management Extensions) を使用してJVMのメトリクスを収集するのが一般的です。JMX Exporter
のようなツールをMCP Gatewayコンテナに含めるか、サイドカーコンテナとしてデプロイすることで、Prometheusでメトリクスを収集し、Grafanaで可視化できます。これにより、メモリ使用量、CPU使用率、ガベージコレクションの頻度などをリアルタイムで監視し、パフォーマンスの問題を早期に発見できます。
8.9. CI/CDとの連携
Dockerを利用することで、MCP GatewayのデプロイをCI/CD (継続的インテグレーション/継続的デリバリー) パイプラインに組み込むことが容易になります。
- Docker Hubへのイメージプッシュ:
新しいconfig.yml
やMCP Gatewayのバージョンがリリースされたら、自動的に新しいDockerイメージをビルドし、Docker Hubなどのコンテナレジストリにプッシュします。 - 自動デプロイ:
Jenkins, GitLab CI/CD, GitHub ActionsなどのCI/CDツールを使って、新しいイメージがプッシュされたときに、本番サーバーに自動的にデプロイ(docker compose pull && docker compose up -d
)するプロセスを構築できます。これにより、手動でのデプロイミスを減らし、デプロイサイクルを高速化できます。
これらの高度な設定は、MCP Gatewayの機能とDockerの柔軟性を最大限に活用し、より堅牢で管理しやすいMinecraftサーバー環境を構築するための基盤となります。
9. セキュリティに関する考慮事項
DockerでMCP Gatewayを運用する際には、セキュリティについて特に注意を払う必要があります。
9.1. 公開ポートの制限
- 最小限のポート開放: MCP Gatewayは通常、Minecraftのデフォルトポート25565のみを公開します。必要最小限のポートのみを外部に公開し、それ以外のポートはすべて閉じることが重要です。
- 管理ポートの隔離: SSH (22番ポート)、Web管理パネルなどの管理用ポートは、MCP Gatewayのポートとは別に、信頼できるIPアドレスからのみアクセスできるように制限すべきです。
9.2. ファイアウォール設定
- ホストOSのファイアウォール: サーバーのOSレベルのファイアウォール(UFW, firewalldなど)で、TCPポート25565のインバウンド接続のみを許可し、他の不要なポートはブロックします。
- クラウドプロバイダのセキュリティグループ/ACL: クラウド環境の場合、セキュリティグループやネットワークACLを利用して、Minecraftポート以外のすべてのインバウンドトラフィックをブロックし、信頼できるIPアドレスからのSSHアクセスのみを許可します。
9.3. 最小権限の原則
- Dockerユーザー:
docker
コマンドをsudo
なしで実行できるようにするために、現在のユーザーをdocker
グループに追加することが一般的ですが、これはそのユーザーにroot権限と同等のアクセスを許可することになるため、セキュリティリスクを伴います。本番サーバーでは、Dockerコマンドを実行するユーザーを限定したり、より厳格なアクセス制御を検討したりする必要があります。 - コンテナ内のユーザー:
Dockerfile
内でUSER
命令を使用して、コンテナ内のプロセスをroot以外のユーザーで実行することを検討してください。これにより、コンテナが侵害された場合のリスクを軽減できます。ただし、MCP Gatewayの起動に必要な権限を考慮する必要があります。
9.4. 最新のソフトウェア利用
- MCP Gatewayの更新: MCP Gatewayのセキュリティ修正や機能改善がリリースされたら、常に最新バージョンに更新することを検討してください。
- Docker Engine/Composeの更新: Docker本体も定期的にセキュリティパッチやバグ修正が提供されます。常に最新の安定版を使用するよう心がけましょう。
- ベースイメージの更新:
Dockerfile
で使用するJavaベースイメージも、セキュリティ脆弱性が修正されることがあります。定期的にイメージを再ビルドし、最新のベースイメージを取り込むようにしましょう(例:docker compose build --no-cache
でキャッシュを使わずにビルド)。
9.5. 設定ファイルの機密情報管理
config.yml
にAPIキーやデータベースのパスワードなどの機密情報を含める場合は、そのファイルのアクセス権を厳しく制限し、不用意に公開されないように注意してください。- Docker Secretsや環境変数(
environment
セクション)を使用するなど、より安全な方法で機密情報をコンテナに渡すことも検討できます。
9.6. DDoS攻撃対策
MCP Gatewayには接続制限などの基本的なDDoS対策機能がありますが、本格的なDDoS攻撃には専門的な対策が必要です。
- CDN/DDoS保護サービス: Cloudflare Spectrum、AkamaiなどのDDoS保護サービスを利用することで、大規模なDDoS攻撃からサーバーを保護できます。
- ファイアウォールルール: 不審なIPアドレスからの接続をブロックするファイアウォールルールを設定します。
- 接続元IP制限: 信頼できる国や地域からの接続のみを許可するGeoIPフィルタリングなども検討できます。
これらのセキュリティ対策を講じることで、Dockerで運用するMCP Gatewayをより安全な状態に保ち、Minecraftサーバーネットワーク全体を保護できます。
10. よくある質問(FAQ)とトラブルシューティング
MCP GatewayをDockerで運用する際に遭遇しやすい問題とその解決策についてまとめます。
10.1. 「コンテナが起動しない」
- 症状:
docker compose ps
でコンテナのSTATUSがUp
にならない、またはExited
になっている。 - 確認点:
- ログの確認:
docker compose logs -f mcp-gateway
を実行し、エラーメッセージを確認してください。Port already in use
エラー: ホストOSのポート25565が既に他のプロセスで使用されています。config.yml
とdocker-compose.yml
のポートマッピングを変更するか、競合するプロセスを停止してください。Error: Unable to access jarfile mcp-gateway.jar
:Dockerfile
のCOPY
コマンドが正しくないか、mcp-gateway.jar
がmcp-gateway
ディレクトリに存在しません。ファイル名とパスを確認してください。java.lang.UnsupportedClassVersionError
: JavaバージョンがMCP Gatewayの要求バージョンと合致していません。Dockerfile
のFROM
イメージを適切なJavaバージョン(通常はJava 17以上)に変更してください。- YAML構文エラー:
config.yml
やdocker-compose.yml
のインデントやコロンなどに間違いがないか、YAMLバリデータで確認してください。
- ファイルパス:
Dockerfile
,config.yml
,docker-compose.yml
,mcp-gateway.jar
がすべて同じmcp-gateway
ディレクトリ内にあり、ファイル名が一致しているか確認してください。 - メモリ不足:
java.lang.OutOfMemoryError
がログに出ている場合は、JVMに割り当てられたメモリが不足しています。Dockerfile
のENTRYPOINT
コマンド(-Xmx
)やdocker-compose.yml
のdeploy.resources.limits.memory
を増やしてください。
- ログの確認:
10.2. 「Minecraftから接続できない」
- 症状: MCP Gatewayコンテナは起動しているが、Minecraftクライアントからサーバーに接続できない(タイムアウト、不明なホストなど)。
- 確認点:
- ホストOSのファイアウォール: サーバーのOSレベルのファイアウォール(UFW, firewalldなど)でTCPポート25565が開放されているか確認してください。
- クラウドプロバイダのセキュリティグループ: AWS, GCP, Azureなどのクラウド環境の場合、セキュリティグループやネットワークACLでTCPポート25565が開放されているか確認してください。
- ポートマッピング:
docker-compose.yml
のports
セクションが正しく設定されているか確認してください(例:- "25565:25565"
)。 - バックエンドサーバーのアクセス可能性:
config.yml
のservers
セクションに記載されているバックエンドMinecraftサーバーのaddress
とport
が正しいか。- MCP Gatewayコンテナからそのバックエンドサーバーにアクセスできるか確認します。コンテナ内から
ping
やnc -zv <address> <port>
を実行してみる(docker exec -it mcp_gateway_server bash
でコンテナに入り、apt update && apt install -y iputils-ping netcat
などでツールをインストールする必要があるかもしれません)。 - バックエンドサーバーのファイアウォールがMCP Gatewayからの接続をブロックしていないか確認してください。
onlineMode
設定:onlineMode: true
の場合、認証サーバーへのアクセスがブロックされていないか確認してください。
10.3. 「config.yml
が反映されない」
- 症状:
config.yml
を変更しても、MCP Gatewayの動作に変化がない。 - 確認点:
- コンテナの再起動:
config.yml
を変更した後、コンテナを再起動しましたか?ほとんどの設定変更はコンテナの再起動が必要です。docker compose restart mcp-gateway
を実行してください。 - ボリュームマウント:
docker-compose.yml
のvolumes
セクションで./config.yml:/app/config.yml
が正しく設定されているか確認してください。- もしこの設定がないと、コンテナ内の
config.yml
はイメージビルド時のものになり、ホストの変更は反映されません。
- もしこの設定がないと、コンテナ内の
- コンテナ内のファイル確認:
docker exec -it mcp_gateway_server cat /app/config.yml
を実行し、コンテナ内のconfig.yml
があなたの変更を反映しているか確認してください。もし反映されていなければ、ボリュームマウントの設定が間違っている可能性があります。
- コンテナの再起動:
10.4. 「パフォーマンスが悪い」
- 症状: 接続が不安定、ラグが多い、CPU使用率が高い。
- 確認点:
- メモリ割り当て:
Dockerfile
またはdocker-compose.yml
で設定している-Xmx
の値を確認してください。サーバーの同時接続数や機能に応じて、十分なメモリが割り当てられているか確認してください。 - CPUリソース: ホストOSのCPU使用率を確認してください。他のプロセスが大量にCPUを消費していないか。Docker Composeで
deploy.resources.limits.cpus
を設定して、MCP Gatewayに適切なCPUリソースを割り当てているか確認してください。 - ネットワーク速度: サーバーのネットワーク帯域が十分か、バックエンドサーバーとの間のネットワーク遅延が大きいなどがないか確認してください。
- MCP Gatewayのバージョン: 最新のMCP Gatewayバージョンはパフォーマンス改善が含まれている場合があります。最新版への更新を検討してください。
- メモリ割り当て:
10.5. その他のデバッグ方法
docker exec
でコンテナに入る:
docker exec -it mcp_gateway_server bash
を実行すると、実行中のコンテナのシェルに入ることができます。ここで、ファイルを確認したり、ネットワークコマンド(ping, netcatなど)を実行して問題を診断したりできます。docker inspect
で詳細情報を見る:
docker inspect mcp_gateway_server
を実行すると、コンテナの詳細な設定情報(IPアドレス、マウントされているボリューム、ポートマッピングなど)が表示されます。
これらのトラブルシューティングのヒントを参考に、問題解決に役立ててください。
まとめ
本記事では、Minecraftサーバーの認証プロキシであるMCP GatewayをDocker環境でデプロイし、運用する詳細な方法について解説しました。はじめにMCP Gatewayの基本的な機能とその必要性を理解し、次にDockerの概念とメリット、そして具体的なインストール手順を学びました。
MCP Gatewayの核となるconfig.yml
の設定から、Dockerイメージを構築するためのDockerfile
の記述、そしてDocker Composeを使ってこれらを統合し、単一コマンドで管理する方法まで、ステップバイステップで実践的な手順を示しました。これにより、設定ファイルの編集からコンテナの起動、ログの確認、停止、再起動に至るまで、MCP Gatewayのライフサイクル全体をDockerの強力なツール群でカバーできるようになります。
さらに、オンラインモード/オフラインモードの切り替え、BungeeCord/Velocityとの連携におけるIPフォワーディングの重要性、複数サーバーの管理、TLS/SSL暗号化、永続化、パフォーマンスチューニング、監視、そしてCI/CD連携といった高度なユースケースについても触れました。これにより、あなたのMinecraftサーバー環境をより堅牢で、柔軟で、スケーラブルなものへと進化させることができます。
最後に、Docker環境におけるセキュリティの考慮事項と、よくある問題とそのトラブルシューティング方法を提示し、読者が自力で問題を解決できるよう支援しました。
Dockerを活用することで、MCP Gatewayのデプロイは劇的に簡素化され、環境間の差異に悩まされることなく、高い可搬性と再現性を実現できます。これにより、サーバー運営者は本質的な課題であるプレイヤー体験の向上とコミュニティの活性化に、より集中できるようになるでしょう。
このガイドが、あなたのMinecraftサーバー運営の助けとなり、より安全で快適なゲーム環境の構築に貢献できれば幸いです。DockerとMCP Gatewayの組み合わせは、今日のMinecraftサーバーネットワークにおいて非常に強力なツールとなり得ます。ぜひこの機会に、その可能性を最大限に引き出してみてください。