Docker を使用した Spring Boot アプリケーションのコンテナ化

Docker を使用した Spring Boot アプリケーションのコンテナ化

Spring Boot アプリケーションを Docker 化する場合、スムーズで効率的なデプロイメントを実現するためには、ベスト プラクティスに従うことが重要です。この記事では、これらのプラクティスを詳しく説明し、Docker 化プロセスを簡素化するのに役立つコード例を示します。

1 適切なベースイメージを選択する

Spring Boot アプリケーションに適切なベースイメージを選択することは非常に重要です。互換性と効率性を確保するために、Java バージョンと一致する OpenJDK ベース イメージを選択します。以下は OpenJDK 11 を使用したサンプル コード スニペットです。

 FROM openjdk:11 COPY target/my-application.jar app.jar ENTRYPOINT ["java", "-jar", "/app.jar"]

2. 合理化されたイメージを構築する

転送を高速化し、ストレージ要件を削減し、コンテナの起動を高速化するために、Docker イメージを可能な限り小さく保ちます。これを実現するには、マルチステージビルドを使用します。次に例を示します。

 # 第一阶段:构建应用程序FROM maven:3.8.3-jdk-11 AS build COPY . /app WORKDIR /app RUN mvn package -DskipTests # 第二阶段:创建精简镜像FROM openjdk:11-jre-slim COPY --from=build /app/target/my-application.jar /app.jar ENTRYPOINT ["java", "-jar", "/app.jar"]

3 環境変数の使用

環境変数を使用して、Docker イメージを再構築せずに Spring Boot アプリケーションを動的に構成します。次の例では、プロファイルをアクティブにする環境変数を設定します。

 FROM openjdk:11 ENV SPRING_PROFILES_ACTIVE=production COPY target/my-application.jar app.jar ENTRYPOINT ["java", "-jar", "/app.jar"]

4 Docker Compose を使用したサービスの定義

Docker Compose を使用してアプリケーションのサービスと依存関係を定義し、管理と展開のプロセスを簡素化します。次の例は、Spring Boot アプリケーションと MySQL データベースを定義する方法を示しています。

 version: '3' services: db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: my-secret-pw MYSQL_DATABASE: my-database volumes: - db_data:/var/lib/mysql web: build: . ports: - "8080:8080" environment: SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/my-database SPRING_DATASOURCE_USERNAME: root SPRING_DATASOURCE_PASSWORD: my-secret-pw volumes: db_data:

5 リバースプロキシの使用

リバース プロキシを使用して着信トラフィックを管理することで、アプリケーションのスケーラビリティ、セキュリティ、負荷分散を強化します。以下は、Docker Compose 環境で Nginx をリバース プロキシとして使用する例です。

 version: '3' services: web: build: . environment: SPRING_PROFILES_ACTIVE: production ports: - "8080:8080" proxy: image: nginx ports: - "80:80" volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro depends_on: - web

6 ヘルスチェックによる監視

ヘルスチェックを実装してアプリケーションの正常性を確保し、アプリケーションの状態に基づいて自動的に回復またはスケーリングします。次のように Docker イメージにヘルスチェックを追加します。

 FROM openjdk:11 COPY target/my-application.jar app.jar HEALTHCHECK --interval=5s \ --timeout=3s \ CMD curl -f http://localhost:8080/actuator/health || exit 1 ENTRYPOINT ["java", "-jar", "/app.jar"]

7. Docker Cache による最適化

Docker キャッシュを使用すると、イメージの構築を高速化できます。マルチステージビルドと依存関係のキャッシュにより、ビルド時間を大幅に短縮できます。次に例を示します。

 FROM openjdk:11 as builder WORKDIR /app COPY pom.xml . RUN mvn dependency:go-offline COPY src/ ./src/ RUN mvn package -DskipTests FROM openjdk:11 COPY --from=builder /app/target/my-application.jar app.jar ENTRYPOINT ["java", "-jar", "/app.jar"]

8 .dockerignore ファイルの使用

.dockerignore ファイルを使用して、Docker ビルド コンテキストから不要なファイルとディレクトリを除外し、ビルドのパフォーマンスとセキュリティを向上させます。

 # 忽略根目录下的所有文件* # 包含src 目录!src/ # 包含pom.xml 文件!pom.xml # 排除target 目录及其内容target/

9. タグを使用してメタデータを追加する

