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

推薦する

30近くのリベートサイトが次々と崩壊:電子商取引がねずみ講に変貌

「500円使えば500円戻ってくる」「買えば買うほど戻ってくる、ボーナスも続く」…これらの宣伝文句は...

WeChatパブリックアカウントの記事がBaiduに掲載されることがSEOに与える影響

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

クラウドコンピューティング仮想化の典型的な構造とアクセスアプリケーションモード

クラウド コンピューティングでは、コンピューティング リソース、ストレージ リソース、ネットワーク通...

相互プロモーション、インターネット実践者はどうしてそれを忘れることができるでしょうか!

相互プロモーションとは、単にお互いにプロモーションを手伝うことを意味します。 Baidu で相互プロ...

hostodo-ロサンゼルス KVM 仮想 VPS 簡易評価/QN コンピュータルーム

私は、hostodo.com の VPS を最初に使用したユーザーの 1 人です。hostodo に...

アンカーポイント、キーワード密度、フレンドリーリンクを調整して、Baidu の難しさを克服しましょう

みなさん、こんにちは。ハルビン仮想現実ウェブサイト設計です。最近、私は百度と格闘しており、6月の必読...

SEO ブラックハットがウェブサイトを破壊する方法についての Black Weapon のジョークをご覧ください

SEO が夜更かしや忙しさと同義語である場合。著者は、SEO を楽しみとして捉えることを好みます。S...

bandwagonhost-ロサンゼルスの新データセンター、VPS年間支払い3.99ドル、4つのデータセンター

朗報です。bandwagonhost は米国西海岸のロサンゼルス デジタル センターに移転しました。...

インターネットプロモーションのためのフォーラムプロモーションスキル(I)

今日もまた水曜日です。今日は皆さんが外部リンクをもう少し増やし、Baidu スパイダーに自分のウェブ...

業界のウェブサイトを構築するのは簡単ですが、維持するのは困難です。

この記事は、私が1年間業界ウェブサイトを運営してきた経験についてのみ書いています。私は失敗者なので、...

百度ホームページでトップ3にランクインするのは夢ではない

ウェブサイトのランキングは長期的な課題です。Baidu のホームページにランクインしているウェブサイ...

#黒5#: bluehost: 月額2.95ドルから、世界で最も人気のある仮想ホスティングブランド

Bluehost はおそらく、世界で最も人気があり (ユーザー数が多い)、よく知られている Web ...

マルチクラウドアーキテクチャ:マルチクラウド環境のシームレスな統合を実現

今日の情報化時代において、クラウドコンピューティングは企業や組織にとって欠かせない技術サポートとなり...

ミクシューアイスシティ「制御不能」

1997年の3平方メートルの「寒流かき氷」から20年以上後の「万店王」まで、沈没市場の神であるミック...

JD Zhilian Cloudテクノロジーにより、海馬汽車は「車輪上のスマートライフ」を共同で構築

ある車が時速 60 キロメートルで道路を走行しているときに、突然「幽霊が飛び出す」現象 (つまり、車...