スプリングブーツで構築された伝説的なPetClinicアプリのコンテナ化

最新のものごと 動物の健康レポート、世界人口の半分以上(数十億世帯)がペットを飼っていると推定されています。 米国だけでも、これは世帯の70%に当てはまります。

ペットの個体数の増加は、獣医のケアの必要性が高まることを意味します。 調査で 世界小動物獣医協会(WSAVA)によると、獣医協会の4分の3は、獣医医療製品へのアクセスが標準以下であると、患者のニーズを満たし、質の高いサービスを提供する能力を妨げていると共有しました。

画像7
ソース: スプラッシュ解除

ザ 春の枠組み チームはこの課題に取り組んでいます ペットクリニックアプリ春 PetClinicは、Spring Bootのデータベース指向機能を実証するために開発されたオープンソースのサンプルアプリケーションです。 春のMVCそして、 春のデータフレームワーク.これは、このSpringスタックに基づいており、 メイヴン.

ペットクリニックの公式版 また、これらのテクノロジーがどのように連携するかについても説明します。 春のデータJPA. 全体として、スプリングペットクリニックコミュニティは維持しています 9つのペットクリニックアプリフォーク そして 18 リポジトリ ドッカーハブの下。 ペットクリニックアプリの仕組みを学ぶには、 Springの公式リソースをチェックしてください.

ペットクリニックアプリの展開は簡単です。 できます リポジトリのクローンを作成するJAR ファイルをビルドし、コマンドラインから実行します。

git clone https://github.com/dockersamples/spring-petclinic-docker cd spring-petclinic-docker ./mvnw package java -jar target/*.jar

Yその後、ペットクリニックにアクセスできます。 http://localhost:8080 ブラウザで:

画像1

PetClinicアプリにコンテナ化が必要なのはなぜですか?

PetClinicのようなSpring Bootアプリで開発者が直面する最大の課題は、並行性、つまり同時に多くのことを行う必要性です。 Spring Boot アプリは、未使用の依存関係を持つデプロイ バイナリ サイズを不必要に増やす可能性もあります。 これにより、JARが肥大化し、パフォーマンスに影響を与えながらアプリケーション全体のフットプリントを増やす可能性があります。

その他の課題には、カスタマイズされたロギングメカニズムを構築する際の急な学習曲線と複雑さが含まれます。開発者はこれらの問題の解決策を模索してきました。残念ながら、 Spring Bootの公式リポジトリ 内の Docker Composeファイル でさえ、 データベースをコンテナ化する方法を示していますが、これを完全なアプリケーションに拡張していません。

これらの欠点をどのように相殺できますか? Dockerは、プロジェクトごとに選択したツール、アプリケーションスタック、デプロイ環境を使用して自由に革新できるようにすることで、ワークフローを簡素化および高速化します。 Spring Boot アーティファクトは、Docker コンテナー内で直接実行できます。 これにより、マイクロサービスをすばやく作成できます。 このガイドは、PetClinicソリューションを完全にコンテナ化するのに役立ちます。

ペットクリニックアプリケーションのコンテナ化

Docker は、Spring アプリをコンテナ化することで、Spring Boot アプリケーション、ランタイム、構成、OS レベルの依存関係全体をバンドルすることができます。 これには、クロスプラットフォームのマルチアーキテクチャWebアプリケーションを出荷するために必要なすべてのものが含まれます。 

Docker の公式イメージを使用して、Docker コンテナー内でこのアプリを簡単に実行する方法について説明します。 まず、次のことを行う必要があります ダウンロード ドッカーデスクトップ および cインストールプロセスを完了します。 これにより、使いやすい UI が提供され、後で活用する Docker CLI が含まれています。

Docker は Dockerfile を使用して各イメージの layers. 各レイヤーには、基本イメージの標準構成に起因する重要な変更が格納されます。  SpringプロジェクトでDockerfile を作成しましょう。

