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指定してあるもの。同じ番号で繋ぐ必要はない。