LoginSignup
0
0

DockerでスリムなJREとMinecraftする

Last updated at Posted at 2023-11-26

Docker ってなんや

とりあえずいろいろ動くVM
LinuxだけでもなくOSから対応CPUからいろいろある

Dockerfile がmakeファイル的な位置
いろいろそろったimageファイルにデータなどを突っ込んで、あとは実行するだけにしておく
手順はキャッシュされるので同じ手順では再利用されるっぽい
image がまとめたLinuxっぽいイメージファイル 1イメージ 1アプリ 1VM的なきまり?
imageをもとにDockerfile で積み重ねることもできる
docker-compose.yaml がそれをまとめて実行する、仮想ネットワークもあるよ
app,Web,DBなど数個まとめてあと環境変数など少々追加する

image から実行すると container が作られる、一般的なファイルシステム的なものにVMを合わせた感じか

データはどうするの

VMではない親からファイルをマウントして使う、のが一般的な感じか
他の手段で突っ込んでもいいが、VMは割と短命なこともあるので親システムのファイルなどで置いておくのがよく使われる手法

インストール

公式にいろいろまとまっているので簡単
Windows, RaspberryPi, CentOS Stream などに入れてみた

RaspberryPi では

$ curl -fsSL https://get.docker.com -o get-docker.sh
# sh ./get-docker.sh
# systemctl start docker
# systemctl enable docker

たぶんこんなかんじ
docker-compose というコマンドを使っているのをよくみるが、最新は docker compose だったりするよ

Minecraft Serverか何か作ってみる

フォルダを作る

$ mkdir minecraft

中に Dockerfile を作る

FROM eclipse-temurin:17 as jre-build
RUN jlink \
    --add-modules java.management,java.naming,java.desktop,jdk.zipfs \
    --no-man-pages \
    --no-header-files \
    --compress=2 \
    --output /javaruntime

FROM debian:buster-slim
ENV JAVA_HOME=/opt/java/openjdk
ENV PATH "${JAVA_HOME}/bin:${PATH}"
COPY --from=jre-build /javaruntime $JAVA_HOME
RUN mkdir /opt/app
ENV EULA true
ADD https://piston-data.mojang.com/v1/objects/5b868151bd02b41319f54c8d4061b8cae84e665c/server.jar /opt/app/server.jar
WORKDIR /opt/app
RUN ["java", "-Xmx2048M", "-jar", "/opt/app/server.jar", "nogui"]
RUN echo eula=$EULA > /opt/app/eula.txt
CMD ["java", "-Xmx2048M", "-jar", "/opt/app/server.jar", "nogui"]
EXPOSE 25565

docker-compose.yaml も作る

version '3'
services:
  mcserver:
    build: .
    volumes:
      - ./world:/opt/app/world
    ports:
      - '25565:25565'

とりあえずこれだけ。フォルダの中で

docker compose up
docker compose up -d

で実行 -d をつけるとデーモンとして裏で動くことになる
付けないと Ctrl - C でも止まるが止まるのは mcserverの部分だけなのでどちらの場合でも

docker compose down

で仮想ネットワークなども停止しよう

docker compose stop
docker compose start

でなんとなく一時停止的なもの
実行中のcomponentが残るか消えるのかの違いがある。
消えても docker-compose.yaml で指定した world のデータは残るので Minecraft はどっちでもいいよということになる。
コンポーネントを残すなら消してしまえ、というのでいいかもしれない。

Dockerfile の解説

1行目のFROM から 次の FROM まではいきなり特殊なことをしている
JDKなimageからJREを作る、という1つめの環境。jre-build と名付けられているらしい。必要なmoduleの調べ方はまた別のおなはし。
2つめのFROM は 最小Linuxっぽいところを使う宣言
ENVで環境変数を設定してCOPY でJREを元のjre-buildの環境からコピーする
1つめのjre-build 環境は捨てられるので出来上がりのimageはコンパクトになる。
RUN mkdir /opt/app からが Minecraft 環境づくり。手前をばっさり切って

FROM eclipse-temurin:17-jre

としてもいいし21でもいいがimageファイルのサイズはふくらむ。
Minecraft の server.jar この場合は1.20.2 を https://www.minecraft.net/ja-jp/download/server から取ってきて、1回実行して必要なファイルを吐き出させてみた。ライセンス承認の書き込みをしてここまででimageファイルになる。
最後のCMD行は実行用。
EXPOSEは使用するポート番号。

docker-compose.yaml の解説

こちらは単純
よく知らないがバージョンがあり
サービスとして mcserver という名を付けたものを動かすよ
普通なら web とか db とか tomcat とか名付けて分けるがここでは1つ
image はどこ、ということで build: . としておけば その場にある Dockerfile を使って初回に image を作る。あらかじめ image がある場合はそれをimage: で指定するだけ。
あとはフォルダとポートを適当に指定する。フォルダは親側のファイルが反映される。親側になければ作られる。VM側にファイルがあっても見えなくなる。
ポートは仮想ネットワーク上のものを親側のポートとして見えるようにする。Dockerfile側でEXPOSE指定してあるもの。同じ番号で繋ぐ必要はない。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0