見出し画像

Minecraftゲームサーバ構築(DockerContainer)


1.はじめに

今回はマインクラフトのサーバコンテナを作成し、LAN内のPCから接続できる環境を構築します。

Win11+WSL2+DockerDesktop環境構築済みを前提としております。

2.構成

構成図

Minecraftのコンテナは、itzg/docker-minecraft-serverを利用させていただきました。

WSL2なので、ホストから\\wsl$で直接WSLのUbuntu内のファイルが触れ、
さらにコンテナにWSL内ディレクトリをボリュームマウントすることで
最終的にホストのWin11からコンテナ内のファイルを直接操作できます。

また、networkingMode=mirroredを設定することにより、
ホストのWin11とWSL2のUbuntuは同IPで動くようになっております。
WSL2とコンテナ間は、25565ポートのマッピングをしております。

3.設定ファイル

3.1.Dockerfile

<コンテナユーザ名><コンテナグループ名>は任意の文字列に書き換えてください。
<WSL UID><WSL GID>は、WSLのIDコマンドにて確認してください。(後述)

ARG BASE_IMAGE=eclipse-temurin:21-jre
FROM ${BASE_IMAGE}

# hook into docker BuildKit --platform support
# see https://docs.docker.com/engine/reference/builder/#automatic-platform-args-in-the-global-scope
ARG TARGETOS
ARG TARGETARCH
ARG TARGETVARIANT

# The following three arg/env vars get used by the platform specific "install-packages" script
ARG EXTRA_DEB_PACKAGES=""
ARG EXTRA_DNF_PACKAGES=""
ARG EXTRA_ALPINE_PACKAGES=""
ARG FORCE_INSTALL_PACKAGES=1
RUN --mount=target=/build,source=build \
    TARGET=${TARGETARCH}${TARGETVARIANT} \
    /build/run.sh install-packages

RUN --mount=target=/build,source=build \
    /build/run.sh setup-user

COPY --chmod=644 files/sudoers* /etc/sudoers.d

EXPOSE 25565

ARG APPS_REV=1
ARG GITHUB_BASEURL=https://github.com

ARG EASY_ADD_VERSION=0.8.8
ADD ${GITHUB_BASEURL}/itzg/easy-add/releases/download/${EASY_ADD_VERSION}/easy-add_${TARGETOS}_${TARGETARCH}${TARGETVARIANT} /usr/bin/easy-add
RUN chmod +x /usr/bin/easy-add

ARG RESTIFY_VERSION=1.7.5
RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
  --var version=${RESTIFY_VERSION} --var app=restify --file {{.app}} \
  --from ${GITHUB_BASEURL}/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz

ARG RCON_CLI_VERSION=1.6.9
RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
  --var version=${RCON_CLI_VERSION} --var app=rcon-cli --file {{.app}} \
  --from ${GITHUB_BASEURL}/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz

ARG MC_MONITOR_VERSION=0.14.1
RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
  --var version=${MC_MONITOR_VERSION} --var app=mc-monitor --file {{.app}} \
  --from ${GITHUB_BASEURL}/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz

ARG MC_SERVER_RUNNER_VERSION=1.12.3
RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
  --var version=${MC_SERVER_RUNNER_VERSION} --var app=mc-server-runner --file {{.app}} \
  --from ${GITHUB_BASEURL}/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz

ARG MC_HELPER_VERSION=1.39.11
ARG MC_HELPER_BASE_URL=${GITHUB_BASEURL}/itzg/mc-image-helper/releases/download/${MC_HELPER_VERSION}
# used for cache busting local copy of mc-image-helper
ARG MC_HELPER_REV=1
RUN curl -fsSL ${MC_HELPER_BASE_URL}/mc-image-helper-${MC_HELPER_VERSION}.tgz \
  | tar -C /usr/share -zxf - \
  && ln -s /usr/share/mc-image-helper-${MC_HELPER_VERSION}/bin/mc-image-helper /usr/bin

VOLUME ["/data"]
WORKDIR /data

STOPSIGNAL SIGTERM

# End user MUST set EULA and change RCON_PASSWORD
ENV TYPE=VANILLA VERSION=LATEST EULA="" UID=1000 GID=1000