メタデータ タグを追加することで、Docker イメージの使いやすさと保守性を向上させます。これらのタグは、バージョンやメンテナーなど、イメージに関する情報を提供します。次に例を示します。

 FROM openjdk:11 LABEL maintainer="John Doe <[email protected]>" LABEL versinotallow="1.0" LABEL descriptinotallow="My Spring Boot application" COPY target/my-application.jar app.jar ENTRYPOINT ["java", "-jar", "/app.jar"]

10. コンテナオーケストレーションを採用する

実稼働環境では、Kubernetes や Docker Swarm などのコンテナ オーケストレーション ツールを使用します。これらのツールは、展開、スケーリング、管理を自動化し、高い可用性とスケーラビリティを保証します。以下は、Kubernetes デプロイメント ファイルのサンプル スニペットです。

 apiVersion: apps/v1 kind: Deployment metadata: name: my-application labels: app: my-application spec: replicas: 3 selector: matchLabels: app: my-application template: metadata: labels: app: my-application spec: containers: - name: my-application image: my-registry/my-application:1.0 ports: - containerPort: 8080

要約すると、これらのベスト プラクティスに従うことで、Spring Boot アプリケーションの Docker 化のプロセスが大幅に簡素化され、開発者は Docker を最大限に活用して、さまざまなプラットフォームへの展開を容易にできるようになります。

<<:  クラウドネイティブなデータガバナンスソリューションを設計する方法

>>:  Didi の弾力性のあるクラウド ハイブリッド展開の実装に関する 10,000 語の説明

推薦する

推奨事項: AS フォーラムが設立されました。ぜひご参加ください。

みなさんこんにちは。HostCatは設立されてから2年以上経ち、多くの忠実なネットユーザーから支持を...

[ハイライトレビュー] 華南 CIO 同窓会活動シリーズ - Kingsoft オフィス訪問

2021年7月23日、CIO TimesとKingsoft Officeが共同で主催し、珠海CIO協...

夏のタレントショーで成功するマーケティング戦略

夏はタレントショーのピークシーズンです。ユーザーの注目を集めるために、さまざまなラジオ局がさまざまな...

ディメンションデータ、2019年のテクノロジートレンド予測を発表

ディメンションデータの最新レポートは、顧客体験、サイバーセキュリティ、デジタル開発、将来の技術動向に...

ウェブサイトのコンテンツシステムを構築する鍵は、コンテンツの価値とウェブマスターの粘り強さにあります。

土曜日、私は朝早くからウェブサイトのコンテンツについての記事を書きたいと思いました。なぜなら、私のウ...

エッジコンピューティングが効率性を向上させ、5Gを実現する方法

[[434783]]エッジ コンピューティングにより、コンピューティングと処理能力がエンド ユーザー...

OpenStack の運用と保守は不可欠です。 Ketong Cloudの2つのサービスモードが保証されています

技術の観点から見ると、クラウドコンピューティングは主にIaaS、PaaS、SaaSに分けられます。 ...

ソーシャルネットワークでマーケティングするのに最適な時期

ソーシャル ネットワークが人々の生活の中でますます大きな部分を占めるようになるにつれ、企業はソーシャ...

ソフトウェア定義ネットワーク (SDN): ネットワークの未来?

従来のネットワーク アプローチでは、ネットワーク トラフィックの構成、管理、および誘導にハードウェア...

name.com イベント: .com/.net ドメイン名を 8 ドルで移管 (ドメイン名の 1 年間の更新に相当)

name.com ドメイン名の価格はほとんど変化しておらず、プロモーション活動もほとんど行われていま...

地域人材ネットワークの運用戦略をマーケティングの観点から分析する

ローカル人材ネットワークとこれらの総合的な大規模人材ウェブサイトは相互補完関係を形成しています。ロー...

推奨: UltraVPS-3 Euro/Xen/1g RAM/30g HDD/1T トラフィック

1G メモリを搭載した XEN VPS に月額 3 ユーロを支払うことについてどう思いますか?実は税...

ウェブサイトの種類に応じて更新戦略を立てる方法

多くのウェブマスターは、日々の業務を外部リンクに集中させ、ウェブサイトのコンテンツ更新戦略を無視して...

ネットワークプロモーションをうまく行うには、まず考え方を変える必要があります

ウェブマスターの皆さん、こんにちは。私は葉凡喜です。この仕事をしばらく続けていて、今まで経験したこと...

シングルページウェブサイトのSEO最適化ランキングの秘密ウェブサイトシングルページSEO最適化3つの主要戦略

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています1. シン...