ドッカーファイルの構築

ある  Dockerfile は、Docker イメージをアセンブルするための手順を含むテキスト ドキュメントです。 Dockerに次のコマンドを実行してイメージをビルドさせると、 docker build コマンドを実行すると、Docker はこれらの命令を読み取って実行し、結果として Docker イメージを作成します。

ドッカーファイルを作成するプロセスを見ていきましょう 私たちのアプリケーションのために。まず、Springプロジェクトのルートに次の空 Dockerfile を置きます。

touch Dockerfile

次に、基本イメージを定義する必要があります。

アップストリームの OpenJDK イメージは JRE を提供しなくなったため、公式の JRE イメージは生成されません。 公式のOpenJDKイメージには、 Oracle または 関連するプロジェクトリーダーが提供するOpenJDKの「バニラ」ビルドが含まれているだけです。そうは言っても、代替手段が必要です!

ビルドに適したJDKで最も人気のある公式イメージの1つは.Eclipse TemurinEclipse Temurin プロジェクトは、ランタイム・バイナリーおよび関連テクノロジーの構築をサポートするコードとプロセスを提供します。 Temurinは、高性能、エンタープライズキャリバー、クロスプラットフォームです。

FROM eclipse-temurin:17-jdk-jammy

次に、イメージのアプリケーション コードを格納するディレクトリをすばやく作成しましょう。 これは、アプリケーションの作業ディレクトリとして機能します。

WORKDIR /app

以下 COPY 命令はMavenラッパーと私たちの pom.xml ホスト マシンからコンテナー イメージへのファイルCOPY コマンドは 2 つのパラメーターを取ります。 1 つ目は、イメージにコピーするファイルを Docker に指示します。 2つ目は、これらのファイルをコピーする場所をDockerに指示します。 という作業ディレクトリ /appにすべてをコピーします。

 COPY .mvn/ .mvn COPY mvnw pom.xml ./ 

画像内にファイルを取得したら、コマンドを使用して コマンドを実行 ./mvnw dependency:resolve する 。 RUN pom.xmlこれは、(または mvn )依存関係を  .mvnw マシンでローカルで実行するのと同じように機能しますが 、今回は依存関係がイメージにインストールされます。

 RUN./mvnw dependency:resolve 

次に行う必要があるのは、ソースコードを画像に追加することです。  上記のファイルで行った pom.xml のと同じように コマンドを使用します COPY

 COPY src ./src 

最後に、イメージがコンテナ内で実行されるときに実行するコマンドをDockerに指示する必要があります。 これは、 CMD 指示を使用して行います

 CMD ["./mvnw", "spring-boot:run"] 

これがあなたの完全 Dockerfileです:

 FROM eclipse-temurin:17-jdk-jammy WORKDIR /app COPY .mvn/ .mvn COPY mvnw pom.xml ./ RUN ./mvnw dependency:resolve COPY src ./src CMD ["./mvnw", "spring-boot:run"] 

を作成します。 .ドッカー無視 ファイル

ビルドのパフォーマンスを向上させるには、一般的なベスト プラクティスとして、  .dockerignore ファイルと同じディレクトリに Dockerfile.このチュートリアルでは、 .dockerignore ファイルには1行だけを含める必要があります。

ターゲット

この行は、Mavenからの出力を含むターゲットディレクトリをDockerのビルドコンテキストから除外します。 ファイルを慎重に構成 .dockerignoreする理由はたくさんあります が、今のところはこの単純なファイルで十分です。

では、このビルドコンテキストとは何であり、なぜそれが不可欠なのでしょうか。 このコマンドは、 docker build と Dockerfile からcontext Docker イメージをビルドします。 このコンテキストは、指定した PATHURL または URL にあるファイルのセットです 。ビルド プロセスでは、これらのファイルを参照できます。