COPY --chmod=755 scripts/start* /
COPY --chmod=755 bin/ /usr/local/bin/
COPY --chmod=755 bin/mc-health /health.sh
COPY --chmod=644 files/* /image/
COPY --chmod=755 files/auto /auto

RUN curl -fsSL -o /image/Log4jPatcher.jar https://github.com/CreeperHost/Log4jPatcher/releases/download/v1.0.1/Log4jPatcher-1.0.1.jar

RUN dos2unix /start* /auto/*

ENTRYPOINT [ "/start" ]
HEALTHCHECK --start-period=30s --retries=24 --interval=60s CMD mc-health

#WSL USER
ARG USERNAME=<コンテナユーザ名>
ARG GROUPNAME=<コンテナグループ名>
ARG UID=<WSL UID>
ARG GID=<WSL GID>
RUN groupadd -g $GID $GROUPNAME && \
    useradd -m -s /bin/bash -u $UID -g $GID $USERNAME
    

3.2.docker-compose.yml

<WSLユーザ名>は、現在のWSLのユーザ名を記載してください。

version: "3"

services:
  # Application
  minecraft:
    image: minecraft-server
    container_name: minecraft
    ports:
      - 25565:25565
    environment:
      EULA: "TRUE"
      MEMORY: 2G
      TYPE: MOHIST
      VERSION: 1.20.1
      MOHIST_BUILD: 119
    volumes:
      - /home/<WSLユーザ名>/Minecraft/data:/data
      - /etc/timezone:/etc/timezone:ro
    user: "${UID_GID}"
    tty: true
    stdin_open: true
    restart: always
    deploy:
      resources:
        limits:
          memory: 2.5G

  # Backup
  backup:
    image: itzg/mc-backup
    depends_on:
    - minecraft
    environment:
      - TZ=Asia/Tokyo
      - INITIAL_DELAY=2m
      - BACKUP_INTERVAL=1h
      - PRUNE_BACKUPS_DAYS=3
    volumes:
      - /home/<WSLユーザ名>/Minecraft/data:/data:ro
      - /home/<WSLユーザ名>/Minecraft/backups:/backups
      - /etc/timezone:/etc/timezone:ro
    user: "${UID_GID}"
    network_mode: "service:minecraft"

なお今回は、以前遊んでいたハイブリッドサーバのMOHISTを選択しております。
バニラや他のMODサーバも選択できますので、合わせて変更してください。

4.構築

今回作業用ディレクトリは下記を使用しております。
ホストから:\wsl.localhost\Ubuntu-24.04\home<WSLユーザ>\Minecraft\docker
WSLから:/home/<WSLユーザ>/Minecraft/docker

ディレクトリ構成(WSL)

DockerイメージのClone

git clone https://github.com/itzg/docker-minecraft-server.git
git clone

WSLのUID・GIDの確認

id
UID GID確認

DockFileの<WSL UID><WSL GID>に、確認したUID・GIDの数値を入力します。
(上記の図では1002)
<コンテナユーザ名><コンテナグループ名>も、上記と合わせて問題ありません。
(上記の図ではモザイクのところ)

#WSL USER
ARG USERAME=<コンテナユーザ名>
ARG GROUPNAME=<コンテナグループ名>
ARG UID=<WSL UID>
ARG GID=<WSL GID>

DockFileを作成したら、git cloneによって作成されたdocker-minecraft-serverディレクトリに上書きします。

DockFileの上書き

続いて、docker-compose.ymlです。
<WSLユーザ名>に、idコマンドで調べた名前を記載してください。
(上記の図ではモザイクのところ)

    volumes:
      - /home/<WSLユーザ名>/Minecraft/data:/data
      - /etc/timezone:/etc/timezone:ro
    volumes:
      - /home/<WSLユーザ名>/Minecraft/data:/data:ro
      - /home/<WSLユーザ名>/Minecraft/backups:/backups
      - /etc/timezone:/etc/timezone:ro

"${UID_GID}"に、確認したUID・GIDの数値を入力します。
上記の図の場合、「user: "1002:1002"」 となります。
「"」「:」をお忘れなきようご注意ください。

user: "${UID_GID}"

Dockerfile・docker-compose.ymlの準備ができたら、
まずはイメージのビルドから行います。

docker build ./ -t minecraft-server
イメージのビルド
DockerDesktop Builds
DockerDesktop Images

続いて、コンテナを作成・起動します。

docker compose up -d minecraft
コンテナの作成・起動
DockerDesktop Containers

初回起動時はDataディレクトリに環境が構築されるため、
負荷・時間がかかります。

DockerDesktop コンテナ Logs
dataディレクトリ

※dataディレクトリにファイルが作成されない場合
docker-compose.ymlのvolumesの指定が誤っている可能性があります。
設定を見直してください。

※dataディレクトリにWindowsからファイル操作を行うと権限エラーになる場合
DockFileのUID・GIDがWSLのUID・GIDと異なっている可能性があります。
設定を見直してください。
なお、権限エラーになってDataフォルダが削除できない場合は、
管理者権限(sudo)にて削除を行ってください。

コンテナを停止・削除したい場合は下記コマンドを入力してください。
(イメージ及びDataフォルダ内データは残ります。)

docker compose rm -fsv minecraft

コンテナに接続したい場合は下記コマンドとなります。

docker container exec -it minecraft /bin/bash
コンテナに接続

最後に、WindowsFirewallの設定を行います。
Java版はTCP25565がデフォルトとなっています。

受信の規則から、新しい規則を選択します。

受信の規則 → 新しい規則

規則の種類は「ポート」

ポート

TCPの25565番を指定します。

TCP 25565

操作は、接続を許可する。

接続を許可する

プロファイルはご使用の環境に合わせて選択してください。

プロファイル

名前・説明はわかりやすい文字列を入力してください。

名前

5.接続テスト

dataフォルダの構築が完了した頃を見計らって、
他のPCからMinecraftの接続を試みてください。

指定はIPアドレスとなります。

接続先サーバ

6.最後に

よきマイクラライフをお過ごしください!

この記事が気に入ったらサポートをしてみませんか?