やること
Springプロジェクトをdockerコンテナ上で動かす
使用するもの
- Springプロジェクト(DB接続なし、簡素なものがよい)
- 例:「ファイルダウンロードアプリ」
- https://github.com/yusuke/text-file-download
- 起動させて、アクセスするとテキストがファイルダウンロードするだけ
- Docker(ver 20.10以上)
※注意:勉強記録として失敗した内容も残しています
実施記録
こちらの記事を参考に実施
SpringBootのアプリケーションをDockerコンテナで動かす
手順
- DockerFileの作成
- GradleでJarファイル作成
- Dockerイメージをビルドし、コンテナ作成
docker build
- コンテナ起動
docker run
- アプリ実行
DockerFileの作成、GradleでJarファイル作成
./gradlew clean build
既存のビルド結果を削除し、クリーンな状態からビルドを実行しjarファイルが生成される。
Dockerイメージをビルドし、コンテナ作成
PS C:\Users\****\IdeaProjects\text-file-download> docker -v
Docker version 20.10.12, build e91ed57
PS C:\Users\****\IdeaProjects\text-file-download> docker build -t spring-container-sample .
[+] Building 0.0s (2/2) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 2B 0.0s
=> CANCELED [internal] load .dockerignore 0.0s
=> => transferring context: 0.0s
failed to solve with frontend dockerfile.v0: failed to read dockerfile: open
/var/lib/docker/tmp/buildkit-mount738487121/Dockerfile: no such file or directory
PS C:\Users\****\IdeaProjects\text-file-download>
失敗しちゃった。
原因
Dockerfile: no such file or directory
Dockerfileのファイル名は、頭文字以外は小文字が正しい
修正して再ビルド
PS C:\Users\****\IdeaProjects\text-file-download> docker build -t spring-container-sample .
[+] Building 152.9s (8/8) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 384B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/openjdk:17 3.0s
=> [1/3] FROM docker.io/library/openjdk:17@sha256:528707081fdb9562e 149.3s
=> => resolve docker.io/library/openjdk:17@sha256:528707081fdb9562eb8 0.0s
=> => sha256:98f0304b3a3b7c12ce641177a99d1f3be56f532473a5 954B / 954B 0.0s
=> => sha256:5e28ba2b4cdb3a7c3bd0ee2e635a5f6481682b77 4.45kB / 4.45kB 0.0s
=> => sha256:38a980f2cc8accf69c23deae6743d42a87eb3 42.11MB / 42.11MB 33.6s
=> => sha256:de849f1cfbe60b1c06a1db83a3129ab0ea397 13.53MB / 13.53MB 18.1s
=> => sha256:a7203ca35e75e068651c9907d659adc721 187.53MB / 187.53MB 145.9s
=> => sha256:528707081fdb9562eb819128a9f85ae7fe000e2f 1.04kB / 1.04kB 0.0s
=> => extracting sha256:38a980f2cc8accf69c23deae6743d42a87eb34a54f023 1.3s
=> => extracting sha256:de849f1cfbe60b1c06a1db83a3129ab0ea397c4852b98 0.4s
=> => extracting sha256:a7203ca35e75e068651c9907d659adc721dba823441b7 3.2s
=> [internal] load build context 0.2s
=> => transferring context: 19.75MB 0.2s
=> [2/3] WORKDIR /app 0.3s
=> [3/3] COPY build/libs/*.jar app.jar 0.1s
=> exporting to image 0.1s
=> => exporting layers 0.1s
=> => writing image sha256:7439c961dba53d6583a3bbeb733ed88c00bfa5ab08 0.0s
=> => naming to docker.io/library/spring-container-sample 0.0s
Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
結果、3分ほど掛かったが成功。
※コマンド補足
- build:Dockerイメージをビルドするよう指示
- -t spring-container-sample:ビルドされるDockerイメージにspring-container-sampleというタグ(名前)を付ける
- .:Dockerビルドコンテキストの場所(Dockerfileへの相対パス)
コンテナ起動し、アプリ実行
PS C:\Users\****\IdeaProjects\text-file-download> docker run -d -p 8080:8080 spring-container-sample spring-container-sample
faf2392867f7da84f0d5d79729961db1ccf4a19a4f2f74f65e9199d745852deb
PS C:\Users\****\IdeaProjects\text-file-download>
あれ...起動してない。一覧みても、デスクトップアプリ見ても。
デスクトップアプリの方にエラーが出ていた
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/example/textfiledownload/TextFileDownloadApplication has been compiled by a more recent version of the Java Runtime (class file version 65.0), this version of the Java Runtime only recognizes class file versions up to 61.0
(省略)
__下記は訳
スレッド「メイン」java.lang.UnsupportedClassVersionError での例外: org/example/textfiledownload/TextFileDownloadApplication は、より新しいバージョンの Java ランタイム (クラス ファイル バージョン 65.0) によってコンパイルされています。このバージョンの Java ランタイムは、それより上のバージョンのクラス ファイルのみを認識します。 61.0まで
Gradle.buildのJavaのバージョンを確認したら21だった。
build.gradle
...
java {
sourceCompatibility = '21'
}
Dockerfileに記載したjdkのバージョンを上げて再ビルドして再起動してみる。
PS C:\Users\****\IdeaProjects\text-file-download> docker run -d -p 8080:8080 --name spring-container-sample spring-container-sample
b8f08998b3a05b8a3c8bc7228abe452f88f0e5b41ce041118e3b1ca204605c7b
PS C:\Users\****\IdeaProjects\text-file-download> docker container ls -q
b8f08998b3a0
コンテナIDが表示され、立ち上がった気がする。
http://localhost:8080/download へアクセス
>成功!アプリが実行され、テキストファイルがDownloadされました。
コンテナの停止、削除
不要になったら削除しないと、容量をどんどん食ってしまうため停止(また削除)。
PS C:\Users\****\IdeaProjects\text-file-download> docker stop spring-container-sample
spring-container-sample
PS C:\Users\****\IdeaProjects\text-file-download>
PS C:\Users\****\IdeaProjects\text-file-download> docker container ls -q
PS C:\Users\****\IdeaProjects\text-file-download> docker rm spring-container-sample
spring-container-sample
PS C:\Users\****\IdeaProjects\text-file-download>
参考記事
SpringBootのアプリケーションをDockerコンテナで動かす
(https://qiita.com/ke_suke0215/items/1b0128c140dd051b5993)