一方、コンパイルコンテキストは開発者が作業する場所です。 これは、Mac、Windows、またはLinuxディレクトリ上のフォルダである可能性があります。 このディレクトリには、ソースコード、構成ファイル、ライブラリ、プラグインなど、必要なすべてのアプリケーションコンポーネントが含まれています。 この .dockerignore ファイルを使用すると、新しいイメージのビルド中に除外するソースコード、構成ファイル、ライブラリ、プラグインなどの次の要素のどれを決定できます。

ドッカーイメージの構築

最初の Docker イメージを作成しましょう。

 docker build --tag petclinic-app . 

ビルド プロセスが完了したら、次のコマンドを実行してイメージを一覧表示できます。

 $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE petclinic-app latest 76cb88b61d39 About an hour ago 559MB eclipse-temurin 17-jdk-jammy 0bc7a4cbe8fe 5 weeks ago 455MB 

マルチステージ ビルドでは、Docker ビルドでコンパイル、パッケージ化、単体テストに 1 つの基本イメージを使用できます。 別のイメージがアプリケーション ランタイムを保持します。 これにより、最終的なイメージがより安全でサイズが小さくなります(開発ツールやデバッグツールが含まれていないため)。

多段 Dockerビルドは、ビルドが100%再現可能で、可能な限り無駄がないことを保証するための優れた方法です。 内に Dockerfile 複数のステージを作成し 、そのイメージの構築方法を制御できます。

スプリングブーツは 「太った瓶」 をデフォルトのパッケージ形式として使用します。 ファットJARを調べると、アプリケーションがJAR全体のごく一部であることがわかります。 この部分は最も頻繁に変更されます。 残りの部分には、Spring フレームワークの依存関係が含まれています。 最適化には、通常、アプリケーションを Spring Framework の依存関係とは別のレイヤーに分離することが含まれます。 ファットJARの大部分を形成する依存関係レイヤーを一度ダウンロードするだけで済みます。 また、ホスト システムにもキャッシュされます。

最初の段階では、  ターゲット 太ったJARを構築しています。 第 2 段階では、抽出された依存関係をコピーして JAR を実行します。

 FROM eclipse-temurin:17-jdk-jammy as base WORKDIR /app COPY .mvn/ .mvn COPY mvnw pom.xml ./ RUN ./mvnw dependency:resolve COPY src ./src FROM base as development CMD ["./mvnw", "spring-boot:run", "-Dspring-boot.run.profiles=mysql", "-Dspring-boot.run.jvmArguments='-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8000'"] FROM base as build RUN ./mvnw package FROM eclipse-temurin:17-jre-jammy as production EXPOSE 8080 COPY --from=build /app/target/spring-petclinic-*.jar /spring-petclinic.jar CMD ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/spring-petclinic.jar"] 

最初の画像 eclipse-temurin:17-jdk-jammy には というラベルが付けられ baseています。 これは、他のビルドステージでこのビルドステージを参照するのに役立ちます。 次に、というラベル developmentの付いた新しいステージを追加しました。このステージは、後で Docker Compose を記述するときに活用します。

これが Dockerfile 2 つのステージに分割されていることに注意してください。後者の層にはアプリケーションのビルド構成とソース・コードが含まれ、前の層には完全な Eclipse JDK イメージ自体が含まれます。この小さな最適化により、ターゲットディレクトリをDockerイメージ(ビルドに使用される一時的なものであっても)にコピーする必要もなくなります。最終的なイメージは、第 1 段階のビルドのサイズが 567 MB であるのに対し、わずか 318 MB です。

それでは、イメージを再構築し、開発ビルドを実行しましょう。 を実行します ドッカービルド 上記のコマンドですが、今回は --target development フラグを立てて、具体的に development ビルドステージ。

 docker build -t petclinic-app --target development . 
docker images REPOSITORY TAG IMAGE ID CREATED SIZE petclinic-app latest 05a13ed412e0 About an hour ago 313MB

