Docker上でPocketMine-MPを動かそう

PocketMine-MPはDockerのコンテナ上で動かすことができます。
Docker とは開発者やシステム管理者が、コンテナでアプリケーションを **構築（build）、実行（run）、共有（share）**するためのプラットフォームです。[^1]

[^1]: https://docs.docker.jp/get-started/index.html#docker


## Dockerをインストール・セットアップしよう
https://www.docker.com/products/docker-desktop

上記のリンクからWindows/MacでのDocker Desktopがインストールできます。
インストールが終わった後に起動するとチュートリアルが始まります。
一通りやっておくと、この後の操作が理解しやすくなると思います。

:::note warn
注意
Windows Homeの場合はWSL2を有効にする必要があります。詳細は
https://docs.docker.jp/docker-for-windows/install-windows-home.html
を確認してください。
:::

## DockerでPocketMine-MPを動かしてみよう
ここからが本題です。実際にPocketMine-MPをDocker上で動かしてみましょう。
PocketMine-MPは公式がDockerイメージを以下のリンクで公開しています。

https://hub.docker.com/r/pmmp/pocketmine-mp

英語版ですがそんなに難しい内容にはなっていないはずです。

### 1. Dockerイメージをダウンロードする
端末やWindowsターミナル上などで`docker pull pmmp/pocketmine-mp`を実行してDockerダウンロードします。

### 2.プラグイン用のディレクトリとデータ用のディレクトリを作成する
サーバーのデータを保持しておくディレクトリを決めて、その中に`plugins`ディレクトリと`data`ディレクトリを作ります。

### 3. コンテナを立ち上げる。
Windowsの場合

```shell
docker run -it -p 19132:19132/udp -v {上で決めたディレクトリへのパス}\\data:/data -v {上で決めたディレクトリへのパス}\\plugins:/plugins pmmp/pocketmine-mp
```

を
Mac/Linuxの場合は端末上で上のディレクトリを開いた状態で、

```shell
docker run -it -p 19132:19132/udp -v $PWD/data:/data -v $PWD/plugins:/plugins pmmp/pocketmine-mp
```

を実行して起動します。
うまく起動するとサーバーのログが見れるはずです。
そのほかは通常のPocketMine-MPと同じように使うことができます。開けるポートが違うときには-pオプションでそれに対応するポートをしてしてください。

## シナリオ: MySQLを使うプラグインを使用する
この章ではdocker-composeを使用してDockerの要素をより使ってサーバーを構築することを考えます。特に、MySQLを使うプラグインと合わせて使うことを考えます。

### 1. docket-compose.ymlを記述する。

```yml
version: "3"

services:
  pocketmine-server:
    image: pmmp/pocketmine-mp:latest # どのイメージを使うか、今回は最新版イメージを指定した。
    ports:
      - "19132:19132/udp" 
    depends_on:
      - mysql # mysqlサービスに対応していることを表す。
    volumes:
      - 'C:\Devs\plugin-dev\MyChunkLand:/plugins' # 一例、絶対パスで実機:コンテナ上のディレクトリを対応させる。
      - 'C:\Devs\plugin-dev\data:/data'
  mysql:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password # rootユーザーのパスワードを指定する
    ports:
      - "3308:3306" # Docker上のmysqlコンテナのポート3306を実機上のポート3308に対応させる
```

上のようなファイルを記述しdocker-compose.ymlとして保存します。

### 2. docker-composeで立ち上げる
そのディレクトリをカレントディレクトリにした状態で以下を実行すると、pocketmine-serverコンテナとmysqlコンテナを立ち上げられます。

```sh
docker-compose up
```

### 3. プラグインで設定をする
この状態でいったんサーバーを停止してからプラグインの設定をします。

例えば、Ree-jp-minecraftさんの[StackStorageプラグイン(GitHubリンク)](https://github.com/Ree-jp-minecraft/StackStrage)では、以下のような設定にすると、対応ができます。

```yml
database:
  # mysql or sqlite
  type: mysql # MySQLを選択

    # Edit these settings only if you choose "sqlite".
  sqlite:
    # The file name of the database in the plugin data folder.
  # You can also put an absolute path here.
    file: data.sqlite
  # Edit these settings only if you choose "mysql".
  mysql:
    host: mysql #ホストをコンテナ名に変更
    # Avoid using the "root" user for security reasons.
    username: StackStorage #データベース内のユーザー名に対応
    password: password #対応するパスワードへ
    # Database name
    schema: StackStorage 
  # The maximum number of simultaneous SQL queries
  # Recommended: 1 for sqlite, 2 for MySQL. You may want to further increase this value if your MySQL connection is very slow.
  worker-limit: 1
```

ホストマシン側からはMySQLはポート3308からアクセスできます。
このプラグインであればデータベースにアクセスして以下のコマンドを実行することで一連の初期設定が終わります。

```sql
CREATE DATABASE StackStorage;
CREATE USER StackStorage IDENTIFIED BY 'password';
GRANT ALL on StackStorage.* to StackStorage;
```


ほかのプラグインについてもホストとユーザー、パスワードとスキーマをプラグインの指示に従い適切に設定することで動作させることができます。

## まとめ
* PocketMine-MPはDockerコンテナ上で動作できる。
* Dockerを使うとMySQLやその他の対応するサービスを一括で管理できる。

Dockerはいろいろなコンテナが対応しているのでサーバーを一括で管理するに役立ちます。この機会に一度お試しを！