Spring Boot アプリケーションが作成されました。ローカル マシンでは問題なく動作していますが、今度はアプリケーションを別の場所にデプロイする必要があります。一部のプラットフォームでは、jar ファイルを直接送信すると、それがデプロイされます。場所によっては、仮想マシンを起動し、そこにソース コードをダウンロードしてビルドし、実行することができます。ただし、ほとんどの場合、コンテナーを使用してアプリケーションをデプロイする必要があります。ほとんどの場合、Docker はコンテナー内でイメージを構築して実行するために使用されます。また、jar ファイルを一部のプラットフォームにアップロードすると、アプリケーションは内部のコンテナ内で実行されます。
したがって、このブログでは、特定の Spring Boot アプリケーション用の Docker イメージを構築する 3 つの異なる方法を見ていきます。始めましょう:
あらゆるアプリケーションの Docker イメージを構築する単純かつ不十分な方法は、イメージ内の jar ファイルをコピーし、java -jar コマンドを使用して実行する単純な Dockerfile を使用することです。
プロジェクトのルートに置くことができる Dockerfile は次のとおりです:
FROM eclipse-temurin:21-jre-ubi9-minimal ARG JAR_FILE COPY ${JAR_FILE} application.jar ENTRYPOINT ["java", "-jar", "/application.jar"]
使用する jar ファイルの場所である 1 つの引数 JAR_FILE を指定しました。
上記の Dockerfile を作成した後、以下の手順を使用して Docker イメージを作成します。
Spring Boot プロジェクトの jar ファイルをビルドします:
./gradlew bootJar # For Gradle build system
または
./mvnw spring-boot:build-jar # For Maven build system
Dockerfile を使用して、最新の jar ファイルを使用して Docker イメージを構築します。以下のコマンドでは、{IMAGE_NAME} を必要なイメージ名に置き換え、{JAR_FILE} を生成された jar ファイルへのパスに置き換えます。イメージ名には、-mycompany/product-service:0.0.1-SNAPSHOT:
のようなタグも含まれています。
docker build --build-arg JAR_FILE={JAR_FILE} --tag {IMAGE_NAME} .
次のコマンドを使用して、Docker イメージがビルドされたかどうかを確認します。上記のコマンドで指定した名前の画像が表示されるはずです:
docker images
Spring Boot uber jar を Docker イメージとしてパッケージ化することは可能かつ簡単ですが (前の方法で説明したように)、ファット jar をそのまま Docker イメージにコピーして実行することには多くの欠点があります。例えば、
Spring Boot バージョンをアップグレードするよりもコードをコンパイルする頻度が高いため、物事をもう少し分離することをお勧めします。これらの jar ファイル (めったに変更されない) をアプリケーション層の前の層に配置すると、Docker は多くの場合、最下層のみを変更する必要があり、残りはキャッシュから選択できます。
階層化された Docker イメージを作成するには、まず階層化された jar を作成する必要があります。現在、Gradle と Maven ではデフォルトで有効になっています。次の設定を使用して、階層化された jar の動作を有効または無効にできます:
// build.gradle tasks.named("bootJar") { layered { enabled = false } }
// build.gradle.kts tasks.named("bootJar") { layered { enabled.set(false) } }
org.springframework.boot spring-boot-maven-plugin true
レイヤーの作成方法を調整することもできます。 Gradle または Maven の設定についてはドキュメントを参照してください。
以下は Dockerfile です。これを使用すると、階層化された jar を利用し、Spring Boot アプリケーションの階層化された Docker イメージを作成できます。
# Perform the extraction in a separate builder container FROM eclipse-temurin:21-jre-ubi9-minimal AS builder WORKDIR /builder # This points to the built jar file in the target folder # Adjust this to 'build/libs/*.jar' if you're using Gradle ARG JAR_FILE=target/*.jar # Copy the jar file to the working directory and rename it to application.jar COPY ${JAR_FILE} application.jar # Extract the jar file using an efficient layout RUN java -Djarmode=tools -jar application.jar extract --layers --destination extracted # This is the runtime container FROM eclipse-temurin:21-jre-ubi9-minimal WORKDIR /application # Copy the extracted jar contents from the builder container into the working directory in the runtime container # Every copy step creates a new docker layer # This allows docker to only pull the changes it really needs COPY --from=builder /builder/extracted/dependencies/ ./ COPY --from=builder /builder/extracted/spring-boot-loader/ ./ COPY --from=builder /builder/extracted/snapshot-dependencies/ ./ COPY --from=builder /builder/extracted/application/ ./ # Start the application jar - this is not the uber jar used by the builder # This jar only contains application code and references to the extracted jar files # This layout is efficient to start up and CDS friendly ENTRYPOINT ["java", "-jar", "application.jar"]
階層化された Docker イメージを構築する手順は、基本的な Docker イメージを構築する手順と同じです。そちらをご参照ください。
Dockerfile を作成せずに Docker イメージを作成できると言ったらどうなるでしょうか? Cloud Native Buildpack を使用して、Gralde または Maven プラグインから直接 Docker イメージをビルドできます。一部のプラットフォーム (Heraku や Cloud Foundry など) は、Buildpack を使用して、提供された jar ファイルを実行可能なイメージに変換します。
Spring Boot には、Maven および Gradle に対する直接のビルドパック サポートが含まれています。追加のプラグインを含める必要はありません。以下のコマンドを実行するだけです:
./gradlew bootBuildImage # For gradle build system
または
./mvnw spring-boot:build-image # For maven build system
上記のコマンドは、デフォルト名 {PROJECT_NAME}:${PROJECT_VERSION} のイメージを生成します。生成されたイメージの名前を設定したい場合は、以下の手順に従ってください:
次のように、bootBuildImage タスクを構成してイメージの名前を設定できます:
// For build.gradle.kts val imagePrefix = "javarush" val dockerImageName = "docker-example" tasks.named("bootBuildImage") { imageName.set("${imagePrefix}/${dockerImageName}:${version}") }
// For build.gradle def imagePrefix = "javarush" def dockerImageName = "docker-example" tasks.named("bootBuildImage") { imageName = "${imagePrefix}/${dockerImageName}:${version}" }
次のように、別のイメージ名を使用するように spring-boot-maven-plugin を設定できます:
... javarush org.springframework.boot spring-boot-maven-plugin ${imagePrefix}/${project.artifactId}:${project.version}
イメージを構築するコマンドの実行中にイメージの名前を定義することもできます。
./gradlew bootBuildImage --imageName=javarush/docker-example:1.0.0 # For grade build system ./mvnw spring-boot:build-image -Dspring-boot.build-image.imageName=javarush/docker-example:1.0.0 # For maven build system
Gradle または Maven プラグインをさらに構成するためのドキュメントを参照できます。
これは、Spring Boot アプリケーションの Docker イメージを作成するための私の頼りになる方法です。
Docker イメージを作成したら、それが期待どおりに動作することを確認する必要があります。イメージが作成されたことを確認したら、docker run コマンドを使用して直接実行できます。例えば、
docker run -p "8080:8080" {IMAGE_NAME}
しかし、これは実稼働アプリケーションでの画像の使用方法ではありません。 Docker Compose は、複数の Docker イメージを実行および管理するために使用されます。
このブログでは、さまざまな方法を使用して Spring Boot アプリケーション用の Docker イメージを構築する方法について説明しました。アプリの Docker イメージを構築できることは、イメージが配信されるものであるため、知っておく必要があるスキルです。最後まで記事を読んでいただきありがとうございます。それは有り難いです。次でお会いしましょう。いつものように、フィードバックや提案は大歓迎です。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3