Docker って何
よくわからないが仮想なような仮想でないような環境。コンテナ、と呼ばれる界隈。
CPUが仮想化を太くサポートするようになってきたのでできるのかも。Linux で chroot 的なものの延長でまるっと分離したもの、が正解なのかな。
VMっぽいがLinuxカーネルの機能でいろいろ閉じ込めただけのもの。
一般的なLinux VMとの違い
利点
欠点
imageを作るのが簡単かどうかは規模によってだったりいろいろあるので。
Docker と Docker Compose がある。
互換環境は RedHat の Podman があるのでこっちからはじめてもいい。Podなどが扱える。
Dockerfile というのでインストール手順を網羅する、それを使って環境を手早く構築しようというもの。RPMとかそういうのをコンテナ単位でするパッケージ。
こんな感じで複数のイメージファイルがあり、それぞれDockerfileなどで構築する。
TomcatのDockerfile にはJavaランタイムのimageファイルの指定と、Tomcatのアーカイブを配置する方法、実行するコマンドが書かれているだけ。
Tomcatのimage ファイルにはディストリビューション(Ubuntu系?)、Java、Tomcatの3つのimageの積み重ねでできている。OSにアプリをインストールしていくのとは逆で内側(参照先)がOS、外側が追加したアプリ、のような感じになる。ので基本的に1image 1アプリ。Tomcatなどは複数アプリを詰め込めたりするかもしれないしアプリ単位で複数Tomcatに分ける場合もあるかもしれない。
できたものもimage というかたちでまとめられる。構築手順ごとに差分での管理もされている。
OS? 基本的にLinux の各種ディストリビューションをベースにしていてDebian, Ubuntu が多いように見えるが、CentOS, Windowsなんかもあるっぽい。WindowsのimageはWindows上のDockerでしか使えないのかも。LinuxベースのimageはWindows, Linux, Mac どこでも使える感じになっている。CPUが違うRaspberryPiなどでもimageがあればほぼそのまま使える。WindowsではOSのVM環境(WSL)を使ってLinuxを実行している。
image は基本的にアプリ単位で1つ作られる。PostgreSQL と Tomcat と HTTPD なら 3つのimageを別々に実行するという感じになる。複数まとめてしまうとimageとして使いにくくなるのかも。
image が出来上がれば、コンテナという単位で実行する。Docker 1つで1コンテナ実行なのかな。
imageは追加して編集できるので、ある程度出来上がっているものをダウンロードしていくつかファイルを追加して最終的なimageを仕上げるというかたちが一般的。
OS image → プラットフォームランタイム imageなど → 個別のデータ → image
仮想環境は仮想ネットワークで繋がっている。ファイルもマウントしたりコピーしたり、比較的自由に行き来できる。
まとめて管理もできる。
Docker Composeは以前は独立したコマンドだったが、今はDocker のプラグインでサブコマンドに収まっている。
複数Docker image をまとめて実行できる docker-compose.yml というファイルを作る。
Tomcatとその裏で使うPostgreSQLと、Dockerではバラバラに管理していたようなものをまとめて実行できるので楽になる。
Dockerfile でできることも少々できるので多少のカスタマイズもできる。
imageファイルを直接指定したり、Dockerfileを指定してその場でimageを作って使ったり、組み合わせはいろいろ。
Docker Engine はDocker の中心的なもの。
Docker Desktop は、Docker と Docker Compose 他いろいろを詰め込んだツール。
他にもいろいろあるが、DocckerとDocker Compose がわかればいいと思う。
Docker, Docker Compose をインストールしてみようかな
Windows は Docker Desktop というかたちでまとまっているのでそれを利用するのがよさそう。
Linux はインストールスクリプトが用意されているので数行実行するだけで使える。Ubuntu などにはDocker Desktopもある。
https://docs.docker.com/engine/install/ ここから開いてみよう。
Desktop ( Docker Desktop ) と Server ( Docker Engine ) があるので好きな方を選ぶ。Linux は Docker Engine でいいのかな。
CentOSっぽい例
必要ないものを消す
docker の古いものの他、互換環境などを消しておくといいようで、RedHat の podman ? などを消しておく。
# sudo yum remove podman runc
CentOS などではインストール用スクリプトが用意されているので次のコマンドでインストールできる。curl がだめなら wget ?
$ curl -fsSL https://get.docker.com -o get-docker.sh $ sudo sh ./get-docker.sh
インストールができたらDocker Engine を実行したりする (CentOS 例)
$ sudo systemctl start docker
$ sudo systemctl enable docker
これくらいでいいかな。docker compose はハイフンなし(docker compose)と古いハイフンあり(docker-compose)があるので、ハイフンなしで使える。
Windowsの場合はWSL2が入っているとよいかも。以下(略)
互換っぽいのでこちらでもいいのかも
[Podman] 別ページにしておく
ソースファイル相当 Dockerfile
パッケージ的な image
実行環境 container
この3段階ぐらいがある。imageを元にして新しいDockerfile を組んでいくこともできる。
Docker Compose を使って簡単なMinecraft Server (Java版)を立ててみようかと思った。Ryzen Windows 11とRaspberryPi 4Bで動くことを確認した。
docker用フォルダ的なものを用意、中に今回用の minecraftとか適度な名前でフォルダを作る。
Dockerfile はeclipse-temurin のJRE imageをベースにする。
FROM eclipse-temurin:17-jre RUN mkdir /opt/app ADD https://piston-data.mojang.com/v1/objects/5b868151bd02b41319f54c8d4061b8cae84e665c/server.jar /opt/app/server.jar RUN echo eula=true > /opt/app/eula.txt WORKDIR /opt/app EXPOSE 25565 CMD ["java", "-Xms2048M", "-jar", "/opt/app/server.jar", "nogui"]
としてみる。EULAは同意している前提。 server.jar 1.20.2の例。バージョンが変わっていればMinecraft 公式のserver.jarのURLをコピペするとよい。
JAVA版サーバー、 minecraft server 1.x.x.jar のところのURLをコピー。
JDKはMinecraft最新版は17が必要、21でも動いた。バニラはJREでも動くらしい。OpenJDKよりもtemurinの方が小さいかも。EXPOSEはMinecraft Java Editionが使うport番号。
次に docker-compose.yaml を作る
version: '3' services: mcserver: build: . volumes: - ./world:/opt/app/world ports: - '25565:25565'
とりあえずこれだけでよい。マップデータが world に保存されるので、とりあえずそこだけ残っていればいい。
build: . で Dockerfile から作ったimage をそのまま使うことにしている。image: で imageを直指定してもいい。
コマンドラインやシェルでファイル2つだけ入ったminecraft フォルダに移動する。同じフォルダで実行しなければいけないので注意。
docker compser up -d
実行。Dockerfile からimageが作られ、imageからcontainerが作られ、そのまま実行される。 -d はデーモンとして実行するオプション。なければログなどを出すので最初は -d なしで実行してみてもいい。
RaspberryPi で temurinとserver.jar の同時ダウンロードが失敗するので wget であらかじめ取ってきてから server.jar をファイルからコピーするようにDockerfile を変更したり。
$ wget https://piston-data.mojang.com/v1/objects/5b868151bd02b41319f54c8d4061b8cae84e665c/server.jar
ADD ./server.jar /opt/app/server.jar
無事実行できると仮想ネットワークも作られて、VMは全部そこに繋がるかたちになる。名前は docker-compose.yaml の services の下で指定している名前(mcserver)になる。仮想環境の外からは見えないのでMinecraftからはサーバーアドレスにlocalhostや外側のPCのアドレスなどを指定して繋がることを確認してみる。
docker compose down で終了。サーバ(container)の環境は消してしまう。
停止したい場合は docker compose stop、再開したい場合は docker compose start を使うとcontainerの環境が残る。
up と down の組は container を作り直し、stop と start では container が残る。
up 2度目以降は作ったimageファイルを参照するのでDockerfileは見なくなるかも。imageを消せば再度作り直すこともできる。
docker-compose.yaml の volumes で world をOS側のファイルシステムを使うようにしているので最低限のデータはcontainer を消しても残るようにしてみた。作り直したい場合はdownした状態で worldを消すと世界が消える。
あとは環境設定など追加したい情報を足していけばいろいろとできるはず。
実行だけでなく、インストールまでまとめてできるのでいろいろ楽になる。
paparmc版もそれほど違わない。
jarファイルの入れ換えと、world が world_nether, world_the_end の3つになるくらいかな。あとは plugins と logs を追加してみるか。挑戦してみるといい。
docker images で一覧が出てきます。
docker build -t タグ名など Dockerfileの位置
docker build -t minecraft-temurin-mcserver .
こんな感じで同じ名前にすれば次から使うimageファイルが変わるはず。
docker images で一覧が出てきます。
使っていないimage は消してしまうといいのかも
docker rmi imageid
消したいimage の imageid で指定します
Minecraft が動いたのでJDK,JREをもっと小さくしてみようかと思います。
jlink で必要なパッケージを収めたJREを作ることができます。eclipse-temurin の Docker ページにある手順どおりですが。Dockerfile の FROM 1行を消して次のように置き換えます。
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
imageに収まるのは2つめのFROMからなのでJDKはJREができれば捨てられます。
これで300MBくらいあったところから180MBくらいのimageに減っているはずです。
PaperMEのpaper の場合は jdk.security.auth,java.sql も追加すると動いていました。pluginなど入れるのであればJDKから削らなくていいかもしれません。