Docker 作成を使用してローカルで開発する

このセクションでは、1 つのコマンドで PetClinic と MySQL データベース サーバーを起動するための Docker 作成ファイルを作成します。

Docker 作成ファイルでサービスを定義する方法を次に示します。

 services: petclinic: build: context: . dockerfile: Dockerfile target: development ports: - 8000:8000 - 8080:8080 environment: - SERVER_PORT=8080 - MYSQL_URL=jdbc:mysql://mysqlserver/petclinic volumes: - ./:/app depends_on: - mysqlserver mysqlserver: image: mysql/mysql-server:8.0 ports: - 3306:3306 environment: - MYSQL_ROOT_PASSWORD= - MYSQL_ALLOW_EMPTY_PASSWORD=true - MYSQL_USER=petclinic - MYSQL_PASSWORD=petclinic - MYSQL_DATABASE=petclinic volumes: - mysql_data:/var/lib/mysql - mysql_config:/etc/mysql/conf.d volumes: mysql_data: mysql_config:

リポジトリのクローンを作成するか、 ヤムル ファイルから直接 ここは。

このComposeファイルは、渡すためにすべてのパラメーターを入力する必要がないため、非常に便利です。 ドッカー実行 命令。 Composeファイルを使用して宣言的にそれを行うことができます。

作成ファイルを使用するもう1つの優れた利点は、DNSを設定したことです 解決 当社のサービス名を使用するため。 その結果、 mysqlserver 接続文字列に含めます。 以来使用 mysqlserver しています それが私たちが私たちの名前を付けた方法です MySQL 作成ファイル内のサービス。

それでは、アプリケーションを起動して、正しく実行されていることを確認しましょう。

 docker compose up -d --build 

私たちは合格します --build フラグを立てて、Dockerがイメージをコンパイルし、コンテナを起動するようにします。 これが成功した場合、ターミナル出力は以下のようになります。

スクリーンショット 2022 08 02 で 12.29. 43午後

次に、API エンドポイントをテストしましょう。 以下を実行します curl コマンド:

$ curl --request GET \ --url http://localhost:8080/vets \ --header 'content-type: application/json' 

次の応答が表示されます。

 { "vetList": [ { "id": 1, "firstName": "James", "lastName": "Carter", "specialties": [], "nrOfSpecialties": 0, "new": false }, { "id": 2, "firstName": "Helen", "lastName": "Leary", "specialties": [ { "id": 1, "name": "radiology", "new": false } ], "nrOfSpecialties": 1, "new": false }, { "id": 3, "firstName": "Linda", "lastName": "Douglas", "specialties": [ { "id": 3, "name": "dentistry", "new": false }, { "id": 2, "name": "surgery", "new": false } ], "nrOfSpecialties": 2, "new": false }, { "id": 4, "firstName": "Rafael", "lastName": "Ortega", "specialties": [ { "id": 2, "name": "surgery", "new": false } ], "nrOfSpecialties": 1, "new": false }, { "id": 5, "firstName": "Henry", "lastName": "Stevens", "specialties": [ { "id": 1, "name": "radiology", "new": false } ], "nrOfSpecialties": 1, "new": false }, { "id": 6, "firstName": "Sharon", "lastName": "Jenkins", "specialties": [], "nrOfSpecialties": 0, "new": false } ] }

画像5

結論

万丈!Docker を使用して PetClinic アプリケーションをコンテナー化する方法を学習しました。 マルチステージ ビルドを使用すると、最終的な Docker イメージのサイズを簡単に最小化し、実行時のパフォーマンスを向上させることができます。 単一の YAML ファイルを使用して、Docker Compose を使用して PetClinic アプリを数秒で簡単にビルドしてデプロイする方法を示しました 。いくつかの追加手順を実行するだけで、このチュートリアルを適用しながら、はるかに複雑なアプリケーションを構築できます。

ハッピーコーディング。

参照