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 語の説明

推薦する

中学卒の男性が海賊版の高画質大ヒット映画を販売するウェブサイトを立ち上げ、売り上げは数千万本に達した。

中国江蘇ネットは5月12日、大ヒット作の公開後、映画館で映画を観るのが嫌いなファンにとっては、オンラ...

ウェブサイトのホームページへの大規模な調整がBaiduにどのように適応できるかを分析する

こんにちは、私は最近、私のウェブサイトのランキングが何度も衰退しています。あまりにも変わらないことが...

Amazon Elasticsearch Service の紹介

Amazon Elasticsearch Service を使用すると、ログ分析、全文検索、アプリケ...

SaaS の将来は人工知能とどのような関係があるのでしょうか?

人工知能は人気が高まっており、つい最近までは単なる新興トレンドに過ぎませんでしたが、現在ではこの技術...

中秋節ブランドマーケティングプロモーションルーチン!

中国の四大伝統祭りの一つである中秋節は、昔から中国文化を継承する良い日とされてきました。もちろん、フ...

中国のレンタカーウェブサイトのトラフィックシェアによるトップ10ランキング

ヒットワイズは3月4日、公式Weiboアカウントを通じて、中国レンタカーサイトのトラフィックシェア上...

Kubernetes ネットワーク プラグインの詳細な説明 - Calico の章 - 概要

1. コンテナネットワークと戦略Kubernetes 自体はコンテナ ネットワークを実装していませ...

コレクション: 動的 IP 付き VPS、動的 IP VPS、切り替え可能な IP

香港のダイナミック IP VPS、台湾のダイナミック IP VPS、米国のダイナミック IP VPS...

母子ウェブサイトの発展の軌跡の簡単な分析

中国では、母子関係のウェブサイトは昔から非常に有望な営利サイトでした。当然、競争は次第に激しくなり、...

意味のない爽快なPVはただのフーリガン行為

エクスペリエンスとは何でしょうか? インターネット ユーザーなら誰でも、心の中で定義を持っています。...

ソーシャルマーケティングはソーシャルメディアに頼るだけでなく、適切な方法で行う必要がある

ソーシャル戦略は、B2B マーケティングのあらゆる側面に反映される必要があります。これまで、企業がソ...

SEO実践者の将来のキャリア開発の方向性と計画について

多くの人にとって、SEO は比較的簡単なスキルです。コンテンツ + 外部リンクで、基本的に SEO ...

JVM の新世代と旧世代のデフォルトの比率は本当に 1:2 ですか?

[[392981]]画像はPexelsより[51CTO.com オリジナル記事]業界の一般的な認識は...

WeChatマーケティングプロモーションに関する意見

この間、私はWeChatマーケティングを行ってきました。実はまだ全体のレベルに達していないため、マー...

ウェブサイトのコンバージョン率を向上させるにはどうすればいいですか?

最近、Feng Cai Yi Yangは、ウェブサイトにトラフィックをもたらすだけでは十分ではないこ...